Changed indentation using

'indent -br -ce -sc -pcs -cs -bs -i8 -bad -bap -fca'
This commit is contained in:
Martin Baulig
1998-07-12 14:22:45 +00:00
parent eb8d28b694
commit b177c3930d

View File

@@ -1,19 +1,19 @@
/* -*-C-*-
Server code for handling requests from clients and forwarding them
on to the GNU Emacs process.
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'
from the 18.52 GNU Emacs distribution.
Please mail bugs and suggestions to the author at the above address.
*/
* Server code for handling requests from clients and forwarding them
* on to the GNU Emacs process.
*
* 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'
* 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
@@ -30,7 +30,8 @@
*/
#if 0
static char rcsid [] = "!Header: gnuserv.c,v 2.1 95/02/16 11:58:27 arup alpha !";
static char rcsid[] = "!Header: gnuserv.c,v 2.1 95/02/16 11:58:27 arup alpha !";
#endif
#define DEBUG
@@ -42,15 +43,16 @@ static char rcsid [] = "!Header: gnuserv.c,v 2.1 95/02/16 11:58:27 arup alpha !"
#include <sys/select.h>
#endif
extern void handle_socket_connection __P((glibtop *, int));
extern void handle_socket_connection __P ((glibtop *, int));
#if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS)
main ()
{
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");
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 */
#ifdef SYSV_IPC
@@ -60,13 +62,13 @@ int ipc_wpid = 0; /* watchdog task pid */
/*
ipc_exit -- clean up the queue id and queue, then kill the watchdog task
if it exists. exit with the given status.
*/
* ipc_exit -- clean up the queue id and queue, then kill the watchdog task
* if it exists. exit with the given status.
*/
void
ipc_exit (int stat)
{
msgctl (ipc_qid,IPC_RMID,0);
msgctl (ipc_qid, IPC_RMID, 0);
if (ipc_wpid != 0)
kill (ipc_wpid, SIGKILL);
@@ -76,78 +78,73 @@ ipc_exit (int stat)
/*
ipc_handle_signal -- catch the signal given and clean up.
*/
* ipc_handle_signal -- catch the signal given and clean up.
*/
void
ipc_handle_signal(int sig)
ipc_handle_signal (int sig)
{
ipc_exit (0);
} /* ipc_handle_signal */
/*
ipc_spawn_watchdog -- spawn a watchdog task to clean up the message queue should the
server process die.
*/
* ipc_spawn_watchdog -- spawn a watchdog task to clean up the message queue should the
* server process die.
*/
void
ipc_spawn_watchdog (void)
{
if ((ipc_wpid = fork ()) == 0)
{ /* child process */
if ((ipc_wpid = fork ()) == 0) { /* child process */
int ppid = getppid (); /* parent's process id */
setpgrp(); /* gnu kills process group on exit */
setpgrp (); /* gnu kills process group on exit */
while (1)
{
if (kill (ppid, 0) < 0) /* ppid is no longer valid, parent
may have died */
{
while (1) {
if (kill (ppid, 0) < 0) { /* ppid is no longer
* valid, parent may
* have died */
ipc_exit (0);
} /* if */
sleep(10); /* have another go later */
sleep (10); /* have another go later */
} /* while */
} /* if */
} /* ipc_spawn_watchdog */
/*
ipc_init -- initialize server, setting the global msqid that can be listened on.
*/
* ipc_init -- initialize server, setting the global msqid that can be listened on.
*/
void
ipc_init (struct msgbuf **msgpp)
{
key_t key; /* messge key */
char buf[GSERV_BUFSZ]; /* pathname for key */
sprintf (buf,"/tmp/lgtd%d",(int)geteuid ());
creat (buf,0600);
key = ftok (buf,1);
sprintf (buf, "/tmp/lgtd%d", (int) geteuid ());
creat (buf, 0600);
key = ftok (buf, 1);
if ((ipc_qid = msgget (key,0600|IPC_CREAT)) == -1)
if ((ipc_qid = msgget (key, 0600 | IPC_CREAT)) == -1)
glibtop_error_io ("unable to create msg queue");
ipc_spawn_watchdog ();
signal (SIGTERM,ipc_handle_signal);
signal (SIGINT,ipc_handle_signal);
signal (SIGTERM, ipc_handle_signal);
signal (SIGINT, ipc_handle_signal);
if ((*msgpp = (struct msgbuf *)
malloc (sizeof **msgpp + GSERV_BUFSZ)) == NULL)
{
malloc (sizeof **msgpp + GSERV_BUFSZ)) == NULL) {
glibtop_warn_io ("unable to allocate space for message buffer");
ipc_exit(1);
ipc_exit (1);
} /* if */
} /* ipc_init */
/*
handle_ipc_request -- accept a request from a client, pass the request on
to the GNU Emacs process, then wait for its reply and
pass that on to the client.
*/
* handle_ipc_request -- accept a request from a client, pass the request on
* to the GNU Emacs process, then wait for its reply and
* pass that on to the client.
*/
void
handle_ipc_request (struct msgbuf *msgp)
{
@@ -158,12 +155,10 @@ handle_ipc_request (struct msgbuf *msgp)
int offset = 0;
int total = 1; /* # bytes that will actually be sent off */
if ((len = msgrcv (ipc_qid, msgp, GSERV_BUFSZ - 1, 1, 0)) < 0)
{
if ((len = msgrcv (ipc_qid, msgp, GSERV_BUFSZ - 1, 1, 0)) < 0) {
glibtop_warn_io ("msgrcv");
ipc_exit (1);
} /* if */
msgctl (ipc_qid, IPC_STAT, &msg_st);
strncpy (buf, msgp->mtext, len);
buf[len] = '\0'; /* terminate */
@@ -175,21 +170,18 @@ handle_ipc_request (struct msgbuf *msgp)
msgp->mtext[0] = '\0';
#if 0
if ((len = read(0,buf,GSERV_BUFSZ-1)) < 0)
{
if ((len = read (0, buf, GSERV_BUFSZ - 1)) < 0) {
glibtop_warn_io ("read");
ipc_exit (1);
} /* if */
sscanf (buf, "%d:%[^\n]\n", &junk, msgp->mtext);
#else
/* read in "n/m:" (n=client fd, m=message length) */
while (offset < (GSERV_BUFSZ-1) &&
while (offset < (GSERV_BUFSZ - 1) &&
((len = read (0, buf + offset, 1)) > 0) &&
buf[offset] != ':')
{
buf[offset] != ':') {
offset += len;
}
@@ -200,30 +192,26 @@ handle_ipc_request (struct msgbuf *msgp)
buf[offset] = '\0';
sscanf (buf, "%d/%d", &s, &result_len);
while (result_len > 0)
{
if ((len = read(0, buf, min2 (result_len, GSERV_BUFSZ - 1))) < 0)
while (result_len > 0) {
if ((len = read (0, buf, min2 (result_len, GSERV_BUFSZ - 1))) < 0)
glibtop_error_io ("read");
/* Send this string off, but only if we have enough space */
if (GSERV_BUFSZ > total)
{
if (GSERV_BUFSZ > total) {
if (total + len <= GSERV_BUFSZ)
buf[len] = 0;
else
buf[GSERV_BUFSZ - total] = 0;
send_string(s,buf);
total += strlen(buf);
send_string (s, buf);
total += strlen (buf);
}
result_len -= len;
}
/* eat the newline */
while ((len = read (0,buf,1)) == 0)
;
while ((len = read (0, buf, 1)) == 0);
if (len < 0)
glibtop_error_io ("read");
@@ -234,7 +222,7 @@ handle_ipc_request (struct msgbuf *msgp)
/* Send a response back to the client. */
msgp->mtype = msg_st.msg_lspid;
if (msgsnd (ipc_qid,msgp,strlen(msgp->mtext)+1,0) < 0)
if (msgsnd (ipc_qid, msgp, strlen (msgp->mtext) + 1, 0) < 0)
glibtop_warn_io ("msgsend(gnuserv)");
} /* handle_ipc_request */
@@ -243,27 +231,26 @@ handle_ipc_request (struct msgbuf *msgp)
#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
/*
echo_request -- read request from a given socket descriptor, and send the information
to stdout (the gnu process).
*/
* echo_request -- read request from a given socket descriptor, and send the information
* to stdout (the gnu process).
*/
static void
echo_request (int s)
{
char buf[GSERV_BUFSZ];
int len;
printf("%d ",s);
printf ("%d ", s);
/* read until we get a newline or no characters */
while ((len = recv(s,buf,GSERV_BUFSZ-1,0)) > 0) {
while ((len = recv (s, buf, GSERV_BUFSZ - 1, 0)) > 0) {
buf[len] = '\0';
printf("%s",buf);
printf ("%s", buf);
if (buf[len-1] == EOT_CHR) {
fflush(stdout);
if (buf[len - 1] == EOT_CHR) {
fflush (stdout);
break; /* end of message */
}
} /* while */
if (len < 0)
@@ -273,22 +260,22 @@ echo_request (int s)
/*
handle_response -- accept a response from stdin (the gnu process) and pass the
information on to the relevant client.
*/
* handle_response -- accept a response from stdin (the gnu process) and pass the
* information on to the relevant client.
*/
static void
handle_response (void)
{
#if 0
char buf[GSERV_BUFSZ+1];
int offset=0;
char buf[GSERV_BUFSZ + 1];
int offset = 0;
int s;
int len;
int result_len;
/* read in "n/m:" (n=client fd, m=message length) */
while (offset < GSERV_BUFSZ &&
((len = read(0,buf+offset,1)) > 0) &&
((len = read (0, buf + offset, 1)) > 0) &&
buf[offset] != ':') {
offset += len;
}
@@ -298,20 +285,19 @@ handle_response (void)
/* parse the response from emacs, getting client fd & result length */
buf[offset] = '\0';
sscanf(buf,"%d/%d", &s, &result_len);
sscanf (buf, "%d/%d", &s, &result_len);
while (result_len > 0) {
if ((len = read(0,buf,min2(result_len,GSERV_BUFSZ))) < 0)
if ((len = read (0, buf, min2 (result_len, GSERV_BUFSZ))) < 0)
glibtop_error_io ("read");
buf[len] = '\0';
send_string(s,buf);
send_string (s, buf);
result_len -= len;
}
/* eat the newline */
while ((len = read(0,buf,1)) == 0)
;
while ((len = read (0, buf, 1)) == 0);
if (len < 0)
glibtop_error_io ("read");
@@ -320,13 +306,14 @@ handle_response (void)
/* send the newline */
buf[1] = '\0';
send_string(s,buf);
close(s);
send_string (s, buf);
close (s);
#else
glibtop_error ("handle_response (): Function not implemented");
#endif
} /* handle_response */
#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */
@@ -339,10 +326,11 @@ struct entry {
struct entry *permitted_hosts[TABLE_SIZE];
#ifdef AUTH_MAGIC_COOKIE
# include <X11/X.h>
# include <X11/Xauth.h>
#include <X11/X.h>
#include <X11/Xauth.h>
static Xauth *server_xauth = NULL;
#endif
static int
@@ -357,52 +345,41 @@ timed_read (int fd, char *buf, int max, int timeout, int one_line)
tv.tv_sec = timeout;
tv.tv_usec = 0;
FD_ZERO(&rmask);
FD_SET(fd, &rmask);
FD_ZERO (&rmask);
FD_SET (fd, &rmask);
do
{
r = select(fd + 1, &rmask, NULL, NULL, &tv);
do {
r = select (fd + 1, &rmask, NULL, NULL, &tv);
if (r > 0)
{
if (read (fd, &c, 1) == 1 )
{
if (r > 0) {
if (read (fd, &c, 1) == 1) {
*buf++ = c;
++nbytes;
}
else
{
} else {
glibtop_warn_io ("read error on socket");
return -1;
}
}
else if (r == 0)
{
} else if (r == 0) {
glibtop_warn ("read timed out");
return -1;
}
else
{
} else {
glibtop_warn_io ("error in select");
return -1;
}
} while ((nbytes < max) && !(one_line && (c == '\n')));
--buf;
if (one_line && *buf == '\n')
{
if (one_line && *buf == '\n') {
*buf = 0;
}
return nbytes;
}
/*
permitted -- return whether a given host is allowed to connect to the server.
*/
* permitted -- return whether a given host is allowed to connect to the server.
*/
static int
permitted (u_long host_addr, int fd)
{
@@ -413,13 +390,12 @@ permitted (u_long host_addr, int fd)
char buf[1024];
int auth_data_len;
if (fd > 0)
{
if (fd > 0) {
/* we are checking permission on a real connection */
/* Read auth protocol name */
if (timed_read(fd, auth_protocol, AUTH_NAMESZ, AUTH_TIMEOUT, 1) <= 0)
if (timed_read (fd, auth_protocol, AUTH_NAMESZ, AUTH_TIMEOUT, 1) <= 0)
return FALSE;
#ifdef DEBUG
@@ -427,15 +403,12 @@ permitted (u_long host_addr, int fd)
#endif
if (strcmp (auth_protocol, DEFAUTH_NAME) &&
strcmp (auth_protocol, MCOOKIE_NAME))
{
strcmp (auth_protocol, MCOOKIE_NAME)) {
glibtop_warn ("Authentication protocol from client is invalid", auth_protocol);
return FALSE;
}
if (!strcmp (auth_protocol, MCOOKIE_NAME))
{
if (!strcmp (auth_protocol, MCOOKIE_NAME)) {
/*
* doing magic cookie auth
@@ -451,8 +424,7 @@ permitted (u_long host_addr, int fd)
#ifdef AUTH_MAGIC_COOKIE
if (server_xauth && server_xauth->data &&
!memcmp (buf, server_xauth->data, auth_data_len))
{
!memcmp (buf, server_xauth->data, auth_data_len)) {
return TRUE;
}
#else
@@ -467,69 +439,63 @@ permitted (u_long host_addr, int fd)
glibtop_warn ("Xauth authentication failed, trying GNU_SECURE auth...");
}
/* Other auth protocols go here, and should execute only if the
* auth_protocol name matches.
*/
/* Other auth protocols go here, and should execute only if
* the * auth_protocol name matches. */
}
/* Now, try the old GNU_SECURE stuff... */
/* First find the hash key */
key = HASH(host_addr) % TABLE_SIZE;
key = HASH (host_addr) % TABLE_SIZE;
#ifdef DEBUG
fprintf (stderr, "Doing GNU_SECURE auth ...\n");
#endif
/* Now check the chain for that hash key */
for(entry = permitted_hosts [key]; entry != NULL; entry = entry->next) {
for (entry = permitted_hosts[key]; entry != NULL; entry = entry->next) {
#ifdef DEBUG
fprintf (stderr, "Trying %ld\n", entry->host_addr);
#endif
if (host_addr == entry->host_addr)
return(TRUE);
return (TRUE);
}
return(FALSE);
return (FALSE);
} /* permitted */
/*
add_host -- add the given host to the list of permitted hosts, provided it isn't
already there.
*/
* add_host -- add the given host to the list of permitted hosts, provided it isn't
* already there.
*/
static void
add_host (u_long host_addr)
{
int key;
struct entry *new_entry;
if (!permitted (host_addr, -1))
{
if ((new_entry = (struct entry *) malloc(sizeof(struct entry))) == NULL)
if (!permitted (host_addr, -1)) {
if ((new_entry = (struct entry *) malloc (sizeof (struct entry))) == NULL)
glibtop_error_io ("unable to malloc space for permitted host entry");
new_entry->host_addr = host_addr;
key = HASH(host_addr) % TABLE_SIZE;
key = HASH (host_addr) % TABLE_SIZE;
new_entry->next = permitted_hosts[key];
permitted_hosts[key] = new_entry;
} /* if */
} /* add_host */
/*
setup_table -- initialise the table of hosts allowed to contact the server,
by reading from the file specified by the GNU_SECURE
environment variable
Put in the local machine, and, if a security file is specifed,
add each host that is named in the file.
Return the number of hosts added.
*/
* setup_table -- initialise the table of hosts allowed to contact the server,
* by reading from the file specified by the GNU_SECURE
* environment variable
* Put in the local machine, and, if a security file is specifed,
* add each host that is named in the file.
* Return the number of hosts added.
*/
static int
setup_table (void)
{
@@ -537,11 +503,11 @@ setup_table (void)
char *file_name;
char hostname[HOSTNAMSZ];
u_int host_addr;
int i, hosts=0;
int i, hosts = 0;
/* Make sure every entry is null */
for (i = 0; i < TABLE_SIZE; i++)
permitted_hosts [i] = NULL;
permitted_hosts[i] = NULL;
gethostname (hostname, HOSTNAMSZ);
@@ -551,39 +517,44 @@ setup_table (void)
#ifdef AUTH_MAGIC_COOKIE
server_xauth = XauGetAuthByAddr (FamilyInternet,
sizeof(host_addr), (char *)&host_addr,
strlen(MCOOKIE_SCREEN), MCOOKIE_SCREEN,
strlen(MCOOKIE_X_NAME), MCOOKIE_X_NAME);
sizeof (host_addr), (char *) &host_addr,
strlen (MCOOKIE_SCREEN), MCOOKIE_SCREEN,
strlen (MCOOKIE_X_NAME), MCOOKIE_X_NAME);
hosts++;
#endif /* AUTH_MAGIC_COOKIE */
#if 0 /* Don't even want to allow access from the local host by default */
#if 0 /* Don't even want to allow access from the
* local host by default */
add_host (host_addr); /* add local host */
hosts++;
#endif
if (((file_name = getenv ("GNU_SECURE")) != NULL && /* security file */
(host_file = fopen (file_name, "r")) != NULL)) /* opened ok */
{
while ((fscanf (host_file, "%s", hostname) != EOF)) /* find a host */
if (((long) host_addr = glibtop_internet_addr (hostname)) != -1)/* get its addr */
{
if (((file_name = getenv ("GNU_SECURE")) != NULL && /* security
* file */
(host_file = fopen (file_name, "r")) != NULL)) { /* opened ok */
while ((fscanf (host_file, "%s", hostname) != EOF)) /* find
* a
* host
*/
if (((long) host_addr = glibtop_internet_addr (hostname)) != -1) { /* get
* its
* addr
*/
add_host (host_addr); /* add the addr */
hosts++;
}
fclose (host_file);
} /* if */
return hosts;
} /* setup_table */
/*
internet_init -- initialize server, returning an internet socket that can
be listened on.
*/
* internet_init -- initialize server, returning an internet socket that can
* be listened on.
*/
static int
internet_init (void)
{
@@ -592,59 +563,56 @@ internet_init (void)
struct sockaddr_in server; /* for local socket address */
char *ptr; /* ptr to return from getenv */
if (setup_table() == 0)
if (setup_table () == 0)
return -1;
/* clear out address structure */
memset((char *)&server, 0, sizeof (struct sockaddr_in));
memset ((char *) &server, 0, sizeof (struct sockaddr_in));
/* Set up address structure for the listen socket. */
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
/* Find the information for the gnu server
* in order to get the needed port number.
*/
/* Find the information for the gnu server * in order to get the
* needed port number. */
if ((ptr = getenv ("GNU_PORT")) != NULL)
server.sin_port = htons (atoi (ptr));
else if ((sp = getservbyname ("gnuserv", "tcp")) == NULL)
server.sin_port = htons (DEFAULT_PORT+getuid());
server.sin_port = htons (DEFAULT_PORT + getuid ());
else
server.sin_port = sp->s_port;
/* Create the listen socket. */
if ((ls = socket (AF_INET,SOCK_STREAM, 0)) == -1)
if ((ls = socket (AF_INET, SOCK_STREAM, 0)) == -1)
glibtop_error_io ("unable to create socket");
/* Bind the listen address to the socket. */
if (bind(ls,(struct sockaddr *) &server,sizeof(struct sockaddr_in)) == -1)
if (bind (ls, (struct sockaddr *) &server, sizeof (struct sockaddr_in)) == -1)
glibtop_error_io ("bind");
/* Initiate the listen on the socket so remote users
* can connect.
*/
if (listen(ls,20) == -1)
/* Initiate the listen on the socket so remote users * can connect. */
if (listen (ls, 20) == -1)
glibtop_error_io ("listen");
return(ls);
return (ls);
} /* internet_init */
/*
handle_internet_request -- accept a request from a client and send the information
to stdout (the gnu process).
*/
* handle_internet_request -- accept a request from a client and send the information
* to stdout (the gnu process).
*/
static void
handle_internet_request (int ls)
{
int s;
size_t addrlen = sizeof(struct sockaddr_in);
size_t addrlen = sizeof (struct sockaddr_in);
struct sockaddr_in peer; /* for peer socket address */
memset((char *)&peer, 0, sizeof (struct sockaddr_in));
memset ((char *) &peer, 0, sizeof (struct sockaddr_in));
if ((s = accept (ls, (struct sockaddr *)&peer, (void *) &addrlen)) == -1)
if ((s = accept (ls, (struct sockaddr *) &peer, (void *) &addrlen)) == -1)
glibtop_error_io ("accept");
#ifdef DEBUG
@@ -652,14 +620,12 @@ handle_internet_request (int ls)
#endif
/* Check that access is allowed - if not return crud to the client */
if (!permitted (peer.sin_addr.s_addr, s))
{
close(s);
if (!permitted (peer.sin_addr.s_addr, s)) {
close (s);
glibtop_warn ("Refused connection from %s.", inet_ntoa (peer.sin_addr));
return;
} /* if */
#ifdef DEBUG
#tifdef DEBUG
fprintf (stderr, "Accepted connection from %s.\n", inet_ntoa (peer.sin_addr));
#endif
@@ -677,9 +643,9 @@ handle_internet_request (int ls)
#ifdef UNIX_DOMAIN_SOCKETS
/*
unix_init -- initialize server, returning an unix-domain socket that can
be listened on.
*/
* unix_init -- initialize server, returning an unix-domain socket that can
* be listened on.
*/
static int
unix_init (void)
{
@@ -687,29 +653,28 @@ unix_init (void)
struct sockaddr_un server; /* unix socket address */
int bindlen;
if ((ls = socket (AF_UNIX,SOCK_STREAM, 0)) < 0)
if ((ls = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
glibtop_error_io ("unable to create socket");
/* Set up address structure for the listen socket. */
#ifdef HIDE_UNIX_SOCKET
sprintf (server.sun_path, "/tmp/lgtddir%d", (int)geteuid());
if (mkdir (server.sun_path, 0700) < 0)
{
sprintf (server.sun_path, "/tmp/lgtddir%d", (int) geteuid ());
if (mkdir (server.sun_path, 0700) < 0) {
/* assume it already exists, and try to set perms */
if (chmod (server.sun_path, 0700) < 0)
glibtop_error_io ("Can't set permissions on %s", server.sun_path);
}
strcat(server.sun_path, "/lgtd");
unlink(server.sun_path); /* remove old file if it exists */
strcat (server.sun_path, "/lgtd");
unlink (server.sun_path); /* remove old file if it exists */
#else /* HIDE_UNIX_SOCKET */
sprintf(server.sun_path, "/tmp/lgtd%d", (int)geteuid());
unlink(server.sun_path); /* remove old file if it exists */
sprintf (server.sun_path, "/tmp/lgtd%d", (int) geteuid ());
unlink (server.sun_path); /* remove old file if it exists */
#endif /* HIDE_UNIX_SOCKET */
server.sun_family = AF_UNIX;
#ifdef HAVE_SOCKADDR_SUN_LEN
/* See W. R. Stevens "Advanced Programming in the Unix Environment"
p. 502 */
* p. 502 */
bindlen = (sizeof (server.sun_len) + sizeof (server.sun_family)
+ strlen (server.sun_path) + 1);
server.sun_len = bindlen;
@@ -717,19 +682,20 @@ unix_init (void)
bindlen = strlen (server.sun_path) + sizeof (server.sun_family);
#endif
if (bind (ls, (struct sockaddr *)&server, bindlen) < 0)
if (bind (ls, (struct sockaddr *) &server, bindlen) < 0)
glibtop_error_io ("bind");
chmod(server.sun_path,0700); /* only this user can send commands */
chmod (server.sun_path, 0700); /* only this user can send commands */
if (listen(ls,20) < 0)
if (listen (ls, 20) < 0)
glibtop_error_io ("listen");
/* #### there are also better ways of dealing with this when
sigvec() is present. */
/* #### there are also better ways of dealing with this when sigvec()
* is present. */
#if defined (HAVE_SIGPROCMASK)
{
sigset_t _mask;
sigemptyset (&_mask);
sigaddset (&_mask, SIGPIPE);
sigprocmask (SIG_BLOCK, &_mask, NULL);
@@ -744,88 +710,95 @@ unix_init (void)
/*
handle_unix_request -- accept a request from a client and send the information
to stdout (the gnu process).
*/
* handle_unix_request -- accept a request from a client and send the information
* to stdout (the gnu process).
*/
static void
handle_unix_request (int ls)
{
int s;
size_t len = sizeof(struct sockaddr_un);
size_t len = sizeof (struct sockaddr_un);
struct sockaddr_un server; /* for unix socket address */
server.sun_family = AF_UNIX;
if ((s = accept (ls, (struct sockaddr *)&server, (void *)&len)) < 0)
if ((s = accept (ls, (struct sockaddr *) &server, (void *) &len)) < 0)
glibtop_error_io ("accept");
echo_request(s);
echo_request (s);
} /* handle_unix_request */
#endif /* UNIX_DOMAIN_SOCKETS */
int
main(argc,argv)
main (argc, argv)
int argc;
char *argv[];
{
int chan; /* temporary channel number */
int ils = -1; /* internet domain listen socket */
int uls = -1; /* unix domain listen socket */
#ifdef SYSV_IPC
struct msgbuf *msgp; /* message buffer */
#endif /* SYSV_IPC */
glibtop_init_r (&glibtop_global_server, 0, GLIBTOP_OPEN_NO_OVERRIDE);
for(chan=3; chan < _NFILE; close(chan++)) /* close unwanted channels */
for (chan = 3; chan < _NFILE; close (chan++)) /* close unwanted
* channels */
;
#ifdef SYSV_IPC
ipc_init(&msgp); /* get a msqid to listen on, and a message buffer */
ipc_init (&msgp); /* get a msqid to listen on, and a message
* buffer */
#endif /* SYSV_IPC */
#ifdef INTERNET_DOMAIN_SOCKETS
ils = internet_init(); /* get a internet domain socket to listen on */
ils = internet_init (); /* get a internet domain socket to listen on */
#endif /* INTERNET_DOMAIN_SOCKETS */
#ifdef UNIX_DOMAIN_SOCKETS
uls = unix_init(); /* get a unix domain socket to listen on */
uls = unix_init (); /* get a unix domain socket to listen on */
#endif /* UNIX_DOMAIN_SOCKETS */
while (1) {
#ifdef SYSV_IPC
handle_ipc_request(msgp);
handle_ipc_request (msgp);
#else /* NOT SYSV_IPC */
fd_set rmask;
FD_ZERO(&rmask);
FD_SET(fileno(stdin), &rmask);
FD_ZERO (&rmask);
FD_SET (fileno (stdin), &rmask);
if (uls >= 0)
FD_SET(uls, &rmask);
FD_SET (uls, &rmask);
if (ils >= 0)
FD_SET(ils, &rmask);
FD_SET (ils, &rmask);
#ifdef DEBUG
fprintf (stderr, "Server ready and waiting for connections.\n");
#endif
if (select(max2(fileno(stdin),max2(uls,ils)) + 1, &rmask,
(fd_set *)NULL, (fd_set *)NULL, (struct timeval *)NULL) < 0)
if (select (max2 (fileno (stdin), max2 (uls, ils)) + 1, &rmask,
(fd_set *) NULL, (fd_set *) NULL, (struct timeval *) NULL) < 0)
glibtop_error_io ("select");
#ifdef UNIX_DOMAIN_SOCKETS
if (uls > 0 && FD_ISSET(uls, &rmask))
handle_unix_request(uls);
if (uls > 0 && FD_ISSET (uls, &rmask))
handle_unix_request (uls);
#endif
#ifdef INTERNET_DOMAIN_SOCKETS
if (ils > 0 && FD_ISSET(ils, &rmask))
handle_internet_request(ils);
if (ils > 0 && FD_ISSET (ils, &rmask))
handle_internet_request (ils);
#endif /* INTERNET_DOMAIN_SOCKETS */
if (FD_ISSET(fileno(stdin), &rmask)) /* from stdin (gnu process) */
handle_response();
if (FD_ISSET (fileno (stdin), &rmask)) /* from stdin (gnu
* process) */
handle_response ();
#endif /* NOT SYSV_IPC */
} /* while */