Beispiel #1
0
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;
}
Beispiel #2
0
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 */
}
Beispiel #3
0
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 */
}
Beispiel #4
0
// 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;
}