Пример #1
0
int
open_file(char *method, char *file)
{
	char *url;
	char **ap, **argv;
	int len, i, oerrno;

	if ((method == NULL) || (strcmp(method, "file") == 0))
		return (open(file, O_RDONLY));
	if ((strcmp(method, "http") == 0) ||
	    strcmp(method, "ftp") == 0) {
		asprintf(&url, "%s://%s", method, file);
		if (url == NULL)
			return (-1);
		i = fileget(url);
		free(url);
		return (i);
	} else if (strcmp(method, "exec") == 0) {
		len = strlen(file);
		argv = calloc(len, sizeof(char *));
		if (argv == NULL)
			errx(1, "malloc failed");
		for (ap = argv; ap < &argv[len - 1] &&
		    (*ap = strsep(&file, " \t")) != NULL;) {
			if (**ap != '\0')
				ap++;
		}
		*ap = NULL;
		i = open_child(argv[0], argv);
		oerrno = errno;
		free(argv);
		errno = oerrno;
		return (i);
	}
	errx(1, "Unknown method %s", method);
	return (-1); /* NOTREACHED */
}
Пример #2
0
int server(int portnum, int fd0)
{
	int clientfd = 0, n = 0, listenfd = 0;
	char *srecvBuff, *crecvBuff;
	char ssendBuff[1025], csendBuff[1025];
	struct sockaddr_in s_addr, c_addr;
	int numrv;
	char line[1000];
	struct sFileDownload cFileDownload;
	struct sFileDownload sFileDownload;
	struct sFileUpload cFileUpload;
	struct sFileUpload sFileUpload;
	memset(&c_addr, '0', sizeof(c_addr));
	memset(csendBuff, '0', sizeof(csendBuff));
	memset(ssendBuff, '0', sizeof(ssendBuff));
	int cmd;

	s_addr.sin_family = AF_INET;
	s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	s_addr.sin_port = htons(portnum);

	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	printf("created socket\n");

	bind(listenfd,(struct sockaddr *) &s_addr, sizeof(s_addr));
	printf("listening on port %d\n", portnum);
	if(listen(listenfd, 10) == -1)
	{
		printf("Failed to listen\n");
		return -1;
	}
    clientfd = accept(listenfd,(struct sockaddr *) NULL, NULL);	// accept awaiting request
    if(clientfd == -1)
    	printf
   ("accept faileindent: Standard input:476: Warning:old style assignment ambiguity in \"=-\".        Assuming \"= -\"d\n");
    else
    	printf("accepted connection \n");

    while(1)
    {
    	if((n = read(clientfd, &cmd, sizeof(int))) > 0)
    	{
    		printf("Recieved %d %d\n", n, cmd);
    		n = 0;
    	}

    	if((CMD) cmd == FileDownload)
    	{
    		printf("Got FileDownload command\n");
    		if((n =read(clientfd,(void *) &sFileDownload,sizeof(sFileDownload))) != sizeof(sFileDownload))
    			printf("Error reading filename\n");
    		printf("Sending file %s\n", sFileDownload.filename);
    		char temp[100];
    		strcpy(temp, "./shared/");
    		strcat(temp, sFileDownload.filename);
    		char *fname = temp;
    		FILE *fs = fopen(fname, "r");
    		if(fs == NULL)
    		{
    			printf("Unable to open file.\n");
    			return 0;
    		}
    		int block;
    		char *readbuf;
    		struct stat vstat;
	    // get size of file
    		if(stat(temp, &vstat) == -1)
    		{
    			printf("vstat error\n");
    			return 0;
    		}
	    // send file size first
    		int size = vstat.st_size;
    		readbuf =(char *) malloc(size * sizeof(char));
    		if(readbuf == NULL)
    		{
    			printf("error, No memory\n");
    			exit(0);
    		}
    		if(send(clientfd, &size, sizeof(int), 0) < 0)
    		{
    			printf("send error\n");
    			return 0;
    		}
    		else
    			printf("sending file size %d\n", size);

    		while((block = fread(readbuf, sizeof(char), size, fs)) > 0)
    		{
    			if(send(clientfd, readbuf, block, 0) < 0)
    			{
    				printf("send error\n");
    				return 0;
    			}
    			printf("File Sent\n");
    		}
    		fclose(fs);
    	}

    	else if((CMD) cmd == FileUpload)
    	{
    		char temp[100];
			printf("Got FileUpload command\n");

	   		if((n = read(clientfd,(void *) &sFileUpload,sizeof(sFileUpload))) != sizeof(sFileUpload))
    			printf("Error reading filename\n");
 
     		printf("File name: %s\n", sFileUpload.filename);
    		int size;
    		int fr_block_sz = 0;
    		if((fr_block_sz =
    			recv(clientfd, &size, sizeof(int), 0)) != sizeof(int))
    		{
    			printf("Error reading size of file %s\n", temp);
    			return 0;
    		}
    		else
    			printf("File size: %dB\n", size);

    		char result[100];
    		printf("FileUploadDeny or FileUploadAllow?\n");
    		read(fd0, result, sizeof("FileUploadAllow"));

    		if(strcmp(result, "FileUploadDeny") == 0)
    		{
    			if((n = write(clientfd, &result, sizeof(result))) == -1)
    				printf("Failed to send result %s\n", result);
    			else
    				printf("Result sent: %d %s\n", n, result);
    			continue;
    		}
    		else
    		{
    			printf("Accepted file\n");
    			write(clientfd, &result, sizeof(result));
    		}

    		strcpy(temp, "./shared/");
    		strcat(temp, sFileUpload.filename);
    		FILE *fr = fopen(temp, "w+");
    		if(fr == NULL)
    		{
    			printf("Error creating file %s\n", temp);
    			return 0;
    		}
    		else
    			printf("created file %s\n", temp);

    		srecvBuff =(char *) malloc(size * sizeof(char));
    		int recvdsize = 0;
    		while((fr_block_sz = recv(clientfd, srecvBuff, LENGTH, 0)) > 0)
    		{
    			srecvBuff[fr_block_sz] = 0;
    			int write_sz =
    			fwrite(srecvBuff, sizeof(char), fr_block_sz, fr);
    			srecvBuff += fr_block_sz;
    			if(write_sz == -1)
    			{
    				printf("Error writing to file %s\n", temp);
    				return 0;
    			}
    			else
    				printf("wrote to file %s %d bytes\n", temp, write_sz);
    			recvdsize += fr_block_sz;
    			if(recvdsize >= size)
    				break;

    		}
    		printf("Done Upload!\n");
    		fclose(fr);
    	}

    	if((CMD) cmd == FileHash)
    	{
    		MD5_CTX md5Context;
    		char sign[16];
    		int num_responses;
    		char temp[100];
    		printf("Got FileHash command\n");

    		if((n =read(clientfd,(void *) &sFileHash,sizeof(sFileHash))) != sizeof(sFileHash))
    			printf("Error reading cFileHash\n");
    		else
    			printf("Type:%s\n", sFileHash.type);

    		if(strcmp(sFileHash.type, "Verify") == 0)
    		{

    			printf("Got Verify\n");

    			num_responses = 1;

    			if(send(clientfd, &num_responses, sizeof(int), 0) < 0)
    			{
    				printf("send error\n");
    				return 0;
    			}
    			else
    				printf("sent number of responses %d\n", num_responses);
    			printf("ALL DONE\n");
    			getFileHash();
    			if(send(clientfd, &sFileHash_response, sizeof(sFileHash_response),0) < 0)
    			{
    				printf("send error\n");
    				return 0;
    			}
    			else
    				printf("sent sFileHash_response %s\n",
    					sFileHash_response.filename);
    		}
    		else if(strcmp(sFileHash.type, "CheckAll") == 0)
    		{
    			DIR *fd;
    			int i;
    			printf("Got CheckAll\n");
    			strcpy(temp, "./shared/");
    			fd = opendir(temp);
    			if(NULL == fd)
    			{
    				printf("Error opening directory %s\n", temp);
    				return 0;
    			}

    			num_responses = GetFileCnt();
    			printf("Found %d files in shared folder\n", num_responses);
    			if(send(clientfd, &num_responses, sizeof(num_responses), 0) <    0)
    			{
    				printf("send error\n");
    				return 0;
    			}
    			else
    				printf("sent number of responses %d\n", num_responses);

    			fd = opendir(temp);
    			for(i = 0; i < num_responses; i++)
    			{
    				strcpy(sFileHash.filename, GetNxtFile(fd));
    				getFileHash();

    				if(send(clientfd, &sFileHash_response,sizeof(sFileHash_response), 0) < 0)
    				{
    					printf("send error\n");
    					return 0;
    				}
    				else
    					printf("sent sFileHash_response %s\n",sFileHash_response.filename);
    			}
    			closedir(fd);
    		}
    		else
    		{
    			printf("RReceived invalid FileHash Command %s\n",
    				sFileHash.type);
    			return 0;
    		}

    	}
    	
    	else if((CMD) cmd == IndexGet)
    	{
    		char filelist[1000];
    		strcpy(filelist, "");
    		fileget(filelist, clientfd);
    		printf("File List Sent\n");
    	}
    	
    	if(n < 0)
    		printf("\n Read Error \n");
    }
    close(clientfd);
    return 0;
}