int dare_server_init(dare_server_input_t *input) { int rc; /* Initialize data fields to zero */ memset(&data, 0, sizeof(dare_server_data_t)); /* Store input into server's data structure */ data.input = input; data.cur_view = input->cur_view; data.my_address = input->my_address; /* Set log file handler */ log_fp = input->log; /* Init server data */ rc = init_server_data(); if (0 != rc) { free_server_data(); fprintf(stderr, "Cannot init server data\n"); return 1; } init_network_cb(); poll_cb(); return 0; }
int udp_module_connect(char **argv) { int udpfd = 0; int success = 0; struct sockaddr_in udpsockaddr; init_server_data(argv, &udpsockaddr); udpfd = create_socket(AF_INET, SOCK_DGRAM); if (udpfd == -1) { fprintf(stdout, "UDP-Warning: create udp socket failed!\n"); return -1; } success = bind(udpfd, (SA *)&udpsockaddr, sizeof(SA)); if (success) { fprintf(stdout, "UDP-Error: udp bind failed\n"); return -1; } }
/* Sets up a server: * Creates the server_data structure, adds it to the server list, and * then sets up socket communication */ int init(char *serverid, server_data **sdata) { int flag; struct sockaddr_in server_addr; struct hostent* host=NULL; char g_server_addr[4]; static int sock=-1; int ret, insertval=0; //find out host info right away host=gethostbyname(serverid); if (host) { memcpy(g_server_addr, host->h_addr, 4); } else { dprintf(stderr,"gethostbyname FAILED!\n"); return -EHOSTUNREACH; } //use full addresses instead of host abbreviations //ie computer.abc.def.ghi instead of just computer if (strncmp(host->h_name,serverid,MAXADDR) != 0) { memset(serverid,0,MAXADDR); strncpy(serverid,host->h_name,MAXADDR); } server_data* sd = NULL; ret = get_info_ptr(&head,&tail,serverid,MAXADDR,(void *)&sd); if (ret < 0) { if (&head == NULL || serverid == NULL) { //an error occured, list not set up correctly or null serverid return ret; } else { //server could not be found in the list, set it up and add //it to the list sd = (server_data*)calloc(sizeof(server_data),1); init_server_data(sd); insertval = insert_info_ptr(&head,&tail,serverid, MAXADDR,(void *)sd); if (insertval<0) { //error inserting new sd into list return insertval; } } } /* This should only be true if the server was listed under host->h_name * and thus check_setup didn't see it. */ if (sd->g_mctx.sock > 0) { if (sdata) { *sdata=sd; } return 0; } memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; memcpy(&server_addr.sin_addr.s_addr, g_server_addr, 4); server_addr.sin_port = htons(server_port); sock=socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { dprintf(stderr, "ERROR: socket creation failed: %s\n", strerror(errno)); return -1; } flag=1; if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*) &flag, sizeof(int))) { dprintf(stderr, "ERROR: unable to set socket options.\n"); } int rval = connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (rval != 0) { dprintf(stderr, "ERROR: connect failed: %s\n", strerror(errno)); if (errno == ECONNREFUSED) { //check to see if a local directory for the server exists //if it does, remove it struct stat st; char dir_path[MAXPATH+LOCALSIZE]; sprintf(dir_path, "%s/mnt/%s", local_path,serverid); int stret = stat(dir_path, &st); if (stret >= 0) { if (rmdir(dir_path)) { perror("Error deleting directory of server"); } } ret = -EHOSTUNREACH; } else ret = -1; return ret; } sd->g_mctx.sock=sock; if(my_ops.up_new_server) { char my_dns[4096]; memset(my_dns,4096,0); gethostname(my_dns, 4095); if(my_ops.up_new_server(my_dns, serverid, sd->ctx) != PROCEED){ shutdown(sd->g_mctx.sock, 2); sock = sd->g_mctx.sock = -1; return -1; } } //create the local directory, if it doesn't already exist struct stat st; char dir_path[MAXPATH+LOCALSIZE]; sprintf(dir_path, "%s/mnt/%s", local_path, serverid); int stret = stat(dir_path, &st); if (stret < 0) { if (mkdir(dir_path, 0700)) { perror("Failed to create local .corefs/mnt/server directory"); exit(1); } } //set the server data pointer if (sdata) { *sdata = sd; } return 0; }