publish
[alioth/cvs.git] / emx / startserver.c
1 /* This program is free software; you can redistribute it and/or modify
2    it under the terms of the GNU General Public License as published by
3    the Free Software Foundation; either version 2, or (at your option)
4    any later version.
5
6    This program is distributed in the hope that it will be useful,
7    but WITHOUT ANY WARRANTY; without even the implied warranty of
8    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9    GNU General Public License for more details.  */
10
11 #include <assert.h>
12 #include "cvs.h"
13 #include "rcmd.h"
14
15 #include <sys/types.h>
16 #include <sys/socket.h>
17 #include <netdb.h>
18
19 static char *cvs_server;
20 static char *command;
21
22 extern int trace;
23
24 void
25 os2_start_server (int *tofd, int *fromfd,
26                   char *client_user,
27                   char *server_user,
28                   char *server_host,
29                   char *server_cvsroot)
30 {
31     int fd, port;
32     char *portenv;
33     struct servent *sptr;
34         const char *rcmd_host = (const char *) server_host;
35
36     if (! (cvs_server = getenv ("CVS_SERVER")))
37         cvs_server = "cvs";
38         command = xmalloc (strlen (cvs_server)
39                          + strlen (server_cvsroot)
40                          + 50);
41     sprintf (command, "%s server", cvs_server);
42
43     portenv = getenv ("CVS_RCMD_PORT");
44     if (portenv)
45         port = atoi (portenv);
46     else if ((sptr = getservbyname ("shell", "tcp")) != NULL)
47         port = sptr->s_port;
48     else
49         port = 514; /* shell/tcp */
50
51     if (trace)
52     {
53         fprintf (stderr, "os2_start_server(): connecting to %s:%d\n",
54             server_host, port);
55         fprintf (stderr, "local_user = %s, remote_user = %s, CVSROOT = %s\n",
56             client_user, (server_user ? server_user : client_user),
57             server_cvsroot);
58     }
59
60     fd = rcmd (&rcmd_host, port,
61                client_user,
62                (server_user ? server_user : client_user),
63                command, 0);
64
65     if (fd < 0)
66         error (1, errno, "cannot start server via rcmd()");
67
68     *tofd = fd;
69     *fromfd = fd;
70     free (command);
71 }
72
73 void
74 os2_shutdown_server (int fd)
75 {
76     /* FIXME: shutdown on files seems to have no bad effects */
77     if (shutdown (fd, 2) < 0 && errno != ENOTSOCK)
78         error (1, 0, "couldn't shutdown server connection");
79     if (close (fd) < 0)
80         error (1, 0, "couldn't close server connection");
81 }
82