diff --git a/landerctl/include/landerctl.h b/landerctl/include/landerctl.h index 55acf66..fc37649 100644 --- a/landerctl/include/landerctl.h +++ b/landerctl/include/landerctl.h @@ -74,9 +74,17 @@ landerctl_err landerctl_post_short(landerctl_ctx *ctx); landerctl_err landerctl_post_paste(landerctl_ctx *ctx); landerctl_err landerctl_post_file(landerctl_ctx *ctx); +int landerctl_parse_args(landerctl_args *out, int argc, char **argv); + 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_curl_init(landerctl_curl *out); +int landerctl_curl_set_common(landerctl_curl *curl, landerctl_args *args, + const char *key); +int landerctl_curl_perform(landerctl_curl *curl); +int landerctl_curl_inspect(landerctl_curl *curl, landerctl_args *args); +void landerctl_curl_cleanup(landerctl_curl *curl); #endif diff --git a/landerctl/src/commands.c b/landerctl/src/commands.c index 3b91fa4..00b1f29 100644 --- a/landerctl/src/commands.c +++ b/landerctl/src/commands.c @@ -7,120 +7,6 @@ #include "landerctl.h" -int landerctl_curl_init(landerctl_curl *out) { - curl_global_init(CURL_GLOBAL_ALL); - CURL *curl = curl_easy_init(); - - if (curl == NULL) { - fprintf(stderr, "Failed to initialize cURL client.\n"); - - return 8; - } - - out->curl = curl; - out->headers = NULL; - - return 0; -} - -int landerctl_curl_set_common(landerctl_curl *curl, landerctl_args *args, - const char *key) { - size_t url_len = strlen(args->cfg.server_url) + 4; - - if (key != NULL) { - url_len += strlen(key); - } - - char mode_char; - - switch (args->mode) { - case landerctl_mode_short: - mode_char = 's'; - break; - case landerctl_mode_paste: - mode_char = 'p'; - break; - case landerctl_mode_file: - mode_char = 'f'; - break; - // Shouldn't be able to happen - default: - return 10; - } - - char url[url_len + 1]; - - if (key == NULL) { - sprintf(url, "%s/%c%s/", args->cfg.server_url, mode_char, - args->secure ? "l" : ""); - } else { - sprintf(url, "%s/%c%s/%s", args->cfg.server_url, mode_char, - args->secure ? "l" : "", key); - } - - curl_easy_setopt(curl->curl, CURLOPT_URL, url); - - // Add API key header - char api_key_header[strlen(args->cfg.api_key) + 12]; - sprintf(api_key_header, "X-Api-Key: %s", args->cfg.api_key); - - curl->headers = curl_slist_append(curl->headers, api_key_header); - - curl_easy_setopt(curl->curl, CURLOPT_USERAGENT, - "landerctl/" LANDER_VERSION ""); - - if (args->verbose) { - curl_easy_setopt(curl->curl, CURLOPT_VERBOSE, 1L); - } - - curl_easy_setopt(curl->curl, CURLOPT_CAINFO, args->cfg.ca_certs_bundle); - curl_easy_setopt(curl->curl, CURLOPT_ERRORBUFFER, curl->err_msg); - - return 0; -} - -int landerctl_curl_perform(landerctl_curl *curl) { - curl_easy_setopt(curl->curl, CURLOPT_HTTPHEADER, curl->headers); - - int res = curl_easy_perform(curl->curl); - - if (res != CURLE_OK) { - fprintf(stderr, "Libcurl encountered an error (code %i): %s\n", res, - curl->err_msg); - } - - return res; -} - -int landerctl_curl_inspect(landerctl_curl *curl, landerctl_args *args) { - long response_code; - curl_easy_getinfo(curl->curl, CURLINFO_RESPONSE_CODE, &response_code); - - if (response_code < 200 || response_code > 299) { - fprintf(stderr, "HTTP status code %li\n", response_code); - - return 3; - } else { - struct curl_header *location_header; - - if (curl_easy_header(curl->curl, "Location", 0, CURLH_HEADER, -1, - &location_header) == CURLHE_OK) { - printf("%s%s\n", args->cfg.server_url, location_header->value); - } else { - fprintf(stderr, "Server returned a 2xx without a Location header.\n"); - - return 5; - } - } - - return 0; -} - -void landerctl_curl_cleanup(landerctl_curl *curl) { - curl_easy_cleanup(curl->curl); - curl_slist_free_all(curl->headers); -} - int landerctl_cmd_short(landerctl_args *args) { // TODO argument count check int res; diff --git a/landerctl/src/commands_common.c b/landerctl/src/commands_common.c new file mode 100644 index 0000000..e735aa7 --- /dev/null +++ b/landerctl/src/commands_common.c @@ -0,0 +1,122 @@ +#include +#include +#include + +#include +#include + +#include "landerctl.h" + +int landerctl_curl_init(landerctl_curl *out) { + curl_global_init(CURL_GLOBAL_ALL); + CURL *curl = curl_easy_init(); + + if (curl == NULL) { + fprintf(stderr, "Failed to initialize cURL client.\n"); + + return 8; + } + + out->curl = curl; + out->headers = NULL; + + return 0; +} + +int landerctl_curl_set_common(landerctl_curl *curl, landerctl_args *args, + const char *key) { + size_t url_len = strlen(args->cfg.server_url) + 4; + + if (key != NULL) { + url_len += strlen(key); + } + + char mode_char; + + switch (args->mode) { + case landerctl_mode_short: + mode_char = 's'; + break; + case landerctl_mode_paste: + mode_char = 'p'; + break; + case landerctl_mode_file: + mode_char = 'f'; + break; + // Shouldn't be able to happen + default: + return 10; + } + + char url[url_len + 1]; + + if (key == NULL) { + sprintf(url, "%s/%c%s/", args->cfg.server_url, mode_char, + args->secure ? "l" : ""); + } else { + sprintf(url, "%s/%c%s/%s", args->cfg.server_url, mode_char, + args->secure ? "l" : "", key); + } + + curl_easy_setopt(curl->curl, CURLOPT_URL, url); + + // Add API key header + char api_key_header[strlen(args->cfg.api_key) + 12]; + sprintf(api_key_header, "X-Api-Key: %s", args->cfg.api_key); + + curl->headers = curl_slist_append(curl->headers, api_key_header); + + curl_easy_setopt(curl->curl, CURLOPT_USERAGENT, + "landerctl/" LANDER_VERSION ""); + + if (args->verbose) { + curl_easy_setopt(curl->curl, CURLOPT_VERBOSE, 1L); + } + + curl_easy_setopt(curl->curl, CURLOPT_CAINFO, args->cfg.ca_certs_bundle); + curl_easy_setopt(curl->curl, CURLOPT_ERRORBUFFER, curl->err_msg); + + return 0; +} + +int landerctl_curl_perform(landerctl_curl *curl) { + curl_easy_setopt(curl->curl, CURLOPT_HTTPHEADER, curl->headers); + + int res = curl_easy_perform(curl->curl); + + if (res != CURLE_OK) { + fprintf(stderr, "Libcurl encountered an error (code %i): %s\n", res, + curl->err_msg); + } + + return res; +} + +int landerctl_curl_inspect(landerctl_curl *curl, landerctl_args *args) { + long response_code; + curl_easy_getinfo(curl->curl, CURLINFO_RESPONSE_CODE, &response_code); + + if (response_code < 200 || response_code > 299) { + fprintf(stderr, "HTTP status code %li\n", response_code); + + return 3; + } else { + struct curl_header *location_header; + + if (curl_easy_header(curl->curl, "Location", 0, CURLH_HEADER, -1, + &location_header) == CURLHE_OK) { + printf("%s%s\n", args->cfg.server_url, location_header->value); + } else { + fprintf(stderr, "Server returned a 2xx without a Location header.\n"); + + return 5; + } + } + + return 0; +} + +void landerctl_curl_cleanup(landerctl_curl *curl) { + curl_easy_cleanup(curl->curl); + curl_slist_free_all(curl->headers); +}