wrap and sort CLEANFILES
[alioth/cvs.git] / windows-NT / startserver.c
1 /*
2  * Copyright (C) 1995-2005 The Free Software Foundation, Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2, or (at your option)
7  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14
15 /* startserver.c --- open a connection to the CVS server under Windows NT
16    Jim Blandy <jimb@cyclic.com> --- August 1995  */
17
18 #include "cvs.h"
19 #include "rcmd.h"
20
21 #include <stdlib.h>
22 #include <sys/socket.h>
23 #include <malloc.h>
24 #include <io.h>
25 #include <errno.h>
26
27 /* Keep track of whether we've opened a socket so that wnt_shutdown_server
28    can do the correct thing.  We don't want to call shutdown or
29    closesocket on a pipe. */
30
31 static int opened_a_socket = 0;
32
33 void
34 wnt_start_server (int *tofd, int *fromfd,
35                   char *client_user,
36                   char *server_user,
37                   char *server_host,
38                   char *server_cvsroot)
39 {
40     char *cvs_server;
41     char *command;
42     struct servent *sptr;
43     unsigned short port;
44     int read_fd;
45     char *portenv;
46     
47     if (! (cvs_server = getenv ("CVS_SERVER")))
48         cvs_server = "cvs";
49     command = xmalloc (strlen (cvs_server)
50                        + strlen (server_cvsroot)
51                        + 50);
52     sprintf (command, "%s -d %s server", cvs_server, server_cvsroot);
53
54     portenv = getenv("CVS_RCMD_PORT");
55     if (portenv)
56         port = atoi(portenv);
57     else if ((sptr = getservbyname("shell", "tcp")) != NULL)
58         port = sptr->s_port;
59     else
60         port = IPPORT_CMDSERVER; /* shell/tcp */
61
62     read_fd = rcmd (&server_host,
63                     port,
64                     client_user,
65                     (server_user ? server_user : client_user),
66                     command,
67                     0);
68     if (read_fd < 0)
69         error (1, 0, "cannot start server via rcmd: %s",
70                SOCK_STRERROR (SOCK_ERRNO));
71
72     *tofd = read_fd;
73     *fromfd = read_fd;
74     free (command);
75
76     opened_a_socket = 1;
77 }
78
79
80 void
81 wnt_shutdown_server (int fd)
82 {
83     if (opened_a_socket)
84     {
85         SOCKET s;
86
87         s = fd;
88         if (shutdown (s, 2) == SOCKET_ERROR)
89             error (1, 0, "couldn't shutdown server connection: %s",
90                    SOCK_STRERROR (SOCK_ERRNO));
91         if (closesocket (s) == SOCKET_ERROR)
92             error (1, 0, "couldn't close server connection: %s",
93                    SOCK_STRERROR (SOCK_ERRNO));
94     }
95     else
96     {
97         if (close (fd) < 0)
98             error (1, errno, "cannot close server connection");
99     }
100 }