Ejemplo n.º 1
0
static int parse_service(char *buf, ipvs_service_t *svc)
{
  char *portp = NULL;
  long portn;
  int result=SERVICE_NONE;
  struct in_addr inaddr;
  struct in6_addr inaddr6;

  if (buf == NULL || str_is_digit(buf))
    return SERVICE_NONE;
  if (buf[0] == '[') {
    buf++;
    portp = strchr(buf, ']');
    if (portp == NULL)
      return SERVICE_NONE;
    *portp = '\0';
    portp++;
    if (*portp == ':')
      *portp = '\0';
    else
      return SERVICE_NONE;
  }
  if (inet_pton(AF_INET6, buf, &inaddr6) > 0) {
    svc->addr.in6 = inaddr6;
    svc->af = AF_INET6;
    svc->netmask = 128;
  } else {
    portp = strrchr(buf, ':');
    if (portp != NULL)
      *portp = '\0';

    if (inet_aton(buf, &inaddr) != 0) {
      svc->addr.ip = inaddr.s_addr;
      svc->af = AF_INET;
    } else if (host_to_addr(buf, &inaddr) != -1) {
      svc->addr.ip = inaddr.s_addr;
      svc->af = AF_INET;
    } else
      return SERVICE_NONE;
  }

  result |= SERVICE_ADDR;

  if (portp != NULL) {
    result |= SERVICE_PORT;

    if ((portn = string_to_number(portp+1, 0, 65535)) != -1)
      svc->port = htons(portn);
    else if ((portn = service_to_port(portp+1, svc->protocol)) != -1)
      svc->port = htons(portn);
    else
      return SERVICE_NONE;
  }

  return result;
}
Ejemplo n.º 2
0
static nms_t *
rummage_dev_dsk(void)
{
	nms_t	*list = (nms_t *)0;
	DIR		*dskp;
	int	i;

	for (i = 0; i < MAX_TYPES; i++) {
		switch (i) {

			case DISK:
				dskp = opendir("/dev/dsk");
				break;
			case TAPE:
				dskp = opendir("/dev/rmt");
				break;
			default:
				dskp = NULL;
				break;
		}

		if (dskp != NULL) {
			struct dirent  *bpt;
			while ((bpt = readdir(dskp)) != NULL) {
				struct stat	sbuf;
				char	dnmbuf[1025];
				char	snm[256];
				char	lnm[256];
				char	*npt;
				char	nmbuf[1025];

				if (bpt->d_name[0] == '.')
					continue;

				if (i == DISK) {
					(void) strcpy(lnm, bpt->d_name);
					do_snm(bpt->d_name, snm);
				} else {
					/*
					 * don't want all rewind/etc
					 * devices for a tape
					 */
					if (!str_is_digit(bpt->d_name))
						continue;
					(void) sprintf(snm, "rmt/%s",
						bpt->d_name);
					(void) sprintf(lnm, "rmt/%s",
						bpt->d_name);
				}
				if (look_up_name(snm, list) != 0)
					continue;

				if (i == DISK) {
					(void) sprintf(dnmbuf,
						"/dev/dsk/%s", bpt->d_name);
				} else {
					(void) sprintf(dnmbuf,
						"/dev/rmt/%s", bpt->d_name);
				}
				if (lstat(dnmbuf, &sbuf) != -1) {
					int cnt;
					if ((sbuf.st_mode & S_IFMT)
								== S_IFLNK) {

						nmbuf[0] = '\0';
						if ((cnt = readlink(dnmbuf, nmbuf, sizeof (nmbuf))) != 1) {
							nmbuf[cnt] = '\0';
							npt = nmbuf;
						} else
							npt = (char *)0;
					} else
						npt = lnm;
					if (npt)
						make_an_entry(npt, snm,
								&list, i);
				}
			}
			(void) closedir(dskp);
		}
	}
	return (list);
}