use syslog for error messages
[unix-history] / usr / src / libexec / rshd / rshd.c
index 8683ea7..2410d74 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)rshd.c     4.18 (Berkeley) %G%";
+static char sccsid[] = "@(#)rshd.c     4.21 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -21,10 +21,10 @@ static      char sccsid[] = "@(#)rshd.c     4.18 (Berkeley) %G%";
 #include <pwd.h>
 #include <signal.h>
 #include <netdb.h>
 #include <pwd.h>
 #include <signal.h>
 #include <netdb.h>
+#include <syslog.h>
 
 int    errno;
 
 int    errno;
-struct passwd *getpwnam();
-char   *index(), *rindex(), *sprintf();
+char   *index(), *rindex();
 /* VARARGS 1 */
 int    error();
 
 /* VARARGS 1 */
 int    error();
 
@@ -32,7 +32,8 @@ main(argc, argv)
        int argc;
        char **argv;
 {
        int argc;
        char **argv;
 {
-       int linger, fromlen;
+       struct linger linger;
+       int on = 1, fromlen;
        struct sockaddr_in from;
 
        fromlen = sizeof (from);
        struct sockaddr_in from;
 
        fromlen = sizeof (from);
@@ -41,14 +42,15 @@ main(argc, argv)
                perror("getpeername");
                _exit(1);
        }
                perror("getpeername");
                _exit(1);
        }
-       if (setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, 0, 0) < 0) {
-               fprintf(stderr, "%s: ", argv[0]);
-               perror("setsockopt (SO_KEEPALIVE)");
+       if (setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) {
+               openlog(argv[0], LOG_PID, 0);
+               syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m");
        }
        }
-       linger = 60;                    /* XXX */
+       linger.l_onoff = 1;
+       linger.l_linger = 60;                   /* XXX */
        if (setsockopt(0, SOL_SOCKET, SO_LINGER, &linger, sizeof (linger)) < 0) {
        if (setsockopt(0, SOL_SOCKET, SO_LINGER, &linger, sizeof (linger)) < 0) {
-               fprintf(stderr, "%s: ", argv[0]);
-               perror("setsockopt (SO_LINGER)");
+               openlog(argv[0], LOG_PID, 0);
+               syslog(LOG_WARNING, "setsockopt (SO_LINGER): %m");
        }
        doit(dup(0), &from);
 }
        }
        doit(dup(0), &from);
 }
@@ -88,7 +90,8 @@ doit(f, fromp)
        fromp->sin_port = ntohs((u_short)fromp->sin_port);
        if (fromp->sin_family != AF_INET ||
            fromp->sin_port >= IPPORT_RESERVED) {
        fromp->sin_port = ntohs((u_short)fromp->sin_port);
        if (fromp->sin_family != AF_INET ||
            fromp->sin_port >= IPPORT_RESERVED) {
-               fprintf(stderr, "rshd: malformed from address\n");
+               openlog("rshd", LOG_PID, 0);
+               syslog(LOG_ERR, "malformed from address\n");
                exit(1);
        }
        (void) alarm(60);
                exit(1);
        }
        (void) alarm(60);
@@ -96,7 +99,8 @@ doit(f, fromp)
        for (;;) {
                char c;
                if (read(f, &c, 1) != 1) {
        for (;;) {
                char c;
                if (read(f, &c, 1) != 1) {
-                       perror("rshd: read");
+                       openlog("rshd", LOG_PID, 0);
+                       syslog(LOG_ERR, "read: %m");
                        shutdown(f, 1+1);
                        exit(1);
                }
                        shutdown(f, 1+1);
                        exit(1);
                }
@@ -109,16 +113,19 @@ doit(f, fromp)
                int lport = IPPORT_RESERVED - 1, retryshift;
                s = rresvport(&lport);
                if (s < 0) {
                int lport = IPPORT_RESERVED - 1, retryshift;
                s = rresvport(&lport);
                if (s < 0) {
-                       perror("rshd: can't get stderr port");
+                       openlog("rshd", LOG_PID, 0);
+                       syslog(LOG_ERR, "can't get stderr port: %m");
                        exit(1);
                }
                if (port >= IPPORT_RESERVED) {
                        exit(1);
                }
                if (port >= IPPORT_RESERVED) {
-                       fprintf(stderr, "rshd: 2nd port not reserved\n");
+                       openlog("rshd", LOG_PID, 0);
+                       syslog(LOG_ERR, "2nd port not reserved\n");
                        exit(1);
                }
                fromp->sin_port = htons((u_short)port);
                if (connect(s, fromp, sizeof (*fromp), 0) < 0) {
                        exit(1);
                }
                fromp->sin_port = htons((u_short)port);
                if (connect(s, fromp, sizeof (*fromp), 0) < 0) {
-                       perror("rshd: connect");
+                       openlog("rshd", LOG_PID, 0);
+                       syslog(LOG_ERR, "connect: %m");
                        exit(1);
                }
        }
                        exit(1);
                }
        }
@@ -198,8 +205,8 @@ doit(f, fromp)
        if (*pwd->pw_shell == '\0')
                pwd->pw_shell = "/bin/sh";
        (void) close(f);
        if (*pwd->pw_shell == '\0')
                pwd->pw_shell = "/bin/sh";
        (void) close(f);
-       initgroups(pwd->pw_name, pwd->pw_gid);
        (void) setgid(pwd->pw_gid);
        (void) setgid(pwd->pw_gid);
+       initgroups(pwd->pw_name, pwd->pw_gid);
        (void) setuid(pwd->pw_uid);
        environ = envinit;
        strncat(homedir, pwd->pw_dir, sizeof(homedir)-6);
        (void) setuid(pwd->pw_uid);
        environ = envinit;
        strncat(homedir, pwd->pw_dir, sizeof(homedir)-6);