feat(landerctl): re-implement paste & file functionality
parent
086ee8900b
commit
8b7ce0085e
|
@ -75,6 +75,8 @@ landerctl_err landerctl_post_paste(landerctl_ctx *ctx);
|
||||||
landerctl_err landerctl_post_file(landerctl_ctx *ctx);
|
landerctl_err landerctl_post_file(landerctl_ctx *ctx);
|
||||||
|
|
||||||
int landerctl_cmd_short(landerctl_args *args);
|
int landerctl_cmd_short(landerctl_args *args);
|
||||||
|
int landerctl_cmd_paste(landerctl_args *args);
|
||||||
|
int landerctl_cmd_file(landerctl_args *args);
|
||||||
int landerctl_parse_args(landerctl_args *out, int argc, char **argv);
|
int landerctl_parse_args(landerctl_args *out, int argc, char **argv);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
|
#include <libgen.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
#include <magic.h>
|
||||||
|
|
||||||
#include "landerctl.h"
|
#include "landerctl.h"
|
||||||
|
|
||||||
|
@ -147,3 +150,112 @@ int landerctl_cmd_short(landerctl_args *args) {
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int landerctl_cmd_paste(landerctl_args *args) {
|
||||||
|
// TODO argument count check
|
||||||
|
int res;
|
||||||
|
landerctl_curl curl;
|
||||||
|
|
||||||
|
if ((res = landerctl_curl_init(&curl))) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *key = args->args.len == 2 ? args->args.arr[1] : NULL;
|
||||||
|
if ((res = landerctl_curl_set_common(&curl, args, key))) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *data_path = args->args.arr[0];
|
||||||
|
FILE *f = fopen(data_path, "rb");
|
||||||
|
|
||||||
|
if (f == NULL) {
|
||||||
|
fprintf(stderr, "Failed to open data file %s\n", args->args.arr[0]);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct stat sb;
|
||||||
|
stat(data_path, &sb);
|
||||||
|
|
||||||
|
curl_easy_setopt(curl.curl, CURLOPT_POST, 1L);
|
||||||
|
curl_easy_setopt(curl.curl, CURLOPT_READDATA, f);
|
||||||
|
curl_easy_setopt(curl.curl, CURLOPT_POSTFIELDSIZE, sb.st_size);
|
||||||
|
|
||||||
|
res = landerctl_curl_perform(&curl);
|
||||||
|
|
||||||
|
if (res == 0) {
|
||||||
|
landerctl_curl_inspect(&curl, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
landerctl_curl_cleanup(&curl);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int landerctl_cmd_file(landerctl_args *args) {
|
||||||
|
// TODO argument count check
|
||||||
|
int res;
|
||||||
|
landerctl_curl curl;
|
||||||
|
|
||||||
|
if ((res = landerctl_curl_init(&curl))) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *key = args->args.len == 2 ? args->args.arr[1] : NULL;
|
||||||
|
if ((res = landerctl_curl_set_common(&curl, args, key))) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *data_path = args->args.arr[0];
|
||||||
|
FILE *f = fopen(data_path, "rb");
|
||||||
|
|
||||||
|
if (f == NULL) {
|
||||||
|
fprintf(stderr, "Failed to open data file %s\n", args->args.arr[0]);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct stat sb;
|
||||||
|
stat(data_path, &sb);
|
||||||
|
|
||||||
|
curl_easy_setopt(curl.curl, CURLOPT_POST, 1L);
|
||||||
|
curl_easy_setopt(curl.curl, CURLOPT_READDATA, f);
|
||||||
|
curl_easy_setopt(curl.curl, CURLOPT_POSTFIELDSIZE_LARGE, sb.st_size);
|
||||||
|
curl_easy_setopt(curl.curl, CURLOPT_NOPROGRESS, 0L);
|
||||||
|
|
||||||
|
magic_t cookie = magic_open(MAGIC_MIME_TYPE);
|
||||||
|
|
||||||
|
if (magic_load(cookie, NULL) == 0) {
|
||||||
|
const char *mime_type = magic_file(cookie, data_path);
|
||||||
|
|
||||||
|
if (mime_type != NULL) {
|
||||||
|
char content_type_header[strlen(mime_type) + 24];
|
||||||
|
sprintf(content_type_header, "X-Lander-Content-Type: %s", mime_type);
|
||||||
|
|
||||||
|
curl.headers = curl_slist_append(curl.headers, content_type_header);
|
||||||
|
} else {
|
||||||
|
printf("Couldn't determine mime type; skipping Content-Type header\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("Couldn't load magic file; skipping Content-Type header\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
char s[strlen(data_path) + 1];
|
||||||
|
strcpy(s, data_path);
|
||||||
|
const char *base_name = basename(s);
|
||||||
|
|
||||||
|
char filename_header[strlen(base_name) + 20];
|
||||||
|
sprintf(filename_header, "X-Lander-Filename: %s", base_name);
|
||||||
|
|
||||||
|
curl.headers = curl_slist_append(curl.headers, filename_header);
|
||||||
|
|
||||||
|
res = landerctl_curl_perform(&curl);
|
||||||
|
|
||||||
|
if (res == 0) {
|
||||||
|
landerctl_curl_inspect(&curl, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
landerctl_curl_cleanup(&curl);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,12 @@ int main(int argc, char **argv) {
|
||||||
case landerctl_mode_short:
|
case landerctl_mode_short:
|
||||||
res = landerctl_cmd_short(&args);
|
res = landerctl_cmd_short(&args);
|
||||||
break;
|
break;
|
||||||
|
case landerctl_mode_paste:
|
||||||
|
res = landerctl_cmd_paste(&args);
|
||||||
|
break;
|
||||||
|
case landerctl_mode_file:
|
||||||
|
res = landerctl_cmd_file(&args);
|
||||||
|
break;
|
||||||
/* case landerctl_mode_paste: */
|
/* case landerctl_mode_paste: */
|
||||||
/* res = landerctl_post_paste(&ctx); */
|
/* res = landerctl_post_paste(&ctx); */
|
||||||
/* break; */
|
/* break; */
|
||||||
|
|
Loading…
Reference in New Issue