diff options
author | Martin Baulig <martin@src.gnome.org> | 1998-06-14 17:05:37 +0000 |
---|---|---|
committer | Martin Baulig <martin@src.gnome.org> | 1998-06-14 17:05:37 +0000 |
commit | 7d0d3db11c0733214070e765417b20ff06e491a3 (patch) | |
tree | 81857497ef8701eaf6e519dd7423658753534388 | |
parent | 63c475d4009fa898865391f112704d67717d6a22 (diff) | |
download | libgtop-7d0d3db11c0733214070e765417b20ff06e491a3.tar.gz |
Removed again.
-rw-r--r-- | src/daemon/gnuclient.c | 620 | ||||
-rw-r--r-- | src/daemon/gnuserv.h | 190 | ||||
-rw-r--r-- | src/daemon/gnuslib.c | 454 |
3 files changed, 0 insertions, 1264 deletions
diff --git a/src/daemon/gnuclient.c b/src/daemon/gnuclient.c deleted file mode 100644 index 9048bd16..00000000 --- a/src/daemon/gnuclient.c +++ /dev/null @@ -1,620 +0,0 @@ -/* -*-C-*- - Client code to allow local and remote editing of files by XEmacs. - Copyright (C) 1989 Free Software Foundation, Inc. - Copyright (C) 1995 Sun Microsystems, Inc. - Copyright (C) 1997 Free Software Foundation, Inc. - -This file is part of XEmacs. - -XEmacs is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -XEmacs is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with XEmacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. - - Author: Andy Norman (ange@hplb.hpl.hp.com), based on - 'etc/emacsclient.c' from the GNU Emacs 18.52 distribution. - - Please mail bugs and suggestions to the author at the above address. -*/ - -/* - * This file incorporates new features added by Bob Weiner <weiner@mot.com>, - * Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>. - * GNUATTACH support added by Ben Wing <wing@xemacs.org>. - * Please see the note at the end of the README file for details. - * - * (If gnuserv came bundled with your emacs, the README file is probably - * ../etc/gnuserv.README relative to the directory containing this file) - */ - -#if 0 -/* Hand-munged RCS header */ -static char rcsid [] = "!Header: gnuclient.c,v 2.2 95/12/12 01:39:21 wing nene !"; -#endif - -#include "gnuserv.h" -#include "getopt.h" - -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> - -#ifdef HAVE_STRING_H -#include <string.h> -#endif /* HAVE_STRING_H */ - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif /* HAVE_UNISTD_H */ - -#include <signal.h> - -#if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && \ - !defined(INTERNET_DOMAIN_SOCKETS) -int -main (int argc, char *argv[]) -{ - fprintf (stderr, "Sorry, the Emacs server is only " - "supported on systems that have\n"); - fprintf (stderr, "Unix Domain sockets, Internet Domain " - "sockets or System V IPC.\n"); - exit (1); -} /* main */ -#else /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */ - -static char cwd[MAXPATHLEN+2]; /* current working directory when calculated */ -static char *cp = NULL; /* ptr into valid bit of cwd above */ - -static pid_t emacs_pid; /* Process id for emacs process */ - -void initialize_signals (void); - -static void -tell_emacs_to_resume (int sig) -{ - char buffer[GSERV_BUFSZ+1]; - int s; /* socket / msqid to server */ - int connect_type; /* CONN_UNIX, CONN_INTERNET, or - ONN_IPC */ - - /* Why is SYSV so retarded? */ - /* We want emacs to realize that we are resuming */ - signal(SIGCONT, tell_emacs_to_resume); - - connect_type = make_connection (NULL, (u_short) 0, &s); - - sprintf(buffer,"(gnuserv-eval '(resume-pid-console %d))", (int)getpid()); - send_string(s, buffer); - -#ifdef SYSV_IPC - if (connect_type == (int) CONN_IPC) - disconnect_from_ipc_server (s, msgp, FALSE); -#else /* !SYSV_IPC */ - if (connect_type != (int) CONN_IPC) - disconnect_from_server (s, FALSE); -#endif /* !SYSV_IPC */ -} - -static void -pass_signal_to_emacs (int sig) -{ - if (kill (emacs_pid, sig) == -1) - { - fprintf (stderr, "gnuattach: Could not pass signal to emacs process\n"); - exit (1); - } - initialize_signals (); -} - -void -initialize_signals () -{ - /* Set up signal handler to pass relevant signals to emacs process. - We used to send SIGSEGV, SIGBUS, SIGPIPE, SIGILL and others to - Emacs, but I think it's better not to. I can see no reason why - Emacs should SIGSEGV whenever gnuclient SIGSEGV-s, etc. */ - signal (SIGHUP, pass_signal_to_emacs); - signal (SIGQUIT, pass_signal_to_emacs); - signal (SIGINT, pass_signal_to_emacs); -#ifdef SIGWINCH - signal (SIGWINCH, pass_signal_to_emacs); -#endif - - /* We want emacs to realize that we are resuming */ - signal (SIGCONT, tell_emacs_to_resume); -} - - -/* - get_current_working_directory -- return the cwd. -*/ -static char * -get_current_working_directory (void) -{ - if (cp == NULL) - { /* haven't calculated it yet */ -#ifdef BSD - if (getwd (cwd) == 0) -#else /* !BSD */ - if (getcwd (cwd,MAXPATHLEN) == NULL) -#endif /* !BSD */ - { - perror (progname); - fprintf (stderr, "%s: unable to get current working directory\n", - progname); - exit (1); - } /* if */ - - /* on some systems, cwd can look like '@machine/' ... */ - /* ignore everything before the first '/' */ - for (cp = cwd; *cp && *cp != '/'; ++cp) - ; - - } /* if */ - - return cp; - -} /* get_current_working_directory */ - - -/* - filename_expand -- try to convert the given filename into a fully-qualified - pathname. -*/ -static void -filename_expand (char *fullpath, char *filename) - /* fullpath - returned full pathname */ - /* filename - filename to expand */ -{ - int len; - - fullpath[0] = '\0'; - - if (filename[0] && filename[0] != '/') - { /* relative filename */ - strcat (fullpath, get_current_working_directory ()); - len = strlen (fullpath); - - if (len > 0 && fullpath[len-1] == '/') /* trailing slash already? */ - ; /* yep */ - else - strcat (fullpath, "/"); /* nope, append trailing slash */ - } /* if */ - - strcat (fullpath,filename); - -} /* filename_expand */ - -/* Encase the string in quotes, escape all the backslashes and quotes - in string. */ -static char * -clean_string (const char *s) -{ - int i = 0; - char *p, *res; - - for (p = s; *p; p++, i++) - { - if (*p == '\\' || *p == '\"') - ++i; - else if (*p == '\004') - i += 3; - } - p = res = (char *)malloc (i + 2 + 1); - *p++ = '\"'; - for (; *s; p++, s++) - { - switch (*s) - { - case '\\': - *p++ = '\\'; - *p = '\\'; - break; - case '\"': - *p++ = '\\'; - *p = '\"'; - break; - case '\004': - *p++ = '\\'; - *p++ = 'C'; - *p++ = '-'; - *p = 'd'; - break; - default: - *p = *s; - } - } - *p++ = '\"'; - *p = '\0'; - return res; -} - -#define GET_ARGUMENT(var, desc) do { \ - if (*(p + 1)) (var) = p + 1; \ - else \ - { \ - if (!argv[++i]) \ - { \ - fprintf (stderr, "%s: `%s' must be followed by an argument\n", \ - progname, desc); \ - exit (1); \ - } \ - (var) = argv[i]; \ - } \ - over = 1; \ -} while (0) - -/* A strdup immitation. */ -static char * -my_strdup (const char *s) -{ - char *new = malloc (strlen (s) + 1); - if (new) - strcpy (new, s); - return new; -} - -int -main (int argc, char *argv[]) -{ - int starting_line = 1; /* line to start editing at */ - char command[MAXPATHLEN+50]; /* emacs command buffer */ - char fullpath[MAXPATHLEN+1]; /* full pathname to file */ - char *eval_form = NULL; /* form to evaluate with `-eval' */ - char *eval_function = NULL; /* function to evaluate with `-f' */ - char *load_library = NULL; /* library to load */ - int quick = 0; /* quick edit, don't wait for user to - finish */ - int batch = 0; /* batch mode */ - int view = 0; /* view only. */ - int nofiles = 0; - int errflg = 0; /* option error */ - int s; /* socket / msqid to server */ - int connect_type; /* CONN_UNIX, CONN_INTERNET, or - * CONN_IPC */ - int suppress_windows_system = 0; - char *display = NULL; -#ifdef INTERNET_DOMAIN_SOCKETS - char *hostarg = NULL; /* remote hostname */ - char *remotearg; - char thishost[HOSTNAMSZ]; /* this hostname */ - char remotepath[MAXPATHLEN+1]; /* remote pathname */ - char *path; - int rflg = 0; /* pathname given on cmdline */ - char *portarg; - u_short port = 0; /* port to server */ -#endif /* INTERNET_DOMAIN_SOCKETS */ -#ifdef SYSV_IPC - struct msgbuf *msgp; /* message */ -#endif /* SYSV_IPC */ - char *tty = NULL; - char buffer[GSERV_BUFSZ + 1]; /* buffer to read pid */ - char result[GSERV_BUFSZ + 1]; - int i; - -#ifdef INTERNET_DOMAIN_SOCKETS - memset (remotepath, 0, sizeof (remotepath)); -#endif /* INTERNET_DOMAIN_SOCKETS */ - - progname = strrchr (argv[0], '/'); - if (progname) - ++progname; - else - progname = argv[0]; - - display = getenv ("DISPLAY"); - if (!display) - suppress_windows_system = 1; - else - display = my_strdup (display); - - for (i = 1; argv[i] && !errflg; i++) - { - if (*argv[i] != '-') - break; - else if (*argv[i] == '-' - && (*(argv[i] + 1) == '\0' - || (*(argv[i] + 1) == '-' && *(argv[i] + 2) == '\0'))) - { - /* `-' or `--' */ - ++i; - break; - } - - if (!strcmp (argv[i], "-batch") || !strcmp (argv[i], "--batch")) - batch = 1; - else if (!strcmp (argv[i], "-eval") || !strcmp (argv[i], "--eval")) - { - if (!argv[++i]) - { - fprintf (stderr, "%s: `-eval' must be followed by an argument\n", - progname); - exit (1); - } - eval_form = argv[i]; - } - else if (!strcmp (argv[i], "-display") || !strcmp (argv[i], "--display")) - { - suppress_windows_system = 0; - if (!argv[++i]) - { - fprintf (stderr, - "%s: `-display' must be followed by an argument\n", - progname); - exit (1); - } - if (display) - free (display); - /* no need to strdup. */ - display = argv[i]; - } - else if (!strcmp (argv[i], "-nw")) - suppress_windows_system = 1; - else - { - /* Iterate over one-letter options. */ - char *p; - int over = 0; - for (p = argv[i] + 1; *p && !over; p++) - { - switch (*p) - { - case 'q': - quick = 1; - break; - case 'v': - view = 1; - break; - case 'f': - GET_ARGUMENT (eval_function, "-f"); - break; - case 'l': - GET_ARGUMENT (load_library, "-l"); - break; -#ifdef INTERNET_DOMAIN_SOCKETS - case 'h': - GET_ARGUMENT (hostarg, "-h"); - break; - case 'p': - GET_ARGUMENT (portarg, "-p"); - port = atoi (portarg); - break; - case 'r': - GET_ARGUMENT (remotearg, "-r"); - strcpy (remotepath, remotearg); - rflg = 1; - break; -#endif /* INTERNET_DOMAIN_SOCKETS */ - default: - errflg = 1; - } - } /* for */ - } /* else */ - } /* for */ - - if (errflg) - { - fprintf (stderr, -#ifdef INTERNET_DOMAIN_SOCKETS - "usage: %s [-nw] [-display display] [-q] [-v] [-l library]\n" - " [-batch] [-f function] [-eval form]\n" - " [-h host] [-p port] [-r remote-path] [[+line] file] ...\n", -#else /* !INTERNET_DOMAIN_SOCKETS */ - "usage: %s [-nw] [-q] [-v] [-l library] [-f function] [-eval form] " - "[[+line] path] ...\n", -#endif /* !INTERNET_DOMAIN_SOCKETS */ - progname); - exit (1); - } - if (batch && argv[i]) - { - fprintf (stderr, "%s: Cannot specify `-batch' with file names\n", - progname); - exit (1); - } - if (suppress_windows_system && hostarg) - { - fprintf (stderr, "%s: Remote editing is available only on X\n", - progname); - exit (1); - } - - *result = '\0'; - if (eval_function || eval_form || load_library) - { -#if defined(INTERNET_DOMAIN_SOCKETS) - connect_type = make_connection (hostarg, port, &s); -#else - connect_type = make_connection (NULL, (u_short) 0, &s); -#endif - sprintf (command, "(gnuserv-eval%s '(progn ", quick ? "-quickly" : ""); - send_string (s, command); - if (load_library) - { - sprintf (command, " (load-library %s)", clean_string (load_library)); - send_string (s, command); - } - if (eval_form) - { - sprintf (command, " %s", eval_form); - send_string (s, command); - } - if (eval_function) - { - sprintf (command, " (%s)", eval_function); - send_string (s, command); - } - send_string (s, "))"); - send_string (s, EOT_STR); - if (read_line (s, result) == 0) - { - fprintf (stderr, "%s: Could not read\n", progname); - exit (1); - } - } /* eval_function || eval_form || load_library */ - else if (batch) - { - fprintf (stderr, "%s: `-batch' requires an evaluation\n", - progname); - exit (1); - } - - if (!batch) - { - if (suppress_windows_system) - { - tty = ttyname (0); - if (!tty) - { - fprintf (stderr, "%s: Not connected to a tty", progname); - exit (1); - } -#if defined(INTERNET_DOMAIN_SOCKETS) - connect_type = make_connection (hostarg, port, &s); -#else - connect_type = make_connection (NULL, (u_short) 0, &s); -#endif - send_string (s, "(gnuserv-eval '(emacs-pid))"); - send_string (s, EOT_STR); - - if (read_line (s, buffer) == 0) - { - fprintf (stderr, "%s: Could not establish Emacs procces id\n", - progname); - exit (1); - } - /* Don't do disconnect_from_server becasue we have already read - data, and disconnect doesn't do anything else. */ -#ifndef INTERNET_DOMAIN_SOCKETS - if (connect_type == (int) CONN_IPC) - disconnect_from_ipc_server (s, msgp, FALSE); -#endif /* !SYSV_IPC */ - - emacs_pid = (pid_t)atol(buffer); - initialize_signals(); - } /* suppress_windows_system */ - -#if defined(INTERNET_DOMAIN_SOCKETS) - connect_type = make_connection (hostarg, port, &s); -#else - connect_type = make_connection (NULL, (u_short) 0, &s); -#endif - -#ifdef INTERNET_DOMAIN_SOCKETS - if (connect_type == (int) CONN_INTERNET) - { - char *ptr; - gethostname (thishost, HOSTNAMSZ); - if (!rflg) - { /* attempt to generate a path - * to this machine */ - if ((ptr = getenv ("GNU_NODE")) != NULL) - /* user specified a path */ - strcpy (remotepath, ptr); - } -#if 0 /* This is really bogus... re-enable it if you must have it! */ -#if defined (hp9000s300) || defined (hp9000s800) - else if (strcmp (thishost,hostarg)) - { /* try /net/thishost */ - strcpy (remotepath, "/net/"); /* (this fails using internet - addresses) */ - strcat (remotepath, thishost); - } -#endif -#endif - } - else - { /* same machines, no need for path */ - remotepath[0] = '\0'; /* default is the empty path */ - } -#endif /* INTERNET_DOMAIN_SOCKETS */ - -#ifdef SYSV_IPC - if ((msgp = (struct msgbuf *) - malloc (sizeof *msgp + GSERV_BUFSZ)) == NULL) - { - fprintf (stderr, "%s: not enough memory for message buffer\n", progname); - exit (1); - } /* if */ - - msgp->mtext[0] = '\0'; /* ready for later strcats */ -#endif /* SYSV_IPC */ - - if (suppress_windows_system) - { - char *term = getenv ("TERM"); - if (!term) - { - fprintf (stderr, "%s: unknown terminal type\n", progname); - exit (1); - } - sprintf (command, "(gnuserv-edit-files '(tty %s %s %d) '(", - clean_string (tty), clean_string (term), (int)getpid ()); - } - else /* !suppress_windows_system */ - { - sprintf (command, "(gnuserv-edit-files '(x %s) '(", - clean_string (display)); - } /* !suppress_windows_system */ - send_string (s, command); - - if (!argv[i]) - nofiles = 1; - - for (; argv[i]; i++) - { - if (i < argc - 1 && *argv[i] == '+') - starting_line = atoi (argv[i++]); - else - starting_line = 1; - /* If the last argument is +something, treat it as a file. */ - if (i == argc) - { - starting_line = 1; - --i; - } - filename_expand (fullpath, argv[i]); -#ifdef INTERNET_DOMAIN_SOCKETS - path = malloc (strlen (remotepath) + strlen (fullpath) + 1); - sprintf (path, "%s%s", remotepath, fullpath); -#else - path = my_strdup (fullpath); -#endif - sprintf (command, "(%d . %s)", starting_line, clean_string (path)); - send_string (s, command); - free (path); - } /* for */ - - sprintf (command, ")%s%s", - (quick || (nofiles && !suppress_windows_system)) ? " 'quick" : "", - view ? " 'view" : ""); - send_string (s, command); - send_string (s, ")"); - -#ifdef SYSV_IPC - if (connect_type == (int) CONN_IPC) - disconnect_from_ipc_server (s, msgp, FALSE); -#else /* !SYSV_IPC */ - if (connect_type != (int) CONN_IPC) - disconnect_from_server (s, FALSE); -#endif /* !SYSV_IPC */ - } /* not batch */ - - if (batch && !quick) - printf ("%s\n", result); - - return 0; - -} /* main */ - -#endif /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */ diff --git a/src/daemon/gnuserv.h b/src/daemon/gnuserv.h deleted file mode 100644 index b370f297..00000000 --- a/src/daemon/gnuserv.h +++ /dev/null @@ -1,190 +0,0 @@ -/* -*-C-*- - - Header file for the GNU Emacs server and client C code. - - This file is part of GNU Emacs. - - Copying is permitted under those conditions described by the GNU - General Public License. - - Copyright (C) 1989 Free Software Foundation, Inc. - - Author: Andy Norman (ange@hplb.hpl.hp.com), based on - 'etc/server.c' and 'etc/emacsclient.c' from the 18.52 GNU - Emacs distribution. - - Please mail bugs and suggestions to the author at the above address. -*/ - -/* HISTORY - * 11-Nov-1990 bristor@simba - * Added EOT stuff. - */ - -/* - * This file incorporates new features added by Bob Weiner <weiner@mot.com>, - * Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>. - * Please see the note at the end of the README file for details. - * - * (If gnuserv came bundled with your emacs, the README file is probably - * ../etc/gnuserv.README relative to the directory containing this file) - */ - -#if 0 -static char header_rcsid [] = "!Header: gnuserv.h,v 2.4 95/02/16 11:58:11 arup alpha !"; -#endif - -#define NO_SHORTNAMES - -#define PATCHLEVEL 2 - -#define NO_SHORTNAMES -/* gnuserv should not be compiled using SOCKS */ -#define DO_NOT_SOCKSIFY -#include <glibtop/global.h> -#undef read -#undef write -#undef open -#undef close -#undef signal - -/* Define the communication method between server and clients: - * You can have either or both kinds of sockets, but you can't mix - * sockets with sysv ipc - */ - - -#define INTERNET_DOMAIN_SOCKETS -#define UNIX_DOMAIN_SOCKETS -/* #define SYSV_IPC */ - -/* - * Define additional authentication protocols to be used. These methods will - * be tried before falling back to the default gnuserv protocol (based on - * the GNU_SECURE environment variable). Currently, only MIT-MAGIC-COOKIE-1 - * is also supported. - * - * Comment out the next line(s) if you don't want to enable the - * appropriate authentication protocol. - */ - -#if defined (HAVE_XAUTH) -#define AUTH_MAGIC_COOKIE -#endif /* HAVE_XAUTH */ - -/* - * stuff related to supporting MIT-MAGIC-COOKIE-1 - */ - -#define MCOOKIE_SCREEN "999" /* screen # to use as the gnuserv cookie */ -#define MCOOKIE_NAME "MAGIC-1" /* authentication protocol name */ -#define MCOOKIE_X_NAME "MIT-MAGIC-COOKIE-1" /* as needed by X */ - - -#define DEFAUTH_NAME "GNU-SECURE" /* name of default auth protocol */ -#define AUTH_TIMEOUT 15 /* # seconds to wait for auth data */ -#define AUTH_NAMESZ 15 /* max allows auth protocol name size */ - - -/* - * Pick a default communication scheme, if none was specified. - */ - -#if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS) - -#ifdef HAVE_SYSVIPC -#define SYSV_IPC /* SYSV systems use SYSV IPC by default */ -#endif /* HAVE_SYSVIPC */ - -#ifdef BSD -#define UNIX_DOMAIN_SOCKETS /* BSD systems use Unix Domain sockets by default */ -#endif /* BSD */ - -#endif /* No communication method pre-defined */ - -/* - * If you are using SYSV_IPC, you might want to make the buffer size bigger - * since it limits the size of requests and responses. Don't make it bigger - * than your system's max message size though (usually a couple of k) or else - * msgsend will start failing. For sockets, using the system BUFSIZ is usually - * what you want. - */ - -# define GSERV_BUFSZ BUFSIZ - - -#ifdef SYSV_IPC -#include <sys/ipc.h> -#include <sys/msg.h> - -#define send_string(s,str) \ - if (strlen(msgp->mtext) + strlen(str) < GSERV_BUFSZ) \ - strcat(msgp->mtext,str); \ - else \ - { \ - fprintf(stderr,"%s: not enough message buffer space\n",progname); \ - exit(1); \ - } \ - -#endif /* SYSV_IPC */ - -#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) -#include <sys/socket.h> -#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */ - -#ifdef INTERNET_DOMAIN_SOCKETS -#include <netdb.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#define TABLE_SIZE 101 /* The number of entries in the hash table */ -#define HASH(host) host /* Rather simplistic hash function */ -#define DEFAULT_PORT 21490 /* default port number to use is - * DEFAULT_PORT + uid */ -#endif /* INTERNET_DOMAIN_SOCKETS */ - -#ifdef UNIX_DOMAIN_SOCKETS -#include <sys/un.h> -#define HIDE_UNIX_SOCKET /* put the unix socket in a protected dir */ -#endif /* UNIX_DOMAIN_SOCKETS */ - -#define HOSTNAMSZ 255 /* max size of a hostname */ -#define REPLYSIZ 300 /* max size of reply from server to client */ -#undef FALSE -#define FALSE 0 -#undef TRUE -#define TRUE 1 - -extern char *optarg; -extern int optind; -extern char *progname; - -/* The casts shut Sun's compiler up and are safe in the context these - are actually used. */ -#define max2(x,y) (((int) (x) > (int) (y)) ? (x) : (y)) -#define min2(x,y) (((int) (x) < (int) (y)) ? (x) : (y)) - -#ifndef _NFILE /* rough guess at maximum number of open files */ -#define _NFILE 20 -#endif - -#define EOT_STR "\004" -#define EOT_CHR '\004' - -/* connection types */ -#define CONN_UNIX 0 -#define CONN_INTERNET 1 -#define CONN_IPC 2 - -/* function declarations */ -int make_connection (char *hostarg, int portarg, int *s); -#ifdef SYSV_IPC -void disconnect_from_ipc_server(); -#endif -#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) -void send_string (int s, const char *msg); -void disconnect_from_server (int s, int echo); -int read_line (int s, char *dest); -#endif -#ifdef INTERNET_DOMAIN_SOCKETS -int internet_addr (char *host); -#endif diff --git a/src/daemon/gnuslib.c b/src/daemon/gnuslib.c deleted file mode 100644 index ca052f38..00000000 --- a/src/daemon/gnuslib.c +++ /dev/null @@ -1,454 +0,0 @@ -/* -*-C-*- - Common library code for the GNU Emacs server and client. - - This file is part of GNU Emacs. - - Copying is permitted under those conditions described by the GNU - General Public License. - - Copyright (C) 1989 Free Software Foundation, Inc. - - Author: Andy Norman (ange@hplb.hpl.hp.com), based on - 'etc/server.c' and 'etc/emacsclient.c' from the 18.52 GNU - Emacs distribution. - - Please mail bugs and suggestions to the author at the above address. -*/ - -/* HISTORY - * 11-Nov-1990 bristor@simba - * Added EOT stuff. - */ - -/* - * This file incorporates new features added by Bob Weiner <weiner@mot.com>, - * Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>. - * Please see the note at the end of the README file for details. - * - * (If gnuserv came bundled with your emacs, the README file is probably - * ../etc/gnuserv.README relative to the directory containing this file) - */ - -#if 0 -static char rcsid [] = "!Header: gnuslib.c,v 2.4 95/02/16 11:57:37 arup alpha !"; -#endif - -#include "gnuserv.h" -#include <errno.h> - -#ifdef SYSV_IPC -static int connect_to_ipc_server (void); -#endif -#ifdef UNIX_DOMAIN_SOCKETS -static int connect_to_unix_server (void); -#endif -#ifdef INTERNET_DOMAIN_SOCKETS -static int connect_to_internet_server (char *serverhost, u_short port); -#endif - -/* On some systems, e.g. DGUX, inet_addr returns a 'struct in_addr'. */ -#ifdef HAVE_BROKEN_INET_ADDR -# define IN_ADDR struct in_addr -# define NUMERIC_ADDR_ERROR (numeric_addr.s_addr == -1) -#else -# if (LONGBITS > 32) -# define IN_ADDR unsigned int -# else -# define IN_ADDR unsigned long -# endif -# define NUMERIC_ADDR_ERROR (numeric_addr == (IN_ADDR) -1) -#endif - -#include <stdlib.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif /* HAVE_UNISTD_H */ -#ifdef HAVE_STRING_H -#include <string.h> -#endif /* HAVE_STRING_H */ - -#include <arpa/inet.h> - -char *progname = NULL; - -int make_connection(hostarg, portarg, s) - char *hostarg; - int portarg; - int *s; -{ -#ifdef INTERNET_DOMAIN_SOCKETS - char *ptr; - if (hostarg == NULL) - hostarg = getenv("GNU_HOST"); - if (portarg == 0 && (ptr=getenv("GNU_PORT")) != NULL) - portarg = atoi(ptr); -#endif - - if (hostarg != NULL) { - /* hostname was given explicitly, via cmd line arg or GNU_HOST, - * so obey it. */ -#ifdef UNIX_DOMAIN_SOCKETS - if (!strcmp(hostarg, "unix")) { - *s = connect_to_unix_server(); - return (int) CONN_UNIX; - } -#endif /* UNIX_DOMAIN_SOCKETS */ -#ifdef INTERNET_DOMAIN_SOCKETS - *s = connect_to_internet_server(hostarg, portarg); - return (int) CONN_INTERNET; -#endif -#ifdef SYSV_IPC - return -1; /* hostarg should always be NULL for SYSV_IPC */ -#endif - } else { - /* no hostname given. Use unix-domain/sysv-ipc, or - * internet-domain connection to local host if they're not available. */ -#if defined(UNIX_DOMAIN_SOCKETS) - *s = connect_to_unix_server(); - return (int) CONN_UNIX; -#elif defined(SYSV_IPC) - *s = connect_to_ipc_server(); - return (int) CONN_IPC; -#elif defined(INTERNET_DOMAIN_SOCKETS) - { - char localhost[HOSTNAMSZ]; - gethostname(localhost,HOSTNAMSZ); /* use this host by default */ - *s = connect_to_internet_server(localhost, portarg); - return (int) CONN_INTERNET; - } -#endif /* IPC type */ - } -} - -#ifdef SYSV_IPC -/* - connect_to_ipc_server -- establish connection with server process via SYSV IPC - Returns msqid for server if successful. -*/ -static int connect_to_ipc_server (void) -{ - int s; /* connected msqid */ - key_t key; /* message key */ - char buf[GSERV_BUFSZ+1]; /* buffer for filename */ - - sprintf(buf,"/tmp/gsrv%d",(int)geteuid()); - creat(buf,0600); - if ((key = ftok(buf,1)) == -1) { - perror(progname); - fprintf(stderr, "%s: unable to get ipc key from %s\n", - progname, buf); - exit(1); - } - - if ((s = msgget(key,0600)) == -1) { - perror(progname); - fprintf(stderr,"%s: unable to access msg queue\n",progname); - exit(1); - }; /* if */ - - return(s); - -} /* connect_to_ipc_server */ - - -/* - disconnect_from_ipc_server -- inform the server that sending has finished, - and wait for its reply. -*/ -void disconnect_from_ipc_server(s,msgp,echo) - int s; - struct msgbuf *msgp; - int echo; -{ - int len; /* length of received message */ - - send_string(s,EOT_STR); /* EOT terminates this message */ - msgp->mtype = 1; - - if(msgsnd(s,msgp,strlen(msgp->mtext)+1,0) < 0) { - perror(progname); - fprintf(stderr,"%s: unable to send message to server\n",progname); - exit(1); - }; /* if */ - - if((len = msgrcv(s,msgp,GSERV_BUFSZ,getpid(),0)) < 0) { - perror(progname); - fprintf(stderr,"%s: unable to receive message from server\n",progname); - exit(1); - }; /* if */ - - if (echo) { - msgp->mtext[len] = '\0'; /* string terminate message */ - fputs(msgp->mtext, stdout); - if (msgp->mtext[len-1] != '\n') putchar ('\n'); - }; /* if */ - -} /* disconnect_from_ipc_server */ -#endif /* SYSV_IPC */ - - -#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) -/* - send_string -- send string to socket. -*/ -void send_string(s,msg) - int s; - const char *msg; -{ -#if 0 - if (send(s,msg,strlen(msg),0) < 0) { - perror(progname); - fprintf(stderr,"%s: unable to send\n",progname); - exit(1); - }; /* if */ -#else - int len, left=strlen(msg); - while (left > 0) { - if ((len=write(s,msg,min2(left,GSERV_BUFSZ))) < 0) { - /* XEmacs addition: robertl@arnet.com */ - if (errno == EPIPE) { - return ; - } - perror(progname); - fprintf(stderr,"%s: unable to send\n",progname); - exit(1); - }; /* if */ - left -= len; - msg += len; - }; /* while */ -#endif -} /* send_string */ - -/* - read_line -- read a \n terminated line from a socket -*/ -int read_line(int s, char *dest) -{ - int length; - int offset=0; - char buffer[GSERV_BUFSZ+1]; - - while ((length=read(s,buffer+offset,1)>0) && buffer[offset]!='\n' - && buffer[offset] != EOT_CHR) { - offset += length; - if (offset >= GSERV_BUFSZ) - break; - } - buffer[offset] = '\0'; - strcpy(dest,buffer); - return 1; -} /* read_line */ -#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */ - - -#ifdef UNIX_DOMAIN_SOCKETS -/* - connect_to_unix_server -- establish connection with server process via a unix- - domain socket. Returns socket descriptor for server - if successful. -*/ -static int connect_to_unix_server (void) -{ - int s; /* connected socket descriptor */ - struct sockaddr_un server; /* for unix connections */ - - if ((s = socket(AF_UNIX,SOCK_STREAM,0)) < 0) { - perror(progname); - fprintf(stderr,"%s: unable to create socket\n",progname); - exit(1); - }; /* if */ - - server.sun_family = AF_UNIX; -#ifdef HIDE_UNIX_SOCKET - sprintf(server.sun_path,"/tmp/gsrvdir%d/gsrv",(int)geteuid()); -#else /* HIDE_UNIX_SOCKET */ - sprintf(server.sun_path,"/tmp/gsrv%d",(int)geteuid()); -#endif /* HIDE_UNIX_SOCKET */ - if (connect(s,(struct sockaddr *)&server,strlen(server.sun_path)+2) < 0) { - perror(progname); - fprintf(stderr,"%s: unable to connect to local\n",progname); - exit(1); - }; /* if */ - - return(s); - -} /* connect_to_unix_server */ -#endif /* UNIX_DOMAIN_SOCKETS */ - - -#ifdef INTERNET_DOMAIN_SOCKETS -/* - internet_addr -- return the internet addr of the hostname or - internet address passed. Return -1 on error. -*/ -int internet_addr(host) - char *host; -{ - struct hostent *hp; /* pointer to host info for remote host */ - IN_ADDR numeric_addr; /* host address */ - - numeric_addr = inet_addr(host); - if (!NUMERIC_ADDR_ERROR) - return numeric_addr; - else if ((hp = gethostbyname(host)) != NULL) - return ((struct in_addr *)(hp->h_addr))->s_addr; - else - return -1; - -} /* internet_addr */ - -#ifdef AUTH_MAGIC_COOKIE -# include <X11/X.h> -# include <X11/Xauth.h> - -static Xauth *server_xauth = NULL; -#endif - -/* - connect_to_internet_server -- establish connection with server process via - an internet domain socket. Returns socket - descriptor for server if successful. -*/ -static int connect_to_internet_server (char *serverhost, u_short port) -{ - int s; /* connected socket descriptor */ - struct servent *sp; /* pointer to service information */ - struct sockaddr_in peeraddr_in; /* for peer socket address */ - char buf[512]; /* temporary buffer */ - - /* clear out address structures */ - memset((char *)&peeraddr_in,0,sizeof(struct sockaddr_in)); - - /* Set up the peer address to which we will connect. */ - peeraddr_in.sin_family = AF_INET; - - /* look up the server host's internet address */ - if ((peeraddr_in.sin_addr.s_addr = internet_addr(serverhost)) == -1) { - fprintf(stderr,"%s: unable to find %s in /etc/hosts or from YP\n", - progname,serverhost); - exit(1); - }; /* if */ - - if (port == 0) { - if ((sp = getservbyname ("gnuserv","tcp")) == NULL) - peeraddr_in.sin_port = htons(DEFAULT_PORT+getuid()); - else - peeraddr_in.sin_port = sp->s_port; - } /* if */ - else - peeraddr_in.sin_port = htons(port); - - /* Create the socket. */ - if ((s = socket (AF_INET,SOCK_STREAM, 0))== -1) { - perror(progname); - fprintf(stderr,"%s: unable to create socket\n",progname); - exit(1); - }; /* if */ - - /* Try to connect to the remote server at the address - * which was just built into peeraddr. - */ - if (connect(s, (struct sockaddr *)&peeraddr_in, - sizeof(struct sockaddr_in)) == -1) { - perror(progname); - fprintf(stderr, "%s: unable to connect to remote\n",progname); - exit(1); - }; /* if */ - -#ifdef AUTH_MAGIC_COOKIE - - /* send credentials using MIT-MAGIC-COOKIE-1 protocol */ - - server_xauth = - XauGetAuthByAddr(FamilyInternet, - sizeof(peeraddr_in.sin_addr.s_addr), - (char *) &peeraddr_in.sin_addr.s_addr, - strlen(MCOOKIE_SCREEN), MCOOKIE_SCREEN, - strlen(MCOOKIE_X_NAME), MCOOKIE_X_NAME); - - if (server_xauth && server_xauth->data) { - sprintf(buf, "%s\n%d\n", MCOOKIE_NAME, server_xauth->data_length); - write (s, buf, strlen(buf)); - write (s, server_xauth->data, server_xauth->data_length); - - return (s); - } - -#endif /* AUTH_MAGIC_COOKIE */ - - sprintf (buf, "%s\n", DEFAUTH_NAME); - write (s, buf, strlen(buf)); - - return(s); - -} /* connect_to_internet_server */ -#endif /* INTERNET_DOMAIN_SOCKETS */ - - -#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS) -/* - disconnect_from_server -- inform the server that sending has finished, and wait for - its reply. -*/ -void disconnect_from_server(s,echo) - int s; - int echo; -{ -#if 0 - char buffer[REPLYSIZ+1]; -#else - char buffer[GSERV_BUFSZ+1]; -#endif - int add_newline = 1; - int length; - - send_string(s,EOT_STR); /* make sure server gets string */ - -#if !defined (linux) && !defined (_SCO_DS) - /* - * shutdown is completely hozed under linux. If s is a unix domain socket, - * you'll get EOPNOTSUPP back from it. If s is an internet socket, you get - * a broken pipe when you try to read a bit later. The latter - * problem is fixed for linux versions >= 1.1.46, but the problem - * with unix sockets persists. Sigh. - */ - - if (shutdown(s,1) == -1) { - perror(progname); - fprintf(stderr, "%s: unable to shutdown socket\n",progname); - exit(1); - }; /* if */ -#endif - -#if 0 - while((length = recv(s,buffer,REPLYSIZ,0)) > 0) { - buffer[length] = '\0'; - if (echo) fputs(buffer,stdout); - add_newline = (buffer[length-1] != '\n'); - }; /* while */ -#else - while ((length = read(s,buffer,GSERV_BUFSZ)) > 0 || - (length == -1 && errno == EINTR)) { - if (length) { - buffer[length] = '\0'; - if (echo) { - fputs(buffer,stdout); - add_newline = (buffer[length-1] != '\n'); - }; /* if */ - }; /* if */ - }; /* while */ -#endif - - if (echo && add_newline) putchar('\n'); - - if(length < 0) { - perror(progname); - fprintf(stderr,"%s: unable to read the reply from the server\n",progname); - exit(1); - }; /* if */ - -} /* disconnect_from_server */ -#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */ |