/[inetutils]/inetutils/inetd/inetd.c
ViewVC logotype

Diff of /inetutils/inetd/inetd.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.25 by ams, Mon Apr 29 21:02:54 2002 UTC revision 1.26 by gray, Tue Nov 11 11:18:18 2003 UTC
# Line 61  static char sccsid[] = "@(#)inetd.c    8.4 Line 61  static char sccsid[] = "@(#)inetd.c    8.4
61   *      wait/nowait                     single-threaded/multi-threaded   *      wait/nowait                     single-threaded/multi-threaded
62   *      user                            user to run daemon as   *      user                            user to run daemon as
63   *      server program                  full path name   *      server program                  full path name
64   *      server program arguments        maximum of MAXARGS (20)   *      server program arguments        arguments starting with argv[0]
65   *   *
66   * TCP services without official port numbers are handled with the   * TCP services without official port numbers are handled with the
67   * RFC1078-based tcpmux internal service. Tcpmux listens on port 1 for   * RFC1078-based tcpmux internal service. Tcpmux listens on port 1 for
# Line 155  struct servtab { Line 155  struct servtab {
155    char  *se_user;               /* user name to run as */    char  *se_user;               /* user name to run as */
156    struct biltin *se_bi;         /* if built-in, description */    struct biltin *se_bi;         /* if built-in, description */
157    char  *se_server;             /* server program */    char  *se_server;             /* server program */
158  #define MAXARGV 20    char  **se_argv;              /* program arguments */
159    char  *se_argv[MAXARGV+1];    /* program arguments */    size_t se_argc;               /* number of arguments */
160    int   se_fd;                  /* open descriptor */    int   se_fd;                  /* open descriptor */
161    int   se_type;                /* type */    int   se_type;                /* type */
162    struct sockaddr_in se_ctrladdr;/* bound address */    struct sockaddr_in se_ctrladdr;/* bound address */
# Line 186  void           echo_stream __P((int, struct servt Line 186  void           echo_stream __P((int, struct servt
186  void            endconfig __P((FILE *));  void            endconfig __P((FILE *));
187  struct servtab *enter __P((struct servtab *));  struct servtab *enter __P((struct servtab *));
188  void            freeconfig __P((struct servtab *));  void            freeconfig __P((struct servtab *));
189  struct servtab *getconfigent __P((FILE *, const char *));  struct servtab *getconfigent __P((FILE *, const char *, size_t *));
190  void            machtime_dg __P((int, struct servtab *));  void            machtime_dg __P((int, struct servtab *));
191  void            machtime_stream __P((int, struct servtab *));  void            machtime_stream __P((int, struct servtab *));
192  char           *newstr __P((const char *));  char           *newstr __P((const char *));
# Line 197  void           reapchild __P((int)); Line 197  void           reapchild __P((int));
197  void            retry __P((int));  void            retry __P((int));
198  FILE           *setconfig __P((const char *));  FILE           *setconfig __P((const char *));
199  void            setup __P((struct servtab *));  void            setup __P((struct servtab *));
 char           *sskip __P((char **, FILE *, const char *));  
 char           *skip __P((char **, FILE *));  
200  void            tcpmux __P((int s, struct servtab *sep));  void            tcpmux __P((int s, struct servtab *sep));
201  void            set_proc_title __P ((char *, int));  void            set_proc_title __P ((char *, int));
202  void            initring __P((void));  void            initring __P((void));
# Line 409  main (int argc, char *argv[], char *envp Line 407  main (int argc, char *argv[], char *envp
407  #define DUMMYSIZE       100  #define DUMMYSIZE       100
408      char dummy[DUMMYSIZE];      char dummy[DUMMYSIZE];
409    
410      (void)memset(dummy, 'x', DUMMYSIZE - 1);      memset(dummy, 'x', DUMMYSIZE - 1);
411      dummy[DUMMYSIZE - 1] = '\0';      dummy[DUMMYSIZE - 1] = '\0';
412      (void)setenv("inetd_dummy", dummy, 1);      setenv("inetd_dummy", dummy, 1);
413    }    }
414    
415    for (;;)    for (;;)
# Line 431  main (int argc, char *argv[], char *envp Line 429  main (int argc, char *argv[], char *envp
429              sigprocmask (SIG_BLOCK, &sigs, 0);              sigprocmask (SIG_BLOCK, &sigs, 0);
430            }            }
431  #else  #else
432            (void) sigblock (SIGBLOCK);            sigblock (SIGBLOCK);
433  #endif  #endif
434            while (nsock == 0)            while (nsock == 0)
435              sigpause (0L);              sigpause (0L);
# Line 442  main (int argc, char *argv[], char *envp Line 440  main (int argc, char *argv[], char *envp
440              sigprocmask (SIG_SETMASK, &empty, 0);              sigprocmask (SIG_SETMASK, &empty, 0);
441            }            }
442  #else  #else
443            (void) sigsetmask (0L);            sigsetmask (0L);
444  #endif  #endif
445          }          }
446        readable = allsock;        readable = allsock;
# Line 485  main (int argc, char *argv[], char *envp Line 483  main (int argc, char *argv[], char *envp
483                sigprocmask (SIG_BLOCK, &sigs, 0);                sigprocmask (SIG_BLOCK, &sigs, 0);
484              }              }
485  #else  #else
486              (void) sigblock (SIGBLOCK);              sigblock (SIGBLOCK);
487  #endif  #endif
488              pid = 0;              pid = 0;
489              dofork = (sep->se_bi == 0 || sep->se_bi->bi_fork);              dofork = (sep->se_bi == 0 || sep->se_bi->bi_fork);
490              if (dofork)              if (dofork)
491                {                {
492                  if (sep->se_count++ == 0)                  if (sep->se_count++ == 0)
493                    (void)gettimeofday (&sep->se_time, (struct timezone *)0);                    gettimeofday (&sep->se_time, (struct timezone *)0);
494                  else if (sep->se_count >= toomany)                  else if (sep->se_count >= toomany)
495                    {                    {
496                      struct timeval now;                      struct timeval now;
497    
498                      (void)gettimeofday (&now, (struct timezone *)0);                      gettimeofday (&now, (struct timezone *)0);
499                      if (now.tv_sec - sep->se_time.tv_sec > CNT_INTVL)                      if (now.tv_sec - sep->se_time.tv_sec > CNT_INTVL)
500                        {                        {
501                          sep->se_time = now;                          sep->se_time = now;
# Line 619  run_service (int ctrl, struct servtab *s Line 617  run_service (int ctrl, struct servtab *s
617                _exit (1);                _exit (1);
618              }              }
619  #ifdef HAVE_INITGROUPS  #ifdef HAVE_INITGROUPS
620            (void) initgroups (pwd->pw_name, pwd->pw_gid);            initgroups (pwd->pw_name, pwd->pw_gid);
621  #endif  #endif
622            if (setuid (pwd->pw_uid) < 0)            if (setuid (pwd->pw_uid) < 0)
623              {              {
# Line 742  nextconfig (const char *file) Line 740  nextconfig (const char *file)
740  #else  #else
741    long omask;    long omask;
742  #endif  #endif
743      size_t line = 0;
744      
745    fconfig = setconfig (file);    fconfig = setconfig (file);
746    if (!fconfig)    if (!fconfig)
747      {      {
748        syslog (LOG_ERR, "%s: %m", file);        syslog (LOG_ERR, "%s: %m", file);
749        return;        return;
750      }      }
751    while ((cp = getconfigent (fconfig, file)))    while ((cp = getconfigent (fconfig, file, &line)))
752      {      {
753        if ((pwd = getpwnam (cp->se_user)) == NULL)        if ((pwd = getpwnam (cp->se_user)) == NULL)
754          {          {
# Line 790  nextconfig (const char *file) Line 789  nextconfig (const char *file)
789              SWAP(sep->se_user, cp->se_user);              SWAP(sep->se_user, cp->se_user);
790            if (cp->se_server)            if (cp->se_server)
791              SWAP(sep->se_server, cp->se_server);              SWAP(sep->se_server, cp->se_server);
792            for (i = 0; i < MAXARGV; i++)            argcv_free(sep->se_argc, sep->se_argv);
793              SWAP(sep->se_argv[i], cp->se_argv[i]);            sep->se_argc = cp->se_argc;
794              sep->se_argv = cp->se_argv;
795              cp->se_argc = 0;
796              cp->se_argv = NULL;
797  #ifdef HAVE_SIGACTION  #ifdef HAVE_SIGACTION
798            sigprocmask (SIG_SETMASK, &osigs, 0);            sigprocmask (SIG_SETMASK, &osigs, 0);
799  #else  #else
# Line 863  nextconfig (const char *file) Line 865  nextconfig (const char *file)
865  #ifdef HAVE_SIGACTION  #ifdef HAVE_SIGACTION
866    sigprocmask (SIG_SETMASK, &osigs, 0);    sigprocmask (SIG_SETMASK, &osigs, 0);
867  #else  #else
868    (void) sigsetmask (omask);    sigsetmask (omask);
869  #endif  #endif
870  }  }
871    
# Line 907  setsockopt(fd, SOL_SOCKET, opt, (char *) Line 909  setsockopt(fd, SOL_SOCKET, opt, (char *)
909          fprintf (stderr, "bind failed on %s/%s: %s\n",          fprintf (stderr, "bind failed on %s/%s: %s\n",
910                   sep->se_service, sep->se_proto, strerror (errno));                   sep->se_service, sep->se_proto, strerror (errno));
911        syslog(LOG_ERR, "%s/%s: bind: %m", sep->se_service, sep->se_proto);        syslog(LOG_ERR, "%s/%s: bind: %m", sep->se_service, sep->se_proto);
912        (void) close (sep->se_fd);        close (sep->se_fd);
913        sep->se_fd = -1;        sep->se_fd = -1;
914        if (!timingout)        if (!timingout)
915          {          {
# Line 938  close_sep (struct servtab *sep) Line 940  close_sep (struct servtab *sep)
940      {      {
941        nsock--;        nsock--;
942        FD_CLR (sep->se_fd, &allsock);        FD_CLR (sep->se_fd, &allsock);
943        (void) close (sep->se_fd);        close (sep->se_fd);
944        sep->se_fd = -1;        sep->se_fd = -1;
945      }      }
946    sep->se_count = 0;    sep->se_count = 0;
# Line 1005  endconfig (FILE *fconfig) Line 1007  endconfig (FILE *fconfig)
1007  {  {
1008    if (fconfig)    if (fconfig)
1009      {      {
1010        (void) fclose (fconfig);        fclose (fconfig);
1011      }      }
1012  }  }
1013    
1014    #define INETD_SERVICE      0   /* service name */
1015    #define INETD_SOCKET       1   /* socket type */
1016    #define INETD_PROTOCOL     2   /* protocol */
1017    #define INETD_WAIT         3   /* wait/nowait */
1018    #define INETD_USER         4   /* user */
1019    #define INETD_SERVER_PATH  5   /* server program path */
1020    #define INETD_SERVER_ARGS  6   /* server program arguments */
1021    
1022    #define INETD_FIELDS_MIN   7   /* Minimum number of fields in entry */
1023    
1024  struct servtab *  struct servtab *
1025  getconfigent (FILE *fconfig, const char *file)  getconfigent (FILE *fconfig, const char *file, size_t *line)
1026  {  {
1027    struct servtab *sep = &serv;    struct servtab *sep = &serv;
1028    int argc;    size_t argc = 0, i;
1029      char **argv = NULL;
1030    char *cp, *arg;    char *cp, *arg;
1031    static char TCPMUX_TOKEN[] = "tcpmux/";    static char TCPMUX_TOKEN[] = "tcpmux/";
1032  #define MUX_LEN         (sizeof(TCPMUX_TOKEN)-1)  #define MUX_LEN         (sizeof(TCPMUX_TOKEN)-1)
1033    
 more:  
   while ((cp = nextline (fconfig)) && (*cp == '#' || *cp == '\0'))  
     ;  
   if (cp == NULL)  
     return ((struct servtab *)0);  
   /*  
    * clear the static buffer, since some fields (se_ctrladdr,  
    * for example) don't get initialized here.  
    */  
1034    memset ((caddr_t)sep, 0, sizeof *sep);    memset ((caddr_t)sep, 0, sizeof *sep);
1035    arg = skip (&cp, fconfig);    
1036    if (cp == NULL)    while (1)
     {  
       /* got an empty line containing just blanks/tabs. */  
       goto more;  
     }  
   if (strncmp (arg, TCPMUX_TOKEN, MUX_LEN) == 0)  
1037      {      {
1038        char *c = arg + MUX_LEN;        argcv_free (argc, argv);
1039        if (*c == '+')        freeconfig (sep);
1040          memset ((caddr_t)sep, 0, sizeof *sep);
1041          
1042          while ((cp = nextline (fconfig)) && (*cp == '#' || *cp == '\0'))
1043            ++*line;
1044          ++*line;
1045          if (cp == NULL)
1046            return NULL;
1047          
1048          if (argcv_get (cp, "", &argc, &argv))
1049            continue;
1050          
1051          if (argc < INETD_FIELDS_MIN)
1052            {
1053              syslog (LOG_ERR, "%s:%lu: not enough fields",
1054                      file, (unsigned long) *line);
1055              continue;
1056            }
1057    
1058          if (strncmp (argv[INETD_SERVICE], TCPMUX_TOKEN, MUX_LEN) == 0)
1059          {          {
1060            sep->se_type = MUXPLUS_TYPE;            char *c = argv[INETD_SERVICE] + MUX_LEN;
1061            c++;            if (*c == '+')
1062                {
1063                  sep->se_type = MUXPLUS_TYPE;
1064                  c++;
1065                }
1066              else
1067                sep->se_type = MUX_TYPE;
1068              sep->se_service = newstr (c);
1069          }          }
1070        else        else
1071          sep->se_type = MUX_TYPE;          {
1072        sep->se_service = newstr (c);            sep->se_service = newstr (argv[INETD_SERVICE]);
1073      }            sep->se_type = NORM_TYPE;
   else  
     {  
       sep->se_service = newstr (arg);  
       sep->se_type = NORM_TYPE;  
     }  
   arg = sskip (&cp, fconfig, file);  
   if (strcmp (arg, "stream") == 0)  
     sep->se_socktype = SOCK_STREAM;  
   else if (strcmp (arg, "dgram") == 0)  
     sep->se_socktype = SOCK_DGRAM;  
   else if (strcmp (arg, "rdm") == 0)  
     sep->se_socktype = SOCK_RDM;  
   else if (strcmp (arg, "seqpacket") == 0)  
     sep->se_socktype = SOCK_SEQPACKET;  
   else if (strcmp (arg, "raw") == 0)  
     sep->se_socktype = SOCK_RAW;  
   else  
     sep->se_socktype = -1;  
   sep->se_proto = newstr (sskip (&cp, fconfig, file));  
   arg = sskip (&cp, fconfig, file);  
   sep->se_wait = strcmp (arg, "wait") == 0;  
   if (ISMUX (sep))  
     {  
       /*  
        * Silently enforce "nowait" for TCPMUX services since  
        * they don't have an assigned port to listen on.  
        */  
       sep->se_wait = 0;  
   
       if (strcmp (sep->se_proto, "tcp"))  
         {  
           syslog (LOG_ERR, "%s: bad protocol for tcpmux service %s",  
                   file, sep->se_service);  
           goto more;  
1074          }          }
1075        if (sep->se_socktype != SOCK_STREAM)        
1076          if (strcmp (argv[INETD_SOCKET], "stream") == 0)
1077            sep->se_socktype = SOCK_STREAM;
1078          else if (strcmp (argv[INETD_SOCKET], "dgram") == 0)
1079            sep->se_socktype = SOCK_DGRAM;
1080          else if (strcmp (argv[INETD_SOCKET], "rdm") == 0)
1081            sep->se_socktype = SOCK_RDM;
1082          else if (strcmp (argv[INETD_SOCKET], "seqpacket") == 0)
1083            sep->se_socktype = SOCK_SEQPACKET;
1084          else if (strcmp (argv[INETD_SOCKET], "raw") == 0)
1085            sep->se_socktype = SOCK_RAW;
1086          else
1087            {
1088              syslog (LOG_WARNING, "%s:%lu: bad socket type",
1089                      file, (unsigned long) *line);
1090              sep->se_socktype = -1;
1091            }
1092          
1093          sep->se_proto = newstr (argv[INETD_PROTOCOL]);
1094    
1095          if (strcmp (argv[INETD_WAIT], "wait") == 0)
1096            sep->se_wait = 1;
1097          else if (strcmp (argv[INETD_WAIT], "nowait") == 0)
1098            sep->se_wait = 0;
1099          else
1100          {          {
1101            syslog (LOG_ERR,            syslog (LOG_WARNING, "%s:%lu: bad wait type",
1102                    "%s: bad socket type for tcpmux service %s",                    file, (unsigned long) *line);
                   file, sep->se_service);  
           goto more;  
1103          }          }
1104      }    
1105    sep->se_user = newstr (sskip (&cp, fconfig, file));        if (ISMUX (sep))
1106    sep->se_server = newstr (sskip (&cp, fconfig, file));          {
1107    if (strcmp (sep->se_server, "internal") == 0)            /*
1108      {             * Silently enforce "nowait" for TCPMUX services since
1109        struct biltin *bi;             * they don't have an assigned port to listen on.
1110               */
1111              sep->se_wait = 0;
1112              
1113              if (strcmp (sep->se_proto, "tcp"))
1114                {
1115                  syslog (LOG_ERR, "%s:%lu: bad protocol for tcpmux service %s",
1116                          file, (unsigned long) *line, sep->se_service);
1117                  continue;
1118                }
1119              if (sep->se_socktype != SOCK_STREAM)
1120                {
1121                  syslog (LOG_ERR,
1122                          "%s:%lu: bad socket type for tcpmux service %s",
1123                          file, (unsigned long) *line, sep->se_service);
1124                  continue;
1125                }
1126            }
1127          
1128          sep->se_user = newstr (argv[INETD_USER]);
1129          sep->se_server = newstr (argv[INETD_SERVER_PATH]);
1130          if (strcmp (sep->se_server, "internal") == 0)
1131            {
1132              struct biltin *bi;
1133    
1134              for (bi = biltins; bi->bi_service; bi++)
1135                if (bi->bi_socktype == sep->se_socktype
1136                    && strcmp (bi->bi_service, sep->se_service) == 0)
1137                  break;
1138              if (bi->bi_service == 0)
1139                {
1140                  syslog (LOG_ERR, "%s:%lu: internal service %s unknown",
1141                          file, (unsigned long) *line, sep->se_service);
1142                  continue;
1143                }
1144              sep->se_bi = bi;
1145              sep->se_wait = bi->bi_wait;
1146            } else
1147              sep->se_bi = NULL;
1148    
1149        for (bi = biltins; bi->bi_service; bi++)        sep->se_argc = argc - INETD_FIELDS_MIN + 1;
1150          if (bi->bi_socktype == sep->se_socktype        sep->se_argv = calloc (sep->se_argc + 1, sizeof sep->se_argv[0]);
1151              && strcmp (bi->bi_service, sep->se_service) == 0)        if (!sep->se_argv)
           break;  
       if (bi->bi_service == 0)  
1152          {          {
1153            syslog (LOG_ERR, "internal service %s unknown", sep->se_service);            syslog (LOG_ERR, "%s:%lu: Out of memory.",
1154            goto more;                    file, (unsigned long) *line);
1155              exit (-1);
1156          }          }
1157        sep->se_bi = bi;        
1158        sep->se_wait = bi->bi_wait;        for (i = 0; i < sep->se_argc; i++)
1159      } else          {
1160        sep->se_bi = NULL;            sep->se_argv[i] = argv[INETD_SERVER_ARGS + i];
1161    argc = 0;            argv[INETD_SERVER_ARGS + i] = 0;
1162    for (arg = skip (&cp, fconfig); cp; arg = skip (&cp, fconfig))          }
1163      if (argc < MAXARGV)        sep->se_argv[i] = NULL;
1164        sep->se_argv[argc++] = newstr (arg);        break;
1165    while (argc <= MAXARGV)      }
1166      sep->se_argv[argc++] = NULL;    argcv_free (argc, argv);
1167    return sep;    return sep;
1168  }  }
1169    
# Line 1130  freeconfig (struct servtab *cp) Line 1180  freeconfig (struct servtab *cp)
1180      free (cp->se_user);      free (cp->se_user);
1181    if (cp->se_server)    if (cp->se_server)
1182      free (cp->se_server);      free (cp->se_server);
1183    for (i = 0; i < MAXARGV; i++)    argcv_free(cp->se_argc, cp->se_argv);
     if (cp->se_argv[i])  
       free (cp->se_argv[i]);  
 }  
   
   
 /*  
  * Safe skip - if skip returns null, log a syntax error in the  
  * configuration file and exit.  
  */  
 char *  
 sskip (char **cpp, FILE *fconfig, const char *file)  
 {  
   char *cp;  
   
   cp = skip (cpp, fconfig);  
   if (cp == NULL)  
     {  
       syslog (LOG_ERR, "%s: syntax error", file);  
       exit(-1);  
     }  
   return cp;  
 }  
   
 char *  
 skip (char **cpp, FILE *fconfig)  
 {  
   char *cp = *cpp;  
   char *start;  
   
 again:  
   while (*cp == ' ' || *cp == '\t')  
     cp++;  
   if (*cp == '\0')  
     {  
       int c;  
   
       c = getc (fconfig);  
       (void) ungetc (c, fconfig);  
       if (c == ' ' || c == '\t')  
         if ((cp = nextline (fconfig)))  
           goto again;  
       *cpp = (char *)0;  
       return ((char *)0);  
     }  
   start = cp;  
   while (*cp && *cp != ' ' && *cp != '\t')  
     cp++;  
   if (*cp != '\0')  
     *cp++ = '\0';  
   *cpp = cp;  
   return start;  
1184  }  }
1185    
1186  char *  char *
# Line 1260  echo_dg (int s, struct servtab *sep) Line 1259  echo_dg (int s, struct servtab *sep)
1259    size = sizeof sa;    size = sizeof sa;
1260    if ((i = recvfrom (s, buffer, sizeof buffer, 0, &sa, &size)) < 0)    if ((i = recvfrom (s, buffer, sizeof buffer, 0, &sa, &size)) < 0)
1261      return;      return;
1262    (void) sendto (s, buffer, i, 0, &sa, sizeof sa);    sendto (s, buffer, i, 0, &sa, sizeof sa);
1263  }  }
1264    
1265  /* ARGSUSED */  /* ARGSUSED */
# Line 1289  discard_dg (int s, struct servtab *sep) Line 1288  discard_dg (int s, struct servtab *sep)
1288  {  {
1289    char buffer[BUFSIZE];    char buffer[BUFSIZE];
1290    (void)sep; /* shutup gcc */    (void)sep; /* shutup gcc */
1291    (void) read (s, buffer, sizeof buffer);    read (s, buffer, sizeof buffer);
1292  }  }
1293    
1294  #include <ctype.h>  #include <ctype.h>
# Line 1376  chargen_dg (int s, struct servtab *sep) Line 1375  chargen_dg (int s, struct servtab *sep)
1375      rs = ring;      rs = ring;
1376    text[LINESIZ] = '\r';    text[LINESIZ] = '\r';
1377    text[LINESIZ + 1] = '\n';    text[LINESIZ + 1] = '\n';
1378    (void) sendto (s, text, sizeof text, 0, &sa, sizeof sa);    sendto (s, text, sizeof text, 0, &sa, sizeof sa);
1379  }  }
1380    
1381  /*  /*
# Line 1411  machtime_stream (int s, struct servtab * Line 1410  machtime_stream (int s, struct servtab *
1410    
1411    (void)sep; /* shutup gcc */    (void)sep; /* shutup gcc */
1412    result = machtime ();    result = machtime ();
1413    (void) write (s, (char *) &result, sizeof result);    write (s, (char *) &result, sizeof result);
1414  }  }
1415    
1416  /* ARGSUSED */  /* ARGSUSED */
# Line 1427  machtime_dg (int s, struct servtab *sep) Line 1426  machtime_dg (int s, struct servtab *sep)
1426    if (recvfrom (s, (char *)&result, sizeof result, 0, &sa, &size) < 0)    if (recvfrom (s, (char *)&result, sizeof result, 0, &sa, &size) < 0)
1427      return;      return;
1428    result = machtime ();    result = machtime ();
1429    (void) sendto (s, (char *) &result, sizeof result, 0, &sa, sizeof sa);    sendto (s, (char *) &result, sizeof result, 0, &sa, sizeof sa);
1430  }  }
1431    
1432  /* ARGSUSED */  /* ARGSUSED */
# Line 1441  daytime_stream (int s, struct servtab *s Line 1440  daytime_stream (int s, struct servtab *s
1440    (void)sep; /*shutup gcc*/    (void)sep; /*shutup gcc*/
1441    lclock = time ((time_t *) 0);    lclock = time ((time_t *) 0);
1442    
1443    (void) sprintf (buffer, "%.24s\r\n", ctime(&lclock));    sprintf (buffer, "%.24s\r\n", ctime(&lclock));
1444    (void) write (s, buffer, strlen(buffer));    write (s, buffer, strlen(buffer));
1445  }  }
1446    
1447  /* ARGSUSED */  /* ARGSUSED */
# Line 1461  daytime_dg(int s, struct servtab *sep) Line 1460  daytime_dg(int s, struct servtab *sep)
1460    size = sizeof sa;    size = sizeof sa;
1461    if (recvfrom (s, buffer, sizeof buffer, 0, &sa, &size) < 0)    if (recvfrom (s, buffer, sizeof buffer, 0, &sa, &size) < 0)
1462      return;      return;
1463    (void) sprintf (buffer, "%.24s\r\n", ctime (&lclock));    sprintf (buffer, "%.24s\r\n", ctime (&lclock));
1464    (void) sendto (s, buffer, strlen(buffer), 0, &sa, sizeof sa);    sendto (s, buffer, strlen(buffer), 0, &sa, sizeof sa);
1465  }  }
1466    
1467  /*  /*
# Line 1509  fd_getline (int fd, char *buf, int len) Line 1508  fd_getline (int fd, char *buf, int len)
1508    
1509  #define MAX_SERV_LEN    (256+2)         /* 2 bytes for \r\n */  #define MAX_SERV_LEN    (256+2)         /* 2 bytes for \r\n */
1510    
1511  #define strwrite(fd, buf)       (void) write(fd, buf, sizeof(buf)-1)  #define strwrite(fd, buf)       write(fd, buf, sizeof(buf)-1)
1512    
1513  void  void
1514  tcpmux(int s, struct servtab *sep)  tcpmux(int s, struct servtab *sep)
# Line 1538  tcpmux(int s, struct servtab *sep) Line 1537  tcpmux(int s, struct servtab *sep)
1537          {          {
1538            if (!ISMUX (sep))            if (!ISMUX (sep))
1539              continue;              continue;
1540            (void)write (s, sep->se_service, strlen (sep->se_service));            write (s, sep->se_service, strlen (sep->se_service));
1541            strwrite (s, "\r\n");            strwrite (s, "\r\n");
1542          }          }
1543        _exit (1);        _exit (1);

Legend:
Removed from v.1.25  
changed lines
  Added in v.1.26

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26