int sr_connect_to_server(struct sr_instance* sr,unsigned short port, char* server) { #ifndef VNL struct hostent *hp; #endif c_open command; c_open_template ot; char* buf; uint32_t buf_len; /* REQUIRES */ assert(sr); assert(server); /* purify UMR be gone ! */ memset((void*)&command,0,sizeof(c_open)); #ifdef VNL sr->vc = vnl_open(sr->topo_id,sr->host); #else /* zero out server address struct */ memset(&(sr->sr_addr),0,sizeof(struct sockaddr_in)); sr->sr_addr.sin_family = AF_INET; sr->sr_addr.sin_port = htons(port); /* grab hosts address from domain name */ if ((hp = gethostbyname(server))==0) { perror("gethostbyname:sr_client.c::sr_connect_to_server(..)"); return -1; } /* set server address */ memcpy(&(sr->sr_addr.sin_addr),hp->h_addr_list[0],hp->h_length); /* create socket */ if ((sr->sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket(..):sr_client.c::sr_connect_to_server(..)"); return -1; } /* attempt to connect to the server */ if (connect(sr->sockfd, (struct sockaddr *)&(sr->sr_addr), sizeof(sr->sr_addr)) < 0) { perror("connect(..):sr_client.c::sr_connect_to_server(..)"); close(sr->sockfd); return -1; } #endif /* wait for authentication to be completed (server sends the first message) */ if(sr_read_from_server_expect(sr, VNS_AUTH_REQUEST)!= 1 || sr_read_from_server_expect(sr, VNS_AUTH_STATUS) != 1) return -1; /* failed to receive expected message */ if(strlen(sr->template) > 0) {
int sr_vns_read_from_server(struct sr_instance* sr /* borrowed */) { return sr_read_from_server_expect(sr, 0); }/* -- sr_vns_read_from_server -- */
int sr_vns_connect_to_server(struct sr_instance* sr,unsigned short port, const char* server) { struct hostent *hp; c_open command; c_open_template ot; char* buf; uint32_t buf_len; /* REQUIRES */ assert(sr); assert(server); if ( sr_vns_connected_to_server(sr) ) { return -1; } /* purify UMR be gone ! */ memset((void*)&command,0,sizeof(c_open)); /* zero out server address struct */ memset(&(sr->sr_addr),0,sizeof(struct sockaddr_in)); sr->sr_addr.sin_family = AF_INET; sr->sr_addr.sin_port = htons(port); /* grab hosts address from domain name */ if ((hp = gethostbyname(server))==0) { perror("gethostbyname:sr_client.c::sr_connect_to_server(..)"); return -1; } /* set server address */ memcpy(&(sr->sr_addr.sin_addr),hp->h_addr,hp->h_length); /* create socket */ if ((sr->sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket(..):sr_client.c::sr_connect_to_server(..)"); return -1; } /* attempt to connect to the server */ if (connect(sr->sockfd, (struct sockaddr *)&(sr->sr_addr), sizeof(sr->sr_addr)) < 0) { perror("connect(..):sr_vns.c::sr_connect_to_server(..)"); close(sr->sockfd); return -1; } fprintf(stderr, "waiting for expected messages ...\n"); /* wait for authentication to be completed (server sends the first message) */ if(sr_read_from_server_expect(sr, VNS_AUTH_REQUEST)!= 1 || sr_read_from_server_expect(sr, VNS_AUTH_STATUS) != 1) return -1; /* failed to receive expected message */ fprintf(stderr, "got expected messages ...\n"); if(strlen(sr->template_name) > 0) { /* send VNS_OPEN_TEMPLATE message to server */ ot.mLen = htonl(sizeof(c_open_template)); ot.mType = htonl(VNS_OPEN_TEMPLATE); strncpy(ot.templateName, sr->template_name, 30); strncpy(ot.mVirtualHostID, sr->vhost, IDSIZE); /* no source filters specified */ buf = (char*)&ot; buf_len = sizeof(ot); } else { /* send sr_OPEN message to server */ command.mLen = htonl(sizeof(c_open)); command.mType = htonl(VNSOPEN); command.topoID = htons(sr->topo_id); strncpy( command.mVirtualHostID, sr->vhost, IDSIZE); strncpy( command.mUID, sr->user, IDSIZE); buf = (char*)&command; buf_len = sizeof(command); } if(send(sr->sockfd, buf, buf_len, 0) != (int32_t)buf_len) { perror("send(..):sr_client.c::sr_connect_to_server()"); return -1; } if(strlen(sr->template_name) > 0) if(sr_read_from_server_expect(sr, VNS_RTABLE) != 1) return -1; /* needed to get the rtable */ return 0; } /* -- sr_connect_to_server -- */