Merge remote-tracking branch 'origin/master' into for-steve
[sxemacs] / lib-src / gnuserv.h
1 /* -*-C-*-
2
3  Header file for the GNU Emacs server and client C code.
4
5  This file is part of GNU Emacs.
6
7  Copying is permitted under those conditions described by the GNU
8  General Public License.
9
10  Copyright (C) 1989 Free Software Foundation, Inc.
11
12  Author: Andy Norman (ange@hplb.hpl.hp.com), based on
13          'etc/server.c' and 'etc/emacsclient.c' from the 18.52 GNU
14          Emacs distribution.
15
16  Please mail bugs and suggestions to the author at the above address.
17 */
18
19 /* HISTORY
20  * 11-Nov-1990          bristor@simba
21  *    Added EOT stuff.
22  */
23
24 /*
25  * This file incorporates new features added by Bob Weiner <weiner@mot.com>,
26  * Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>.
27  * Please see the note at the end of the README file for details.
28  *
29  * (If gnuserv came bundled with your emacs, the README file is probably
30  * ../etc/gnuserv.README relative to the directory containing this file)
31  */
32
33 #define GNUSERV_VERSION "3.12"
34
35 /* Note: this setting can cause client-server connection failure if the
36  * value of TMPDIR is not shared by client and server at run-time.
37  */
38 #define USE_TMPDIR
39
40 #define PATCHLEVEL 2
41
42 #define NO_SHORTNAMES
43 /* gnuserv should not be compiled using SOCKS */
44 #define DO_NOT_SOCKSIFY
45 #define DONT_ENCAPSULATE
46 #include <config.h>
47 #undef signal
48
49 /* Define the communication method between server and clients:
50  *   You can have either or both kinds of sockets, but you can't mix
51  *   sockets with sysv ipc
52  */
53
54 #define INTERNET_DOMAIN_SOCKETS
55 #ifdef HAVE_SYS_UN_H
56 #define UNIX_DOMAIN_SOCKETS
57 /* #define SYSV_IPC  */
58 #endif
59
60 /*
61  * Define additional authentication protocols to be used. These methods will
62  * be tried before falling back to the default gnuserv protocol (based on
63  * the GNU_SECURE environment variable). Currently, only MIT-MAGIC-COOKIE-1
64  * is also supported.
65  *
66  * Comment out the next line(s) if you don't want to enable the
67  * appropriate authentication protocol.
68  */
69
70 #if defined (HAVE_XAUTH)
71 #define AUTH_MAGIC_COOKIE
72 #endif                          /* HAVE_XAUTH */
73
74 /*
75  * stuff related to supporting MIT-MAGIC-COOKIE-1
76  */
77
78 #define MCOOKIE_SCREEN "999"    /* screen # to use as the gnuserv cookie */
79 #define MCOOKIE_NAME   "MAGIC-1"        /* authentication protocol name */
80 #define MCOOKIE_X_NAME "MIT-MAGIC-COOKIE-1"     /* as needed by X */
81
82 #define DEFAUTH_NAME "GNU-SECURE"       /* name of default auth protocol */
83 #define AUTH_TIMEOUT  15        /* # seconds to wait for auth data */
84 #define AUTH_NAMESZ   15        /* max allows auth protocol name size */
85
86 /*
87  * Pick a default communication scheme, if none was specified.
88  */
89
90 #if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS)
91
92 #ifdef HAVE_SYSVIPC
93 #define SYSV_IPC                /* SYSV systems use SYSV IPC by default */
94 #endif                          /* HAVE_SYSVIPC */
95
96 #ifdef BSD
97 #define UNIX_DOMAIN_SOCKETS     /* BSD systems use Unix Domain sockets by default */
98 #endif                          /* BSD */
99
100 #endif                          /* No communication method pre-defined */
101
102 #include <sys/types.h>
103 #include <sys/param.h>
104 #include <sys/stat.h>
105 #include <stdio.h>
106 #include <stdlib.h>
107 #include <string.h>
108 #include <signal.h>
109 #include <errno.h>
110
111 #ifdef HAVE_UNISTD_H
112 #include <unistd.h>
113 #endif
114
115 #ifdef HAVE_SYS_TIME_H
116 #include <sys/time.h>
117 #endif
118
119 /*
120  * If you are using SYSV_IPC, you might want to make the buffer size bigger
121  * since it limits the size of requests and responses. Don't make it bigger
122  * than your system's max message size though (usually a couple of k) or else
123  * msgsend will start failing. For sockets, using the system BUFSIZ is usually
124  * what you want.
125  */
126
127 # define GSERV_BUFSZ BUFSIZ
128
129 #ifdef SYSV_IPC
130 #include <sys/ipc.h>
131 #include <sys/msg.h>
132
133 #define send_string(s,str) \
134   if (strlen(msgp->mtext) + strlen(str) < GSERV_BUFSZ) \
135      strcat(msgp->mtext,str); \
136   else \
137   { \
138     fprintf(stderr,"%s: not enough message buffer space\n",progname); \
139      exit(1); \
140   } \
141
142 #endif                          /* SYSV_IPC */
143
144 #if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
145 #include <sys/socket.h>
146 #endif                          /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */
147
148 #ifdef INTERNET_DOMAIN_SOCKETS
149 #include <netdb.h>
150 #include <netinet/in.h>
151 #include <arpa/inet.h>
152 #define TABLE_SIZE 101          /* The number of entries in the hash table */
153 #define HASH(host) host         /* Rather simplistic hash function */
154 #define DEFAULT_PORT 21490      /* default port number to use is
155                                  * DEFAULT_PORT + uid */
156 #endif                          /* INTERNET_DOMAIN_SOCKETS */
157
158 #ifdef UNIX_DOMAIN_SOCKETS
159 #include <sys/un.h>
160 #define HIDE_UNIX_SOCKET        /* put the unix socket in a protected dir */
161 #endif                          /* UNIX_DOMAIN_SOCKETS */
162
163 /* On some platforms, we need to do the equivalent of "stty litout" to get
164  * characters like ^D to pass through to emacs.  This problem has only
165  * been observed under emacs18; fsf19 and lemacs are probably okay without it.
166  */
167 #ifndef DONT_USE_LITOUT
168 #if !defined(HAVE_TERMIO) && !defined(HAVE_TERMIOS) && !defined(VMS)
169 #if !defined(BSD4_1)
170 #define USE_LITOUT
171 #endif
172 #endif
173 #endif
174
175 #define HOSTNAMSZ 255           /* max size of a hostname */
176 #define REPLYSIZ 300            /* max size of reply from server to client */
177 #undef FALSE
178 #define FALSE 0
179 #undef TRUE
180 #define TRUE 1
181
182 extern char *optarg;
183 extern int optind;
184 extern char *progname;
185 extern char *tmpdir;
186
187 /* The casts shut Sun's compiler up and are safe in the context these
188    are actually used. */
189 #define max2(x,y) (((int) (x) > (int) (y)) ? (x) : (y))
190 #define min2(x,y) (((int) (x) < (int) (y)) ? (x) : (y))
191
192 #ifndef _NFILE                  /* rough guess at maximum number of open files */
193 #define _NFILE 20
194 #endif
195
196 #define EOT_STR "\004"
197 #define EOT_CHR '\004'
198
199 /* connection types */
200 #define CONN_UNIX     0
201 #define CONN_INTERNET 1
202 #define CONN_IPC      2
203
204 /* function declarations */
205 int make_connection(char *hostarg, int portarg, int *s);
206 #ifdef SYSV_IPC
207 void disconnect_from_ipc_server();
208 #endif
209 #if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
210 void send_string(int s, const char *msg);
211 void disconnect_from_server(int s, int echo);
212 int read_line(int s, char *dest);
213 #endif
214 #ifdef INTERNET_DOMAIN_SOCKETS
215 int internet_addr(char *host);
216 #endif
217
218 /* convenience macro, that does asserts as well */
219 #define SNPRINTF(_res_, _tgt_, _tsz_, args...)                  \
220         (_res_) = snprintf(_tgt_, _tsz_, args);                 \
221         assert((_res_) >= 0 && (size_t)(_res_) < (_tsz_))