int main(int argc, char **argv) { int i; loop = uv_default_loop(); if (curl_global_init(CURL_GLOBAL_ALL)) { fprintf(stderr, "Could not init cURL\n"); return 1; } uv_timer_init(loop, &timeout); curl_handle = curl_multi_init(); curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket); curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout); char upstream[128]; memset(upstream,0,128); snprintf(upstream,128,"%d:%s:%d",i,"upstream",i+1); add_download(upstream,strlen(upstream)); uv_run(loop, UV_RUN_DEFAULT); curl_multi_cleanup(curl_handle); return 0; }
int main(int argc, char **argv) { loop = uv_default_loop(); if (argc <= 1) return 0; if (curl_global_init(CURL_GLOBAL_ALL)) { fprintf(stderr, "Could not init cURL\n"); return 1; } uv_timer_init(loop, &timeout); curl_handle = curl_multi_init(); curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket); curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout); while (argc-- > 1) { add_download(argv[argc], argc); } uv_run(loop, UV_RUN_DEFAULT); curl_multi_cleanup(curl_handle); return 0; }
void curl_perform_wait() { long timeout_ms = -1; CURLMcode result = curl_multi_timeout(curl_handle, &timeout_ms); if (result != CURLM_OK) log_error("curl_multi_timeout error %d", result); if (timeout_ms < 1) timeout_ms = 1; int numfds = 0; result = curl_multi_wait(curl_handle, NULL, 0, (int)timeout_ms, &numfds); if (result != CURLM_OK) log_error("curl_multi_wait error %d", result); int numrunning = 0; result = curl_multi_perform(curl_handle, &numrunning); if (result != CURLM_OK) log_error("curl_multi_perform error %d", result); int pending = 0; CURLMsg *message; while ((message = curl_multi_info_read(curl_handle, &pending))) { switch (message->msg) { case CURLMSG_DONE: { const char* done_url; CURL* easy = message->easy_handle; curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &done_url); CURLcode code = message->data.result; printf("%s DONE\ncode:%d - %s\n", done_url, code, curl_easy_strerror(code)); struct curl_slist* list; curl_easy_getinfo(easy, CURLINFO_PRIVATE, &list); --remaining; if (--repeats) { add_download(done_url); } curl_multi_remove_handle(curl_handle, easy); curl_easy_cleanup(easy); curl_slist_free_all(list); break; } default: log_error("CURLMSG default\n"); abort(); } } if (remaining == 0) { curl_multi_cleanup(curl_handle); exit(0); } }
void curl_perform_action(int socket, int actions) { int running_handles; char *done_url; CURLMsg *message; int pending; curl_multi_socket_action(curl_handle, socket, actions, &running_handles); while ((message = curl_multi_info_read(curl_handle, &pending))) { switch (message->msg) { case CURLMSG_DONE: { CURL* easy = message->easy_handle; curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &done_url); curl_handle_context_s* context = NULL; curl_easy_getinfo(easy, CURLINFO_PRIVATE, &context); CURLcode code = message->data.result; printf("%s DONE\ncode:%d - %s\nremaining:%d\n", done_url, code, curl_easy_strerror(code), --remaining); curl_slist_free_all(context->post_commands); if (--repeats) { const char* full_url = context->full_url; add_download(full_url); } free(context); curl_multi_remove_handle(curl_handle, message->easy_handle); curl_easy_cleanup(message->easy_handle); break; } default: log_error("CURLMSG default\n"); abort(); } } }
int main(int argc, char **argv) { if (argc <= 1) return 0; if (curl_global_init(CURL_GLOBAL_ALL)) { log_error("Could not init cURL\n"); return 1; } curl_handle = curl_multi_init(); while (argc-- > 1) { add_download(argv[argc]); } while(1) curl_perform_wait(); return 0; }
void selection_received(GtkWidget *window, GdkEvent *event) { char *buf; GdkAtom atom; gint format, length; length = gdk_selection_property_get(window->window, (guchar **)&buf, &atom, &format); if(old_clipboard && !strcmp(old_clipboard, buf)) { g_free(buf); } else { char *b = buf; char *c; while(b && (c = strstr(b, "http://"))) { char *p = strpbrk(c, " \t\r\n"); char *url = p ? g_strndup(c, p - c) : g_strdup(c); puts(url); // handle url add_download(url); g_free(url); b = c + 1; } old_clipboard = buf; } }
/* * Function will download a specific file */ int DownloadDirect(char *Name, int Wait) { int rc = 0; int Size; down_list *dl = NULL; if ((Size = file_size(Name)) == -1) { WriteError("No file %s", Name); pout(CFG.HiliteF, CFG.HiliteB, (char *)"File not found"); Enter(2); Pause(); } Syslog('+', "Download direct %s", Name); add_download(&dl, Name, basename(Name), 0, Size, FALSE); WhosDoingWhat(DOWNLOAD, NULL); if ((rc = download(dl))) { /* * Error */ Syslog('+', "Download failed rc=%d", rc); poutCR(LIGHTRED, BLACK, (char *)Language(353)); } else { /* * Update the users record. The file is free, so only statistics. */ ReadExitinfo(); exitinfo.Downloads++; /* Increase download counter */ mib_downloads++; WriteExitinfo(); } if (Wait) Pause(); return rc; }
/*------------------------------------------------------------------------*/ int script_interpreter(char *script, char *line, char *ip, char *iface, char *user, char *pwd) { char cmd[256],p1[256],p2[256]; int end=0; *cmd=0; *p1=0; *p2=0; sscanf(line,"%s %s %s\n",cmd,p1,p2); if (cmd[0]=='#') return 0; if (!strcmp(cmd,"connect")) { char tmp[1024]; sprintf(tmp, "open %s%%%s\n" "user %s %s\n", ip,iface,user,pwd); strcat(script,tmp); } else if (!strcmp(cmd,"upload")) { add_upload(script,p2,p1,p2); } else if (!strcmp(cmd,"download")) { add_download(script,p1,p2); } else if (!strcmp(cmd,"exit")) { strcat(script,"quit\n"); end=1; } else { strcat(script,line); } return end; }
/* * Download files already tagged, called from the menu. */ void Download(void) { FILE *tf, *fd; int rc = 0, i, Count = 0, OldArea; char *local, *temp; int Size = 0, CostSize = 0, dsize; struct _fdbarea *fdb_area = NULL; down_list *dl = NULL, *tmpf; Enter(2); OldArea = iAreaNumber; WhosDoingWhat(DOWNLOAD, NULL); /* * Clean users tag directory. */ temp = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "-rf %s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); execute_pth((char *)"rm", temp, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null"); snprintf(temp, PATH_MAX, "%s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); CheckDir(temp); if ((tf = fopen("taglist", "r+")) == NULL) { Syslog('+', "Download command but no files marked"); /* No files marked for download. */ pout(LIGHTRED, BLACK, (char *) Language(258)); Enter(2); Pause(); return; } local = calloc(PATH_MAX, sizeof(char)); /* Checking your marked downloads, please wait... */ pout(LIGHTMAGENTA, BLACK, (char *) Language(255)); Enter(2); ReadExitinfo(); while (fread(&Tag, sizeof(Tag), 1, tf) == 1) { if (Tag.Active) { SetFileArea(Tag.Area); /* * Check password for selected file FIXME: Where??? */ memset(&fdb, 0, sizeof(fdb)); if ((fdb_area = mbsedb_OpenFDB(Tag.Area, 30)) != NULL) { while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (strcmp(fdb.LName, Tag.LFile) == 0) break; } mbsedb_CloseFDB(fdb_area); } if (strcmp(fdb.LName, Tag.LFile) == 0) { Syslog('b', "Found file %s in area %d", fdb.LName, Tag.Area); if (fdb.Deleted) { /* Sorry that file is unavailable for download */ snprintf(temp, 81, "%s (%s)", (char *) Language(248), fdb.LName); poutCR(CFG.HiliteF, CFG.HiliteB, temp); Tag.Active = FALSE; Syslog('+', "File %s in area %d unavailable for download, deleted", fdb.LName, Tag.Area); } } if (Tag.Active) { /* * Create/Append file description list while we're * busy checking. If the users doesn't want it we * can unlink it aftwerwards. We also insert CR * characters to please the poor DOS (M$oft) users. */ snprintf(local, PATH_MAX, "./tag/filedesc.%d", exitinfo.Downloads % 256); if ((fd = fopen(local, "a")) != NULL) { fprintf(fd, "%s (%s)\r\n", fdb.LName, fdb.Name); for (i = 0; i < 25; i++) { if (strlen(fdb.Desc[i]) > 1) fprintf(fd, " %s\r\n", fdb.Desc[i]); } fprintf(fd, "\r\n"); fclose(fd); Syslog('b', "Added info to %s", local); } else { WriteError("Can't add info to %s", local); } snprintf(local, PATH_MAX, "%s/%s", sAreaPath, Tag.LFile); add_download(&dl, local, Tag.LFile, Tag.Area, fdb.Size, FALSE); Home(); } if (!Tag.Active) { /* * Update the download active flag in the * taglist */ fseek(tf, - sizeof(Tag), SEEK_CUR); fwrite(&Tag, sizeof(Tag), 1, tf); Syslog('b', "Download file %s marked inactive in taglist", Tag.LFile); } else { /* * Count file and sizes. */ Count++; Size += fdb.Size; if (!area.Free) CostSize += fdb.Size; } } } fclose(tf); /* * If anything left to download... */ if (!Count) { SetFileArea(OldArea); unlink("taglist"); /* No files marked for download */ pout(LIGHTRED, BLACK, (char *) Language(258)); Enter(2); Pause(); free(temp); free(local); tidy_download(&dl); Syslog('+', "No files left to download"); return; } /* * Add descriptions file to the queue. */ snprintf(local, PATH_MAX, "%s/%s/tag/filedesc.%d", CFG.bbs_usersdir, exitinfo.Name, exitinfo.Downloads % 256); dsize = file_size(local); snprintf(temp, PATH_MAX, "filedesc.%d", exitinfo.Downloads % 256); add_download(&dl, local, temp, 0, dsize, TRUE); free(local); /* You have */ /* files( */ /* bytes) marked for download */ snprintf(temp, PATH_MAX, "%s %d %s%d %s", (char *) Language(249), Count, (char *) Language(280), Size, (char *) Language(281)); pout(YELLOW, BLACK, temp); Enter(2); if (!CheckBytesAvailable(CostSize)) { SetFileArea(OldArea); free(temp); tidy_download(&dl); return; } Pause(); if ((rc = download(dl))) { /* * Download error */ Syslog('+', "Download error rc=%d", rc); free(temp); tidy_download(&dl); return; } /* * Checking the successfull sent files, they are missing from * the ./tag directory. Failed files are still there. */ PUTCHAR('\r'); /* Updating download counters, please wait ... */ pout(LIGHTCYAN, BLACK, (char *) Language(352)); Count = Size = 0; /* * Update downloadcounters, don't log anything because the state * of sucessfull sent files is already logged by the download * function. */ if ((tf = fopen("taglist", "r+")) != NULL) { while (fread(&Tag, sizeof(Tag), 1, tf) == 1) { PUTCHAR('.'); if (Tag.Active) { for (tmpf = dl; tmpf; tmpf = tmpf->next) { if (strcmp(tmpf->remote, Tag.LFile) == 0) { if (tmpf->sent) { Tag.Active = FALSE; fseek(tf, - sizeof(Tag), SEEK_CUR); fwrite(&Tag, sizeof(Tag), 1, tf); /* * Update the download counter and the last download date. */ SetFileArea(Tag.Area); if ((fdb_area = mbsedb_OpenFDB(Tag.Area, 30))) { while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (strcmp(fdb.LName, Tag.LFile) == 0) break; } Size += fdb.Size; fdb.TimesDL++; fdb.LastDL = time(NULL); if (mbsedb_LockFDB(fdb_area, 30)) { fseek(fdb_area->fp, - fdbhdr.recsize, SEEK_CUR); fwrite(&fdb, fdbhdr.recsize, 1, fdb_area->fp); mbsedb_UnlockFDB(fdb_area); } mbsedb_CloseFDB(fdb_area); Count++; } } break; } } } } fclose(tf); } Enter(2); /* * Update the users record. */ ReadExitinfo(); exitinfo.Downloads += Count; /* Increase download counter */ mib_downloads += Count; exitinfo.DownloadK += (Size / 1024); /* Increase amount download today */ mib_kbdownload += (Size / 1024); /* * Minus the amount downloaded today from downloadktoday * if less than zero, it won't let the user download anymore. */ if (LIMIT.DownK || LIMIT.DownF) { exitinfo.DownloadKToday -= (Size / 1024); } WriteExitinfo(); Pause(); SetFileArea(OldArea); free(temp); tidy_download(&dl); }
extern "C" void download_clicked(GtkObject * object, gpointer user_data) { const gchar *url = gtk_entry_get_text(GTK_ENTRY(gtk_builder_get_object(builder, "url"))); add_download(url); }