Fix from Charles Hedrick at Rutgers - flush output when
[unix-history] / usr / src / libexec / fingerd / fingerd.c
index a717bef..1bef7ab 100644 (file)
@@ -1,6 +1,18 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1983 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif not lint
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)fingerd.c  1.1 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)fingerd.c  5.1 (Berkeley) %G%";
+#endif not lint
 
 /*
  * Finger server.
 
 /*
  * Finger server.
@@ -14,38 +26,63 @@ static char sccsid[] = "@(#)fingerd.c       1.1 (Berkeley) %G%";
 main(argc, argv)
        char *argv[];
 {
 main(argc, argv)
        char *argv[];
 {
-       register char **fargp;
-       register char *cp;
-       char *fargv[80], line[512];
+       register char *sp;
+       char line[512];
        struct sockaddr_in sin;
        struct sockaddr_in sin;
-       int i;
+       int i, p[2], pid, status;
+       FILE *fp;
+       char *av[4];
 
        i = sizeof (sin);
        if (getpeername(0, &sin, &i) < 0)
                fatal(argv[0], "getpeername");
        line[0] = '\0';
        gets(line);
 
        i = sizeof (sin);
        if (getpeername(0, &sin, &i) < 0)
                fatal(argv[0], "getpeername");
        line[0] = '\0';
        gets(line);
-       fargp = fargv;
-       *fargp++ = "finger";
-       cp = line;
+       sp = line;
+       av[0] = "finger";
+       i = 1;
        while (1) {
        while (1) {
-               while (isspace(*cp))
-                       cp++;
-               if (!*cp)
+               while (isspace(*sp))
+                       sp++;
+               if (!*sp)
                        break;
                        break;
-               *fargp++ = cp;
-               if (*cp == '/' && (cp[1] == 'W' || cp[1] == 'w')) {
-                       *cp++ = '-';
-                       *cp++ = 'l';
+               if (*sp == '/' && (sp[1] == 'W' || sp[1] == 'w')) {
+                       sp += 2;
+                       av[i++] = "-l";
                }
                }
-               while (!isspace(*cp))
-                       cp++;
-               *cp++ = '\0';
+               if (*sp && !isspace(*sp)) {
+                       av[i++] = sp;
+                       while (*sp && !isspace(*sp))
+                               sp++;
+                       *sp = '\0';
+               }
+       }
+       av[i] = 0;
+       if (pipe(p) < 0)
+               fatal(argv[0], "pipe");
+       if ((pid = fork()) == 0) {
+               close(p[0]);
+               if (p[1] != 1) {
+                       dup2(p[1], 1);
+                       close(p[1]);
+               }
+               execv("/usr/ucb/finger", av);
+               _exit(1);
+       }
+       if (pid == -1)
+               fatal(argv[0], "fork");
+       close(p[1]);
+       if ((fp = fdopen(p[0], "r")) == NULL)
+               fatal(argv[0], "fdopen");
+       while ((i = getc(fp)) != EOF) {
+               if (i == '\n')
+                       putchar('\r');
+               putchar(i);
        }
        }
-       *fargp = NULL;
-       execv("/usr/ucb/finger", fargv);
-       execvp("finger", fargv);
-       fatal(argv[0], "/usr/ucb/finger");
+       fclose(fp);
+       while ((i = wait(&status)) != pid && i != -1)
+               ;
+       return(0);
 }
 
 fatal(prog, s)
 }
 
 fatal(prog, s)