· 5 years ago · Aug 12, 2020, 09:00 PM
1e <stdbool.h>
2#include <stdlib.h>
3#include <curl/curl.h>
4
5// 32 byte api key
6// can be found at https://pastebin.com/api#1 while logged in
7#define API_DEV_KEY "85775ec7499f74ab87344ca7ba61c95a"
8
9#include "log.h"
10
11const char *argp_program_version = "pb v0.1";
12const char *argp_program_bug_address = "<kilo@meters.sh>";
13static char doc[] = "Allows you to quickly post files to pastebin";
14static char args_doc[] = "[FILENAME]...";
15static struct argp_option options[] = {
16 { "edit", 'e', 0, 0, "Open a file with $EDITOR in /tmp/ then upload it"},
17 { "filetype", 'f', 0, 0, "Manually set filetype"},
18 { 0 }
19};
20
21struct arguments {
22 char *file;
23 char *filetype;
24 bool use_editor;
25};
26
27static error_t parse_opt(int key, char *arg, struct argp_state *state) {
28 struct arguments *arguments = state->input;
29 switch (key) {
30 case 'e': arguments->use_editor = true; break;
31 case 'f': arguments->filetype = "python"; break;
32 case ARGP_KEY_ARG: arguments->file = arg; break;
33 default: return ARGP_ERR_UNKNOWN;
34 }
35 return 0;
36}
37
38static struct argp argp = { options, parse_opt, args_doc, doc, 0, 0, 0 };
39
40static bool upload_file(FILE *stream, char *filetype) {
41 bool success = true;
42 CURL *curl = curl_easy_init();
43 if (!curl) {
44 log_error("Could not initalize cURL.");
45 return false;
46 }
47
48 // Get file size
49 fseek(stream, 0L, SEEK_END);
50 unsigned long buffer_size = ftell(stream);
51 rewind(stream);
52
53 // Another approach would be to allocate 3*buffer_size+77 which would be the
54 // theoretical maximum size a buffer could be to save a realloc.
55 char *buffer = malloc(sizeof(char) * buffer_size);
56
57 // read whole file into buffer
58 fread(buffer, sizeof(char), buffer_size-1, stream);
59 buffer[buffer_size-1] = '\0';
60
61 char *encoded_buffer = curl_easy_escape(curl, buffer, buffer_size);
62 puts(encoded_buffer);
63 /* puts(encoded_buffer); */
64
65 unsigned long post_data_size = strlen(encoded_buffer) + 512;
66 char *post_data = realloc(encoded_buffer, post_data_size); // (char*) malloc(77 + strlen(url_encoded_data));
67
68 snprintf(post_data, post_data_size, "api_dev_key=" API_DEV_KEY "&api_option=paste&api_paste_format=%s&api_paste_code=%s", filetype, encoded_buffer);
69
70 curl_easy_setopt(curl, CURLOPT_URL, "https://pastebin.com/api/api_post.php");
71 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);
72
73 CURLcode res = curl_easy_perform(curl);
74
75 if (res != CURLE_OK) {
76 log_error("Request to Pastebin's servers failed: %s\n", curl_easy_strerror(res));
77 success = false;
78 }
79
80
81 free(buffer);
82 free(encoded_buffer);
83
84 curl_easy_cleanup(curl);
85 puts(""); // add newline
86
87 return success;
88}
89
90static char *guess_filetype(char *filename) {
91 char c;
92
93 bool in_filetype;
94 char *filetype_buffer = malloc(sizeof(char) * strlen(filename));
95 unsigned int i = 0;
96
97 while ((c = *filename++) != '\0') {
98 if (c == '.') {
99 if (in_filetype) {
100 i = 0;
101 }
102 else {
103 in_filetype = true;
104 }
105 } else if (in_filetype) {
106 filetype_buffer[i] = c;
107 i++;
108 }
109 }
110
111 filetype_buffer[i+1] = '\0';
112
113 if (in_filetype == false) {
114 return NULL;
115 }
116
117 return filetype_buffer;
118}
119
120int main(int argc, char **argv) {
121 struct arguments arguments;
122
123 arguments.file = "";
124 arguments.filetype = "";
125 arguments.use_editor = false;
126
127 argp_parse(&argp, argc, argv, 0, 0, &arguments);
128
129 if (strlen(arguments.file) == 0) {
130 log_error("A file is required.");
131 return 1;
132 }
133
134 char *filetype;
135 if (strlen(arguments.filetype) == 0) {
136 filetype = guess_filetype(arguments.file);
137
138 if (filetype == NULL) {
139 log_warning("Could not guess filetype from filename, defaulting to \"txt\"");
140 filetype = "txt";
141 }
142 }
143
144 FILE *fp = fopen(arguments.file, "r");
145
146 if (fp == NULL) {
147 log_error("Could not find file \"%s\"", arguments.file);
148 return 1;
149 }
150
151 bool res = upload_file(fp, filetype);
152
153 return 0;
154}