static int run(CFArrayRef argv) { int res = 0; int i = 0, doStdin = 0; CFIndex count = CFArrayGetCount(argv); if (count < 2 || count > 3) return -1; char* build = strdup_cfstr(DBGetCurrentBuild()); CFStringRef stdinArg = CFArrayGetValueAtIndex(argv, 0); if(CFEqual(stdinArg, CFSTR("-stdin"))) { i++; doStdin = 1; } char* project = strdup_cfstr(CFArrayGetValueAtIndex(argv, i++)); char* dstroot = strdup_cfstr(CFArrayGetValueAtIndex(argv, i++)); if(doStdin) res = register_files_from_stdin(build, project, dstroot); else res = register_files(build, project, dstroot); free(build); free(project); free(dstroot); return res; }
int main (int argc, char **argv) { char *peerfile; register SVCXPRT *transp; FILE *fd; int i, ret; char tmp[MAXHOSTNAME+2]; pthread_t ireaper; pthread_t qreaper; pthread_t validate_thr; pthread_t trigger_thr; int opt; if (argc < 3 || argc > 8) { usage(argv[0]); return (1); } while ((opt = getopt(argc, argv, "ul:t:")) != -1) { switch (opt) { case 'u': push = 1; break; case 'l': pull = 1; ttrtime = atoi(optarg); break; case 't': trigger = 1; delay = atoi(optarg); break; default: usage(argv[0]); return (1); } } if ( gethostname(localhostname, sizeof(localhost)) != 0) { printf("Unable to get the local hostname ! errno = %d\n", errno); return (1); } peerfile = argv[optind]; sharedir = argv[optind + 1]; printf("peerfile %s sharedir %s\n", peerfile, sharedir); if (!peerfile || strlen(peerfile) == 0 || !sharedir || strlen(sharedir) == 0) { usage(argv[0]); return (1); } #ifdef DEBUG printf("localhostname : %s ttrtime = %d delay = %d\n", localhostname, ttrtime, delay); #endif if (parse_peers(peerfile) != 0) { printf("Failed to parse the peers file. Quitting !\n"); return (1); } /* * Initialize the pending queue mutex. */ pthread_mutex_init(&(qpending.lock), NULL); pthread_mutex_init(&(ipending.lock), NULL); /* * Register the files in the given directory with the index-server. */ if (register_files(localhostname, sharedir) != 0) { printf("Failed to register with the index server on %s\n", argv[2]); printf("Quitting :(\n"); return (1); } /*-------------- start change ----------------*/ /* * Create the reaper_threads for ipending and qpending lists. */ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&qreaper, &attr, reaper_thread, (void *)&qpending); pthread_create(&ireaper, &attr, reaper_thread, (void *)&ipending); if (pull) { pthread_create(&validate_thr, &attr, validate_thread, (void *)&ipending); } if (trigger) { pthread_create(&trigger_thr, &attr, trigger_thread, (void *)&ipending); } /*-------------- end change ----------------*/ pmap_unset (OBTAINPROG, OBTAINVER); transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { fprintf (stderr, "%s", "cannot create udp service."); exit(1); } if (!svc_register(transp, OBTAINPROG, OBTAINVER, obtainprog_1, IPPROTO_UDP)) { fprintf (stderr, "%s", "unable to register (OBTAINPROG, OBTAINVER, udp)."); exit(1); } transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { fprintf (stderr, "%s", "cannot create tcp service."); exit(1); } if (!svc_register(transp, OBTAINPROG, OBTAINVER, obtainprog_1, IPPROTO_TCP)) { fprintf (stderr, "%s", "unable to register (OBTAINPROG, OBTAINVER, tcp)."); exit(1); } printf("Now ready to serve them\n\n"); svc_run (); fprintf (stderr, "%s", "svc_run returned"); exit (1); /* NOTREACHED */ }
int main (int argc, char **argv) { char *peerfile; register SVCXPRT *transp; FILE *fd; int i, ret; char tmp[MAXHOSTNAME+2]; pthread_t reaper; if (argc != 3) { usage(argv[0]); return (1); } if ( gethostname(localhostname, sizeof(localhost)) != 0) { printf("Unable to get the local hostname ! errno = %d\n", errno); return (1); } peerfile = argv[1]; sharedir = argv[2]; if (strlen(peerfile) == 0 || strlen(sharedir) == 0) { usage(argv[0]); return (1); } #ifdef DEBUG printf("localhostname : %s\n", localhostname); #endif if (parse_peers(peerfile) != 0) { printf("Failed to parse the peers file. Quitting !\n"); return (1); } /* * Initialize the pending queue mutex. */ pthread_mutex_init(&(pending.lock), NULL); /* * Create the reaper_thread. */ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&reaper, &attr, reaper_thread, NULL); /* * Register the files in the given directory with the index-server. */ if (register_files(localhostname, sharedir) != 0) { printf("Failed to register with the index server on %s\n", argv[2]); printf("Quitting :(\n"); return (1); } pmap_unset (OBTAINPROG, OBTAINVER); transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { fprintf (stderr, "%s", "cannot create udp service."); exit(1); } if (!svc_register(transp, OBTAINPROG, OBTAINVER, obtainprog_1, IPPROTO_UDP)) { fprintf (stderr, "%s", "unable to register (OBTAINPROG, OBTAINVER, udp)."); exit(1); } transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { fprintf (stderr, "%s", "cannot create tcp service."); exit(1); } if (!svc_register(transp, OBTAINPROG, OBTAINVER, obtainprog_1, IPPROTO_TCP)) { fprintf (stderr, "%s", "unable to register (OBTAINPROG, OBTAINVER, tcp)."); exit(1); } printf("Now ready to serve them\n\n"); svc_run (); fprintf (stderr, "%s", "svc_run returned"); exit (1); /* NOTREACHED */ }
// main(argc, argv) // The main loop! int main(int argc, char *argv[]) { task_t *tracker_task, *listen_task, *t; struct in_addr tracker_addr; int tracker_port; char *s; const char *myalias; struct passwd *pwent; // Default tracker is read.cs.ucla.edu osp2p_sscanf("131.179.80.139:11111", "%I:%d", &tracker_addr, &tracker_port); if ((pwent = getpwuid(getuid()))) { myalias = (const char *) malloc(strlen(pwent->pw_name) + 20); sprintf((char *) myalias, "%s%d", pwent->pw_name, (int) time(NULL)); } else { myalias = (const char *) malloc(40); sprintf((char *) myalias, "osppeer%d", (int) getpid()); } // Ignore broken-pipe signals: if a connection dies, server should not signal(SIGPIPE, SIG_IGN); // Process arguments argprocess: if (argc >= 3 && strcmp(argv[1], "-t") == 0 && (osp2p_sscanf(argv[2], "%I:%d", &tracker_addr, &tracker_port) >= 0 || osp2p_sscanf(argv[2], "%d", &tracker_port) >= 0 || osp2p_sscanf(argv[2], "%I", &tracker_addr) >= 0) && tracker_port > 0 && tracker_port <= 65535) { argc -= 2, argv += 2; goto argprocess; } else if (argc >= 2 && argv[1][0] == '-' && argv[1][1] == 't' && (osp2p_sscanf(argv[1], "-t%I:%d", &tracker_addr, &tracker_port) >= 0 || osp2p_sscanf(argv[1], "-t%d", &tracker_port) >= 0 || osp2p_sscanf(argv[1], "-t%I", &tracker_addr) >= 0) && tracker_port > 0 && tracker_port <= 65535) { --argc, ++argv; goto argprocess; } else if (argc >= 3 && strcmp(argv[1], "-d") == 0) { if (chdir(argv[2]) == -1) die("chdir"); argc -= 2, argv += 2; goto argprocess; } else if (argc >= 2 && argv[1][0] == '-' && argv[1][1] == 'd') { if (chdir(argv[1]+2) == -1) die("chdir"); --argc, ++argv; goto argprocess; } else if (argc >= 3 && strcmp(argv[1], "-b") == 0 && osp2p_sscanf(argv[2], "%d", &evil_mode) >= 0) { argc -= 2, argv += 2; goto argprocess; } else if (argc >= 2 && argv[1][0] == '-' && argv[1][1] == 'b' && osp2p_sscanf(argv[1], "-b%d", &evil_mode) >= 0) { --argc, ++argv; goto argprocess; } else if (argc >= 2 && strcmp(argv[1], "-b") == 0) { evil_mode = 1; --argc, ++argv; goto argprocess; } else if (argc >= 2 && (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0)) { printf("Usage: osppeer [-tADDR:PORT | -tPORT] [-dDIR] [-b]\n" "Options: -tADDR:PORT Set tracker address and/or port.\n" " -dDIR Upload and download files from directory DIR.\n" " -b[MODE] Evil mode!!!!!!!!\n"); exit(0); } // Connect to the tracker and register our files. tracker_task = start_tracker(tracker_addr, tracker_port); listen_task = start_listen(); register_files(tracker_task, myalias); // First, download files named on command line. pid_t pid; for (; argc > 1; argc--, argv++) if ((t = start_download(tracker_task, argv[1]))){ pid = fork(); if(pid == 0){ task_download(t, tracker_task); _exit(0); } else if(pid > 0){} else if(pid == -1) error("Fork failed for download\n"); } int n_tasks = 0; // Then accept connections from other peers and upload files to them! while ((t = task_listen(listen_task))){ message("Beginning of while, n_tasks = %d\n", n_tasks); if(n_tasks >= MAX_NUM_TASKS){ if(waitpid(-1, 0, 0) > 0){ message("Waiting for other proc, n_tasks = %d\n", n_tasks); n_tasks--; } } else if(n_tasks < MAX_NUM_TASKS){ pid = fork(); if(pid == 0){ //message("New Task STARTED for upload, n_tasks = %d\n", n_tasks); task_upload(t); //message("New Task ENDED for upload, n_tasks = %d\n", n_tasks); _exit(0); } else if(pid > 0){ n_tasks++; } else if(pid == -1) error("Fork failed for upload\n"); } } return 0; }