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 |
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 */ |
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 *)); |
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)); |
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 (;;) |
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); |
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; |
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; |
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 |
{ |
{ |
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 |
{ |
{ |
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 |
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 |
|
|
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 |
{ |
{ |
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; |
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 |
|
|
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 * |
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 */ |
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> |
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 |
/* |
/* |
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 */ |
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 */ |
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 */ |
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 |
/* |
/* |
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) |
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); |