Exemplo n.º 1
0
/*
 * 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);
}
Exemplo n.º 2
0
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)));
    }
  }
}
Exemplo n.º 3
0
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);
}