- if (setsockopt(sep->se_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on,
- sizeof(on)) < 0)
- syslog(LOG_ERR, "setsockopt (SO_REUSEADDR): %m");
- if (bind(sep->se_fd, &sep->se_ctrladdr, sep->se_ctrladdr_size) < 0) {
- syslog(LOG_ERR, "%s/%s: bind: %m",
- sep->se_service, sep->se_proto);
- (void) close(sep->se_fd);
- sep->se_fd = -1;
- if (!timingout) {
- timingout = 1;
- alarm(RETRYTIME);
- }
- return;
+ } else
+ sep->se_hostaddr = newstr (defhost);
+
+ sep->se_service = newstr (arg);
+ arg = skip (&cp);
+
+ 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 (skip (&cp));
+
+ if (strcmp (sep->se_proto, "unix") == 0) {
+ sep->se_family = AF_UNIX;
+ } else {
+ sep->se_family = AF_INET;
+ if (sep->se_proto[strlen (sep->se_proto) - 1] == '6')
+#ifdef CONFIG_FEATURE_IPV6
+ sep->se_family = AF_INET6;
+#else
+ syslog (LOG_ERR, "%s: IPV6 not supported", sep->se_proto);
+#endif
+ if (strncmp (sep->se_proto, "rpc/", 4) == 0) {
+#ifdef CONFIG_FEATURE_INETD_RPC
+ char *p, *ccp;
+ long l;
+
+ p = strchr (sep->se_service, '/');
+ if (p == 0) {
+ syslog (LOG_ERR, "%s: no rpc version", sep->se_service);
+ goto more;
+ }
+ *p++ = '\0';
+ l = strtol (p, &ccp, 0);
+ if (ccp == p || l < 0 || l > INT_MAX) {
+ badafterall:
+ syslog (LOG_ERR, "%s/%s: bad rpc version", sep->se_service, p);
+ goto more;
+ }
+ sep->se_rpcversl = sep->se_rpcversh = l;
+ if (*ccp == '-') {
+ p = ccp + 1;
+ l = strtol (p, &ccp, 0);
+ if (ccp == p || l < 0 || l > INT_MAX || l < sep->se_rpcversl || *ccp)
+ goto badafterall;
+ sep->se_rpcversh = l;
+ } else if (*ccp != '\0')
+ goto badafterall;
+#else
+ syslog (LOG_ERR, "%s: rpc services not supported", sep->se_service);
+#endif