static int recv_lnk(int socket, struct server_data* server_data, int dir_fd) { char* lnkname = NULL; char* lnkdest = NULL; int ret = -1; if (server_receive(socket, server_data, data_handler_stringify, &lnkname) != 0) { VIR_DEBUG("server_receive was not successfull (on lnkname)!"); goto err; } if (server_receive(socket, server_data, data_handler_stringify, &lnkdest) != 0) { VIR_DEBUG("server_receive was not successfull (on lnkdest)!"); goto err; } VIR_DEBUG("%d", dir_fd); /* VIR_DEBUG("received link '%s'->'%s'", lnkname, lnkdest); if (symlinkat(lnkdest, dir_fd, lnkname) < 0) { VIR_DEBUG("symlinkat: errno: %s", strerror(errno)); goto err; }*/ VIR_DEBUG("received symlink '%s' (%lu byte(s)) -> '%s' (%lu byte(s)).", lnkname, strlen(lnkname)+1, lnkdest, strlen(lnkdest)+1); ret = 0; err: free(lnkname); free(lnkdest); return ret; }
static int recv_dir(int socket, struct server_data* server_data, int dir_fd) { char* dirname = NULL; int ret = -1; if (server_receive(socket, server_data, data_handler_stringify, &dirname) != 0) { VIR_DEBUG("server_receive was not successfull (on dir)!"); goto err; } //permission 664 if (mkdirat(dir_fd, dirname, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { if (errno == EEXIST) { VIR_DEBUG("directory '%s' already exists. jump mkdir step", dirname); } else { VIR_DEBUG("errno: %s", strerror(errno)); goto err; } } VIR_DEBUG("received dir '%s' (%lu byte(s)).", dirname, strlen(dirname)+1); ret = 0; err: free(dirname); return ret; }
static int recv_reg(int socket, struct server_data* server_data, int dir_fd) { char* msg = NULL; int filefd; // struct stat statdata; int ret = -1; //VIR_DEBUG("receiving new regular file"); if (server_receive(socket, server_data, data_handler_stringify, &msg) != 0) { VIR_DEBUG("server_receive was not successfull (on filename)!"); goto err; } // VIR_DEBUG("about to receive reg '%s' at fd %d", msg, dir_fd); //open with permission 664 filefd = openat(dir_fd, msg, O_RDWR | O_CREAT | O_NOFOLLOW, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); if (filefd < 0) { VIR_DEBUG("errno: %s", strerror(errno)); goto err; } if (server_receive(socket, server_data, data_handler_filewriter, &filefd) != 0) { VIR_DEBUG("server_received was not successfull!"); goto err; } /* if (fstat(filefd, &statdata)) { VIR_DEBUG("cannot stat file"); goto err; } */ VIR_DEBUG("received file '%s'.", msg); ret = 0; err: close(filefd); free(msg); return ret; }
/* * TASK to handle an incoming request */ int server_request (void *parm) { SERVERPARM *s; DBUF *req, *res; char *curl; s = (SERVERPARM *) parm; curl = xml_get_text (s->xml, "Phineas.Console.Url"); res = NULL; while ((req = server_receive (s->conn)) != NULL) { debug ("received %d bytes\n", dbuf_size (req)); if (dbuf_size (req) == 0) { dbuf_free (req); net_close (s->conn); return (-1); } dbuf_putc (req, 0); /* * log the request, but filter out GET requests for the console... * noise */ if (!(*curl && strstarts (dbuf_getbuf (req) + 4, curl))) server_logrequest (s->conn, dbuf_size (req), dbuf_getbuf (req)); if ((res = server_response (s->xml, dbuf_getbuf (req))) == NULL) { res = server_respond (500, "<h3>Failure processing ebXML request</h3>"); } server_header (res); net_write (s->conn, dbuf_getbuf (res), dbuf_size (res)); dbuf_free (res); dbuf_free (req); } net_close (s->conn); debug ("request completed\n"); return (0); }
int main(int argc, char **argv) { int status; char ip_addr[INET_ADDRSTRLEN]; char *service; int server_sock = -1; int exit_flag = 0; int ftp_sock = 9999; fd_set temp; /*Init. Logger*/ #ifndef MY_PC cse4589_init_log(argv[2]); #endif int sock; if(argc<3) { printf("No args\n"); return 1; } if(!validate_port(argv[2])) return 0; FD_ZERO(&wait_fd); FD_ZERO(&temp); FD_SET(0, &wait_fd); tv.tv_sec = 15; tv.tv_usec = 0; if(!strcmp(argv[1], "s")) { is_server = true; } else if(strcmp(argv[1], "c")) { printf("Usage ./sock [s/c]\n"); return 0; } set_listening_port(argv[2]); server_sock = server_start(argv[2]); if(server_sock <=0)return 0; sock = server_sock; add_fd(sock); int i =2; while(!exit_flag) { temp = wait_fd; int ret = select(active_sockets, &temp, NULL, NULL, NULL); if(ret) { if(FD_ISSET(STDIN, &temp)) { exit_flag = parse_shell(); } else if(FD_ISSET(server_sock, &temp)) { // server socket is active, check for new connections if(is_server) { int new_socket = server_accept(server_sock); add_fd(new_socket); } else { int new_socket = server_accept(server_sock); //add ftp socket add_fd(new_socket); ftp_sock = new_socket; } } else if(FD_ISSET(ftp_sock, &temp)) { client_receive_file(&ftp_sock); } else { for(int fd = 3; fd<=active_sockets; fd++) { if(FD_ISSET(fd, &temp)) { if(is_server) server_receive(fd); else client_receive(fd); } } } //End of else } //end of select handling } //end loop clear_fd(sock); close(sock); #ifndef MY_PC fclose(fopen(LOGFILE, "w")); #endif return 0; }
int process_requests(int s){ char buffer[10000]; fra_t fragment; struct sockaddr remote; int rlen,retval; int N=0; struct file_s file[100]; struct fgetinfo p1; struct fgetfrag p2; struct finfo *p4; struct ffrag *p5; while (1) { switch (server_receive(s,buffer,sizeof(buffer),&remote,&rlen)){ case 1: memcpy(&p1,buffer,sizeof(p1)); if(check_fgetinfo(p1)){ printf("Corrupted packet\n"); } else{ print_fgetinfo(p1); //check if file exists and can be open if((file[N].fd=(FILE *)fopen(p1.file_path,"r"))==NULL){ // If file not found tell the client p4=get_sinfo(0,0,0); } else{ strncpy(file[N].file_path,p1.file_path,FILENAME_MAX); file[N].file_id=N; // If file found, tell the client info about it fseek(file[N].fd, 0, SEEK_END); // seek to end of file file[N].size=ftell(file[N].fd); // get file size // Has no sense to seek back to beginning of file p4=get_sinfo(1,file[N].file_id,file[N].size); N++; } // Send info about the file if(reply(s,&remote,rlen,p4,sizeof(*p4))){ printf("Error sending\n"); } } break; case 2: memcpy(&p2,buffer,sizeof(p2)); if(check_fgetfrag(p2)){ printf("Corrupted packet\n"); } else{ // Send fragment fseek(file[p2.file_id].fd,SEEK_SET,p2.offset); if((retval=fread(fragment,sizeof(char),sizeof(fra_t),file[p2.file_id].fd))<=0){ printf("Nothing read\n"); } p5=get_ffrag(p2.file_id,p2.offset,fragment,retval); if(reply(s,&remote,rlen,p5,sizeof(*p5))){ printf("Error sending\n"); } } break; case 0: printf("Error receiving\n"); break; default: printf("Unknown packet received\n"); break; } } }