1 /* startserver.c --- open a connection to the CVS server under Windows NT 2 Jim Blandy <jimb@cyclic.com> --- August 1995 */ 3 4 #include "cvs.h" 5 #include "rcmd.h" 6 7 #include <stdlib.h> 8 #include <winsock.h> 9 #include <malloc.h> 10 #include <io.h> 11 #include <errno.h> 12 13 /* Keep track of whether we've opened a socket so that wnt_shutdown_server 14 can do the correct thing. We don't want to call shutdown or 15 closesocket on a pipe. */ 16 17 static int opened_a_socket = 0; 18 19 void 20 wnt_start_server (int *tofd, int *fromfd, 21 char *client_user, 22 char *server_user, 23 char *server_host, 24 char *server_cvsroot) 25 { 26 char *cvs_server; 27 char *command; 28 struct servent *sptr; 29 unsigned short port; 30 int read_fd; 31 char *portenv; 32 33 if (! (cvs_server = getenv ("CVS_SERVER"))) 34 cvs_server = "cvs"; 35 command = xmalloc (strlen (cvs_server) 36 + strlen (server_cvsroot) 37 + 50); 38 sprintf (command, "%s -d %s server", cvs_server, server_cvsroot); 39 40 portenv = getenv("CVS_RCMD_PORT"); 41 if (portenv) 42 port = atoi(portenv); 43 else if ((sptr = getservbyname("shell", "tcp")) != NULL) 44 port = sptr->s_port; 45 else 46 port = IPPORT_CMDSERVER; /* shell/tcp */ 47 48 read_fd = rcmd (&server_host, 49 port, 50 client_user, 51 (server_user ? server_user : client_user), 52 command, 53 0); 54 if (read_fd < 0) 55 error (1, 0, "cannot start server via rcmd: %s", 56 SOCK_STRERROR (SOCK_ERRNO)); 57 58 *tofd = read_fd; 59 *fromfd = read_fd; 60 free (command); 61 62 opened_a_socket = 1; 63 } 64 65 66 void 67 wnt_shutdown_server (int fd) 68 { 69 if (opened_a_socket) 70 { 71 SOCKET s; 72 73 s = fd; 74 if (shutdown (s, 2) == SOCKET_ERROR) 75 error (1, 0, "couldn't shutdown server connection: %s", 76 SOCK_STRERROR (SOCK_ERRNO)); 77 if (closesocket (s) == SOCKET_ERROR) 78 error (1, 0, "couldn't close server connection: %s", 79 SOCK_STRERROR (SOCK_ERRNO)); 80 } 81 else 82 { 83 if (close (fd) < 0) 84 error (1, errno, "cannot close server connection"); 85 } 86 } 87