# /* finger.c */ /* EMACS_MODES: c !fill */ typedef long time_t; /* ugly! */ #include #include #include #include "task.h" #define FINGERSOCK 79 #define WINDOW 1000 #define MAXTIME 600 int dbg; task *ftask; event open_done; event spc_avail; extern int us_opna (), us_cls (), us_tmo (), us_space(), us_fcls (); extern int displa (), quit (); extern task *TCPsend; extern int tcpfd; main (argc, argv) int argc; char **argv; { in_name fhost; char name[128]; register char *p, *q; if (argc < 2) { printf ("usage: %s [user]@host\n", argv[0]); exit (1); } if (argc > 2) dbg = TRUE; for (p = argv[1], q = name; *p != NULL && *p != '@';) *q++ = *p++; if (*p == NULL) { printf ("usage: %s [user]@host\n", argv[0]); exit (1); } *q++ = '\n'; *q = NULL; p++; /* skip over '@' */ if ((fhost = resolve_name (p)) == 0L) { printf ("Host not known\n"); exit (1); } if (!tcp_init (512, 0, us_opna, displa, us_cls, us_fcls, us_tmo, us_space)) exit (1); ftask = tk_cur; signal (SIGINT, quit); signal (SIGTERM, quit); if (!tcp_open (fhost, FINGERSOCK, WINDOW)) { printf ("can't open connection\n"); exit (1); } while (!tst_and_clr (&open_done)) tk_block(); tputs (name); tk_yield (); /* make sure it gets out */ tcp_close (); tm_set (MAXTIME, us_tmo, 0, NULL); for (;;) tk_block (); } displa (buf, len, urg) register char *buf; int len; int urg; { tm_off (); tc_ioff (); fwrite (buf, 1, len, stdout); fflush (stdout); tc_ion (); tm_on (); } us_tmo () { printf ("Host not responding\n"); quit (); } quit () { tcp_close (); tk_yield (); exit (1); } tputs (str) /* Send the specified string out to the net. Do the appropriate netascii * conversion as it goes. * * Arguments: */ register char *str; { extern task *TCPsend; extern event sendef; if (dbg) puts (str); for (; *str != '\0'; str++) { if (*str == '\n') tputc ('\r'); tputc (*str); if (*str == '\r') tputc ('\0'); } tk_setef (TCPsend, &sendef); } tputc (c) /* Put the specified character out to tcp. If the output buffer is full, * block until reawakened by the tcp (via the us_space routine). * * Arguments: */ char c; /* character to output */ { while (!tc_put (c)) tk_block (); } us_opna () { if (dbg) printf ("Open\n"); tk_setef (ftask, &open_done); } us_cls () { if (dbg) printf ("Closed\n"); exit (0); } us_fcls () { if (dbg) printf ("Foreign closed\n"); tcp_close(); } us_space () { tk_wake (ftask); }