Mercurial > hg > xemacs-beta
comparison lib-src/gnudoit.c @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | bcdc7deadc19 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 /* -*-C-*- | |
2 Client code to locally and remotely evaluate lisp forms using GNU Emacs. | |
3 | |
4 This file is part of GNU Emacs. | |
5 | |
6 Copying is permitted under those conditions described by the GNU | |
7 General Public License. | |
8 | |
9 Copyright (C) 1989 Free Software Foundation, Inc. | |
10 | |
11 Author: Andy Norman (ange@hplb.hpl.hp.com). | |
12 | |
13 Please mail bugs and suggestions to the author at the above address. | |
14 */ | |
15 | |
16 /* | |
17 * This file incorporates new features added by Bob Weiner <weiner@mot.com>, | |
18 * Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>. | |
19 * Please see the note at the end of the README file for details. | |
20 * | |
21 * (If gnuserv came bundled with your emacs, the README file is probably | |
22 * ../etc/gnuserv.README relative to the directory containing this file) | |
23 */ | |
24 | |
25 #if 0 | |
26 static char rcsid [] = "!Header: gnudoit.c,v 2.1 95/02/16 11:59:02 arup alpha !"; | |
27 #endif | |
28 | |
29 #include "gnuserv.h" | |
30 #include "getopt.h" | |
31 | |
32 #include <stdlib.h> | |
33 #include <stdio.h> | |
34 #include <sys/types.h> | |
35 #include <unistd.h> | |
36 | |
37 #if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS) | |
38 main () | |
39 { | |
40 fprintf (stderr,"Sorry, the Emacs server is only supported on systems that have\n"); | |
41 fprintf (stderr,"Unix Domain sockets, Internet Domain sockets or System V IPC.\n"); | |
42 exit (1); | |
43 } /* main */ | |
44 #else /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */ | |
45 | |
46 void | |
47 main(argc,argv) | |
48 int argc; | |
49 char *argv[]; | |
50 { | |
51 int qflg = 0; /* don't wait around for | |
52 * gnu emacs to eval cmd */ | |
53 int errflg = 0; /* option error */ | |
54 int c; /* char from getopt */ | |
55 int s; /* socket / msqid to server */ | |
56 int connect_type; /* CONN_UNIX, CONN_INTERNET, or | |
57 * CONN_IPC */ | |
58 #ifdef INTERNET_DOMAIN_SOCKETS | |
59 char *hostarg = NULL; /* remote hostname argument */ | |
60 u_short portarg = 0; /* port number */ | |
61 #endif /* INTERNET_DOMAIN_SOCKETS */ | |
62 #ifdef SYSV_IPC | |
63 struct msgbuf *msgp; /* message */ | |
64 #endif /* SYSV_IPC */ | |
65 | |
66 progname = argv[0]; | |
67 | |
68 while ((c = getopt(argc, argv, | |
69 #ifdef INTERNET_DOMAIN_SOCKETS | |
70 "qh:p:" | |
71 #else /* !INTERNET_DOMAIN_SOCKETS */ | |
72 "q" | |
73 #endif /* !INTERNET_DOMAIN_SOCKETS */ | |
74 )) != EOF) | |
75 switch (c) { | |
76 #ifdef INTERNET_DOMAIN_SOCKETS | |
77 case 'h': /* host name specified */ | |
78 hostarg = optarg; | |
79 break; | |
80 case 'p': /* port number specified */ | |
81 portarg = atoi(optarg); | |
82 break; | |
83 #endif /* INTERNET_DOMAIN_SOCKETS */ | |
84 case 'q': /* quick mode specified */ | |
85 qflg++; | |
86 break; | |
87 case '?': | |
88 errflg++; | |
89 }; /* switch */ | |
90 | |
91 if (errflg) { | |
92 fprintf(stderr, | |
93 #ifdef INTERNET_DOMAIN_SOCKETS | |
94 "usage: %s [-q] [-h hostname] [-p port] [sexpr]...\n", | |
95 #else /* !INTERNET_DOMAIN_SOCKETS */ | |
96 "usage: %s [-q] [sexpr]...\n", | |
97 #endif /* !INTERNET_DOMAIN_SOCKETS */ | |
98 progname); | |
99 exit (1); | |
100 }; /* if */ | |
101 | |
102 #ifdef INTERNET_DOMAIN_SOCKETS | |
103 connect_type = make_connection(hostarg, portarg, &s); | |
104 #else | |
105 connect_type = make_connection(NULL, (u_short) 0, &s); | |
106 #endif | |
107 | |
108 #ifdef SYSV_IPC | |
109 if ((msgp = (struct msgbuf *) | |
110 malloc(sizeof *msgp + GSERV_BUFSZ)) == NULL) { | |
111 fprintf(stderr,"%s: not enough memory for message buffer\n",progname); | |
112 exit(1); | |
113 }; /* if */ | |
114 | |
115 msgp->mtext[0] = '\0'; /* ready for later strcats */ | |
116 #endif /* SYSV_IPC */ | |
117 | |
118 if (qflg) { | |
119 send_string(s,"(server-eval-quickly '(progn "); | |
120 } | |
121 else { | |
122 send_string(s,"(server-eval '(progn "); | |
123 }; | |
124 | |
125 if (optind < argc) { | |
126 for (; optind < argc; optind++) { | |
127 send_string(s, argv[optind]); | |
128 send_string(s, " "); | |
129 } | |
130 } else { | |
131 /* no sexp on the command line, so read it from stdin */ | |
132 int nb; | |
133 char buf[GSERV_BUFSZ]; | |
134 while ((nb = read(fileno(stdin), buf, GSERV_BUFSZ-1)) > 0) { | |
135 buf[nb] = '\0'; | |
136 send_string(s, buf); | |
137 } | |
138 } | |
139 send_string(s,"))"); | |
140 | |
141 #ifdef SYSV_IPC | |
142 if (connect_type == (int) CONN_IPC) | |
143 disconnect_from_ipc_server(s,msgp,!qflg); | |
144 else | |
145 #else /* !SYSV_IPC */ | |
146 disconnect_from_server(s,!qflg); | |
147 #endif /* !SYSV_IPC */ | |
148 | |
149 exit(0); | |
150 | |
151 } /* main */ | |
152 | |
153 #endif /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */ |