/* * Get the next non-null token (like GNU strsep). Strsep() will return a * null token for two adjacent separators, so we may have to loop. */ static char * strnnsep(char **stringp, char *delim) { char *tok; do { tok = xstrsep(stringp, delim); } while (tok && *tok == '\0'); return (tok); }
void sfs_hosttab_t::loadfd (int fd) { suio uio; int lineno = 0; sfs_sa sa; bzero (&sa, sizeof (sa)); sa.sa_in.sin_family = AF_INET; for (;;) { lineno++; size_t n; while (!(n = uio.linelen ())) if (uio.input (fd) <= 0) { if (uio.resid ()) errmsg (lineno, "incomplete last line"); return; } mstr m (n); uio.copyout (m, n - 1); m[n-1] = '\0'; uio.rembytes (n); if (m[0] == '#' || m[0] == '\n') continue; char *p = m; char *host = strnnsep (&p, " \t\r\n"); char *port = host; xstrsep (&port, "%"); if (inet_aton (host, &sa.sa_in.sin_addr) <= 0) { errmsg (lineno, "invalid IP address"); continue; } if (!port || !*port) sa.sa_in.sin_port = htons (SFS_PORT); else if (convertint (port, &sa.sa_in.sin_port)) sa.sa_in.sin_port = htons (sa.sa_in.sin_port); else { errmsg (lineno, "invalid port number"); continue; } while ((host = strnnsep (&p, " \t\r\n"))) { str h (mytolower (host)); if (sfs_host *hp = tab[h]) delete hp; tab.insert (New sfs_host (h, sa, sizeof (sa.sa_in))); } } }
static int conalloc(char *iname, char *oname, int keytype) { char *namebase, *name, *namelist; int s; namebase = namelist = xstrdup(iname); do { name = xstrsep(&namelist, ","); if (!name) { free(namebase); return (-1); } } while ((s = tcpconnect(name)) < 0); if (s >= maxfd) fatal("conalloc: fdno %d too high", s); if (fdcon[s].c_status) fatal("conalloc: attempt to reuse fdno %d", s); debug3("%s: oname %s kt %d", __func__, oname, keytype); fdcon[s].c_fd = s; fdcon[s].c_status = CS_CON; fdcon[s].c_namebase = namebase; fdcon[s].c_name = name; fdcon[s].c_namelist = namelist; fdcon[s].c_output_name = xstrdup(oname); fdcon[s].c_data = (char *) &fdcon[s].c_plen; fdcon[s].c_len = 4; fdcon[s].c_off = 0; fdcon[s].c_keytype = keytype; gettimeofday(&fdcon[s].c_tv, NULL); fdcon[s].c_tv.tv_sec += timeout; TAILQ_INSERT_TAIL(&tq, &fdcon[s], c_link); FD_SET(s, read_wait); ncon++; return (s); }