#include #include #include #include #include #include size_t static write_data(void *buffer, size_t size, size_t nmemb, void *userp) { memcpy(userp, buffer, nmemb*size); return 0; } void print_usage() { printf("USAGE: clainsafecli [--tor|--i2p] [--server] file\n"); return; } void print_help() { printf("--server : specifies the lainsafe server\n%s\n%s\n%s", "--tor: uses tor", "--help: print this message\n", "--i2p: uses i2p HTTP proxy" ); return; } int main(int argc, char **argv) { struct curl_httppost *post = NULL; struct curl_httppost *last = NULL; int tor_flag, i2p_flag; tor_flag = i2p_flag = 0; char *buffer = (char *)calloc(1024,sizeof(char)); if(buffer == NULL) { fprintf(stderr,"Error allocating memory!\n"); } char server[256] = "https://lainsafe.kalli.st"; CURL *easy_handle = curl_easy_init(); if(!easy_handle) { fprintf(stderr,"Error initializing libcurl\n"); return -1; } if(argc == optind) { print_usage(); return -1; } int option_index = 0; static struct option long_options[] = { {"server",required_argument,0,'s'}, {"help" ,no_argument ,0,'h'}, {"tor" ,no_argument ,0,'t'}, {"i2p" ,no_argument ,0,'i'}, {0 ,0 ,0, 0 } }; int c = 0; while((c = getopt_long(argc,argv, "htis:", long_options,&option_index)) != -1) { switch(c) { case 's': strncpy(server,optarg,256); break; case 'h': print_help(); return 0; break; case 't': tor_flag = 1; break; case 'i': i2p_flag = 1; break; case '?': print_usage(); return 0; break; default: print_usage(); return 0; break; } } /* curl options */ curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(easy_handle,CURLOPT_WRITEDATA,buffer); curl_easy_setopt(easy_handle,CURLOPT_URL,server); /* Proxy options */ if(tor_flag && i2p_flag) { fprintf(stderr,"Tor and I2P can't be used at once\n"); return -1; } else if(tor_flag) { curl_easy_setopt(easy_handle,CURLOPT_PROXY,"127.0.0.1:9050"); curl_easy_setopt(easy_handle,CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME); } else if(i2p_flag) { curl_easy_setopt(easy_handle,CURLOPT_PROXY,"127.0.0.1:4444"); curl_easy_setopt(easy_handle,CURLOPT_PROXYTYPE, CURLPROXY_HTTP); } /* Form parameters */ /* File name */ curl_formadd(&post,&last, CURLFORM_COPYNAME, "file", CURLFORM_FILE,argv[optind], CURLFORM_END); /* Actual file content */ curl_formadd(&post,&last, CURLFORM_COPYNAME, "file", CURLFORM_COPYCONTENTS,argv[optind], CURLFORM_END); curl_easy_setopt(easy_handle,CURLOPT_HTTPPOST,post); curl_easy_perform(easy_handle); puts(buffer); free(buffer); curl_formfree(post); curl_easy_cleanup(easy_handle); return 0; }