comparison lib-src/gnuclient.c @ 30:ec9a17fef872 r19-15b98

Import from CVS: tag r19-15b98
author cvs
date Mon, 13 Aug 2007 08:52:29 +0200
parents bcdc7deadc19
children 131b0175ea99
comparison
equal deleted inserted replaced
29:7976500f47f9 30:ec9a17fef872
63 } /* main */ 63 } /* main */
64 #else /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */ 64 #else /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */
65 65
66 static char cwd[MAXPATHLEN+2]; /* current working directory when calculated */ 66 static char cwd[MAXPATHLEN+2]; /* current working directory when calculated */
67 static char *cp = NULL; /* ptr into valid bit of cwd above */ 67 static char *cp = NULL; /* ptr into valid bit of cwd above */
68
69 #ifdef GNUATTACH
70 #include <signal.h>
71
72 static pid_t emacs_pid; /* Process id for emacs process */
73
74 void tell_emacs_to_resume(int sig)
75 {
76 char buffer[GSERV_BUFSZ+1];
77 int s; /* socket / msqid to server */
78 int connect_type; /* CONN_UNIX, CONN_INTERNET, or
79 * CONN_IPC */
80
81 /* Why is SYSV so retarded? */
82 /* We want emacs to realize that we are resuming */
83 signal(SIGCONT, tell_emacs_to_resume);
84
85 connect_type = make_connection (NULL, (u_short) 0, &s);
86
87 sprintf(buffer,"(server-eval '(resume-pid-console %d))", getpid());
88 send_string(s, buffer);
89
90 #ifdef SYSV_IPC
91 if (connect_type == (int) CONN_IPC)
92 disconnect_from_ipc_server (s, msgp, FALSE);
93 #else /* !SYSV_IPC */
94 if (connect_type != (int) CONN_IPC)
95 disconnect_from_server (s, FALSE);
96 #endif /* !SYSV_IPC */
97 }
98
99 void pass_signal_to_emacs(int sig)
100 {
101 if (kill(emacs_pid, sig) == -1) {
102 fprintf(stderr, "gnuattach: Could not pass signal to emacs process\n");
103 exit(1);
104 }
105 }
106
107 void initialize_signals()
108 {
109 /* Set up signal handler to pass relevant signals to emacs process */
110 signal(SIGHUP, pass_signal_to_emacs);
111 signal(SIGQUIT, pass_signal_to_emacs);
112 signal(SIGILL, pass_signal_to_emacs);
113 signal(SIGTRAP, pass_signal_to_emacs);
114 signal(SIGSEGV, pass_signal_to_emacs);
115 signal(SIGPIPE, pass_signal_to_emacs);
116 signal(SIGTERM, pass_signal_to_emacs);
117 #ifdef SIGBUS
118 signal(SIGBUS, pass_signal_to_emacs);
119 #endif
120 #ifdef SIGIOT
121 signal(SIGIOT, pass_signal_to_emacs);
122 #endif
123
124 /* We want emacs to realize that we are resuming */
125 signal(SIGCONT, tell_emacs_to_resume);
126 }
127
128 #endif /* GNUATTACH */
68 129
69 130
70 /* 131 /*
71 get_current_working_directory -- return the cwd. 132 get_current_working_directory -- return the cwd.
72 */ 133 */
129 190
130 int 191 int
131 main (int argc, char *argv[]) 192 main (int argc, char *argv[])
132 { 193 {
133 int starting_line = 1; /* line to start editing at */ 194 int starting_line = 1; /* line to start editing at */
134 char command[MAXPATHLEN+50]; /* emacs command buffer */ 195 char command[MAXPATHLEN+50]; /* emacs command buffer */
135 char fullpath[MAXPATHLEN+1]; /* full pathname to file */ 196 char fullpath[MAXPATHLEN+1]; /* full pathname to file */
136 #ifndef GNUATTACH 197 #ifndef GNUATTACH
137 int qflg = 0; /* quick edit, don't wait for 198 int qflg = 0; /* quick edit, don't wait for
138 * user to finish */ 199 * user to finish */
139 #endif 200 #endif
153 #ifdef SYSV_IPC 214 #ifdef SYSV_IPC
154 struct msgbuf *msgp; /* message */ 215 struct msgbuf *msgp; /* message */
155 #endif /* SYSV_IPC */ 216 #endif /* SYSV_IPC */
156 #ifdef GNUATTACH 217 #ifdef GNUATTACH
157 char *tty; 218 char *tty;
219 char buffer[GSERV_BUFSZ+1]; /* buffer to read pid */
158 #endif 220 #endif
159 221
160 #ifdef INTERNET_DOMAIN_SOCKETS 222 #ifdef INTERNET_DOMAIN_SOCKETS
161 memset (remotepath, 0, sizeof (remotepath)); 223 memset (remotepath, 0, sizeof (remotepath));
162 #endif /* INTERNET_DOMAIN_SOCKETS */ 224 #endif /* INTERNET_DOMAIN_SOCKETS */
164 progname = argv[0]; 226 progname = argv[0];
165 227
166 while ((c = getopt (argc, argv, 228 while ((c = getopt (argc, argv,
167 229
168 #ifdef INTERNET_DOMAIN_SOCKETS 230 #ifdef INTERNET_DOMAIN_SOCKETS
169 # ifdef GNUATTACH
170 "h:p:r"
171 # else
172 "h:p:r:q" 231 "h:p:r:q"
173 # endif
174 #else /* !INTERNET_DOMAIN_SOCKETS */ 232 #else /* !INTERNET_DOMAIN_SOCKETS */
175 # ifdef GNUATTACH 233 # ifdef GNUATTACH
176 "" 234 ""
177 # else 235 # else
178 "q" 236 "q"
207 265
208 if (errflg) 266 if (errflg)
209 { 267 {
210 fprintf (stderr, 268 fprintf (stderr,
211 #ifdef INTERNET_DOMAIN_SOCKETS 269 #ifdef INTERNET_DOMAIN_SOCKETS
212 # ifdef GNUATTACH
213 "usage: %s [-h hostname] [-p port] [-r pathname] "
214 "[[+line] path] ...\n",
215 # else
216 "usage: %s [-q] [-h hostname] [-p port] [-r pathname] " 270 "usage: %s [-q] [-h hostname] [-p port] [-r pathname] "
217 "[[+line] path] ...\n", 271 "[[+line] path] ...\n",
218 # endif
219 #else /* !INTERNET_DOMAIN_SOCKETS */ 272 #else /* !INTERNET_DOMAIN_SOCKETS */
220 # ifdef GNUATTACH 273 # ifdef GNUATTACH
221 "usage: %s [[+line] path] ...\n", 274 "usage: %s [[+line] path] ...\n",
222 # else 275 # else
223 "usage: %s [-q] [[+line] path] ...\n", 276 "usage: %s [-q] [[+line] path] ...\n",
232 if (!tty) 285 if (!tty)
233 { 286 {
234 fprintf (stderr, "%s: Not connected to a tty", progname); 287 fprintf (stderr, "%s: Not connected to a tty", progname);
235 exit (1); 288 exit (1);
236 } 289 }
237 #endif 290
238 291 /* This next stuff added in an attempt to make handling of
239 #ifdef INTERNET_DOMAIN_SOCKETS 292 the tty do the right thing when dealing with signals.
293 Idea is to pass all the appropriate signals to the emacs process
294 */
295
296 connect_type = make_connection (NULL, (u_short) 0, &s);
297
298 send_string(s,"(server-eval '(emacs-pid))");
299 send_string(s,EOT_STR);
300
301 if (read_line(s,buffer) == 0) {
302 fprintf(stderr, "%s: Could not establish emacs procces id\n",progname);
303 exit(1);
304 }
305 /* don't do disconnect_from_server becasue we have already read data,
306 and disconnect doesn't do anything else
307 */
308 #ifdef SYSV_IPC
309 if (connect_type == (int) CONN_IPC)
310 disconnect_from_ipc_server (s, msgp, FALSE);
311 #endif /* !SYSV_IPC */
312
313 emacs_pid = (pid_t)atol(buffer);
314 initialize_signals();
315
316 #endif /*GNUATTACH */
317
318 #if defined(INTERNET_DOMAIN_SOCKETS) && !defined(GNUATTACH)
240 connect_type = make_connection (hostarg, portarg, &s); 319 connect_type = make_connection (hostarg, portarg, &s);
241 #else 320 #else
242 connect_type = make_connection (NULL, (u_short) 0, &s); 321 connect_type = make_connection (NULL, (u_short) 0, &s);
243 #endif 322 #endif
244 323
286 if (!ptr) 365 if (!ptr)
287 { 366 {
288 fprintf (stderr, "%s: unknown terminal type\n", progname); 367 fprintf (stderr, "%s: unknown terminal type\n", progname);
289 exit (1); 368 exit (1);
290 } 369 }
291 sprintf (command, "(server-tty-edit-files \"%s\" \"%s\" '(", tty, ptr); 370 sprintf (command, "(server-tty-edit-files \"%s\" \"%s\" %d '(",
371 tty, ptr, getpid());
292 send_string (s, command); 372 send_string (s, command);
293 #else 373 #else
294 if (qflg) 374 if (qflg)
295 { 375 {
296 send_string (s, "(server-edit-files-quickly '("); 376 send_string (s, "(server-edit-files-quickly '(");