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 */ }
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; }