|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 6229 (0x1855)
Types: TextFile
Names: »searchwho.c.or«, »searchwho.c.orig«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen
└─⟦this⟧ »cph85dist/search/searchwho.c.or«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Search/searchwho.c.orig«
#ifndef lint
static char rcsid[] = "$Header: searchwho.c,v 2.1 85/04/10 17:31:55 matt Stab $";
#endif
/*
*
* searchwho
*
* multi-player and multi-system search and destroy.
*
* Original by Dave Pare 1983
* Ported & improved
* by Matt Crawford 1985
*
* who is playing search
*
* Copyright (c) 1983
*
* $Log: searchwho.c,v $
* Revision 2.1 85/04/10 17:31:55 matt
* Major de-linting and minor restructuring.
*
* Revision 1.3 85/02/10 02:06:33 matt
* Allow a port to be specified, as for search itself.
*
* Revision 1.2 85/02/09 23:50:40 matt
* Eliminated the dependence on the value of the mask after
* select() times out. Use the return value to distinguish
* a timeout!!
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sgtty.h>
#include <ctype.h>
#include <pwd.h>
#include <signal.h>
#include <sys/time.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/un.h>
#include "defines.h"
#include "structs.h"
#ifdef INET
#include <netinet/in.h>
#include <netdb.h>
struct servent defserv = {
"search",
(char **)0,
DEFAULT_IN_PORT,
"tcp"
};
#endif
extern int errno;
int dtabsiz; /* how many fd's here? */
int sock; /* socket to daemon */
main(argc, argv)
int argc;
char *argv[];
{
void reset();
register int cc; /* returned from all sorts of calls */
register int i; /* general purpose register */
register int sockmask;
register char buf[4096];/* misc buffer for i/o */
int mask; /* masks used in select() calls */
struct timeval timeout;/* time outs for select calls */
int save_mask; /* don't calculate mask each time */
#ifdef INET
int to_in; /* flag: using internet */
char hostname[32]; /* name of local host */
struct servent *serv; /* returned by getservbyname() */
struct hostent *host; /* returned by gethostbyname() */
struct sockaddr_in in_addr;/* internet socket address */
#endif
int first_time; /* for printing header */
int junk;
struct sockaddr loc_addr;/* local socket address */
dtabsiz = getdtablesize();
#ifdef INET
if (argc > 3) {
printf("usage: searchwho [hostname [port]]\n");
exit(1);
}
if (argc == 1)
to_in = 0;
else
to_in = 1;
#endif
/*
* set all the signals
*/
(void) signal(SIGINT, SIG_IGN);
(void) signal(SIGTERM, SIG_IGN);
(void) signal(SIGQUIT, reset);
(void) signal(SIGHUP, reset);
(void) signal(SIGPIPE, reset);
(void) signal(SIGALRM, reset);
(void) signal(SIGTSTP, SIG_IGN);
(void) signal(SIGSTOP, SIG_IGN);
#ifdef INET
if (to_in) {
/*
* now find the remote host
*/
host = gethostbyname(argv[1]);
if (host == NULL) {
printf("%s: no such host \"%s\"\n", argv[0], argv[1]);
exit(1);
}
/*
* get the service from /etc/services (525?)
*/
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
exit(1);
}
serv = getservbyname("search", "tcp");
if (serv == NULL)
fprintf(stderr, "%s: no entry in /etc/services\n",
argv[0]);
if (argc == 3)
defserv.s_port = atoi(argv[2]);
if (serv == NULL || argc == 3) {
serv = &defserv;
fprintf(stderr, "Assuming port %d\n", serv -> s_port);
defserv.s_port = (int)htons((u_short)defserv.s_port);
}
in_addr.sin_port = serv -> s_port;
in_addr.sin_family = host -> h_addrtype;
bcopy(host -> h_addr, &in_addr.sin_addr, host -> h_length);
/*
* and connect to the foreign machine's search daemon
*/
if (connect(sock, &in_addr, sizeof(in_addr))) {
printf("%s: can't connect to %s's search daemon\n",
argv[0], argv[1]);
exit(1);
}
} else {
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
perror("search, socket");
exit(1);
}
(void) strcpy(loc_addr.sa_data, SLOCK);
/*
* connect to the local search daemon thru the lock
* file (usually /tmp/slock for historical reasons)
*/
if (connect(sock, &loc_addr, sizeof(loc_addr))) {
printf("no local search daemon running\n");
exit(1);
}
}
#else
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
perror("search, socket");
exit(1);
}
(void) strcpy(loc_addr.sa_data, SLOCK);
/*
* connect to the local search daemon thru the lock
* file (usually /tmp/slock for historical reasons)
*/
if (connect(sock, &loc_addr, sizeof(loc_addr))) {
printf("no local search daemon running\n");
exit(1);
}
#endif
/*
* daemon knows that a 1 byte message 'w' is from "searchwho".
*/
if (write(sock, "w", 1) != 1) {
perror("write");
printf("searchwho: bad connect on socket\n");
exit(1);
}
/*
* set up all the stuff for the select loop
*/
sockmask = 1 << sock;
save_mask = sockmask;
timeout.tv_usec = 0L;
timeout.tv_sec = 3L;
/*
* just in case nobody's there
*/
alarm(20);
first_time = 1;
for (;;) {
mask = save_mask;
i = select(dtabsiz, &mask, 0, 0, &timeout);
if (i < 0) {
if (errno = EINTR)
continue;
perror("select");
}
/*
* nope - no data waiting. select() timed out.
*/
if (!i) {
printf("no data yet, we'll wait a bit longer...\n");
fflush(stdout);
continue;
}
if (!(sockmask & mask))
continue;
/*
* input waiting from the daemon - read it in and
* write it to the screen (stdout).
*/
alarm (3);
if (fgets(buf, 80, &_iob[sock]) != NULL) {
/*
* when you get zero characters from a socket that
* had input waiting, it means that the socket was
* closed down (from the other side)
*/
if (first_time) {
if (strncmp(buf, "nobody", 6) != 0) {
printf(" username points \n");
first_time = 0;
} else
puts(buf);
} else
puts(buf);
fflush(stdout);
} else
reset(0);
alarm(0);
}
}
/*
* reset disconnects us from any sockets we've connected to,
* and shuts everything down nicely.
*/
void reset(signal)
int signal;
{
char buf[1024];
struct timeval delay;
int mask;
int i;
/*
* disconnect from our socket (getting rid of the
* gunk possibly leftover)
*/
mask = 1 << sock;
delay.tv_sec = 0L;
delay.tv_usec = 500L;
shutdown(sock, 1);
i = select(dtabsiz, &mask, 0, 0, &delay);
if (i > 0) {
i = read(sock, buf, sizeof(buf));
write(1, buf, i);
}
shutdown(sock, 2);
(void) close(sock);
putchar('\n');
exit(0);
}