예제 #1
0
파일: env.c 프로젝트: lacombar/netbsd-alc
int
getifflags(prop_dictionary_t env, prop_dictionary_t oenv,
    unsigned short *flagsp)
{
	struct ifreq ifr;
	const char *ifname;
	uint64_t ifflags;
	int s;

	if (prop_dictionary_get_uint64(env, "ifflags", &ifflags)) {
		*flagsp = (unsigned short)ifflags;
		return 0;
	}

	if ((s = getsock(AF_UNSPEC)) == -1)
		return -1;

	if ((ifname = getifname(env)) == NULL)
		return -1;

	memset(&ifr, 0, sizeof(ifr));
	estrlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
	if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1)
		return -1;

	*flagsp = (unsigned short)ifr.ifr_flags;

	prop_dictionary_set_uint64(oenv, "ifflags",
	    (unsigned short)ifr.ifr_flags);

	return 0;
}
예제 #2
0
int
mkdirp(const char *path, mode_t mode, mode_t pmode)
{
	char tmp[PATH_MAX], *p;
	struct stat st;

	if (stat(path, &st) == 0) {
		if (S_ISDIR(st.st_mode))
			return 0;
		errno = ENOTDIR;
		weprintf("%s:", path);
		return -1;
	}

	estrlcpy(tmp, path, sizeof(tmp));
	for (p = tmp + (tmp[0] == '/'); *p; p++) {
		if (*p != '/')
			continue;
		*p = '\0';
		if (mkdir(tmp, pmode) < 0 && errno != EEXIST) {
			weprintf("mkdir %s:", tmp);
			return -1;
		}
		*p = '/';
	}
	if (mkdir(tmp, mode) < 0 && errno != EEXIST) {
		weprintf("mkdir %s:", tmp);
		return -1;
	}
	return 0;
}
int
direct_ioctl(prop_dictionary_t env, unsigned long cmd, void *data)
{
	const char *ifname;
	int s;

	if ((s = getsock(AF_UNSPEC)) == -1)
		err(EXIT_FAILURE, "getsock");

	if ((ifname = getifname(env)) == NULL)
		err(EXIT_FAILURE, "getifname");

	estrlcpy(data, ifname, IFNAMSIZ);

	return prog_ioctl(s, cmd, data);
}
int16_t
ifa_get_preference(const char *ifname, const struct sockaddr *sa)
{
	struct if_addrprefreq ifap;
	int s;

	if ((s = getsock(sa->sa_family)) == -1) {
		if (errno == EPROTONOSUPPORT)
			return 0;
		err(EXIT_FAILURE, "socket");
	}
	memset(&ifap, 0, sizeof(ifap));
	estrlcpy(ifap.ifap_name, ifname, sizeof(ifap.ifap_name));
	memcpy(&ifap.ifap_addr, sa, MIN(sizeof(ifap.ifap_addr), sa->sa_len));
	if (prog_ioctl(s, SIOCGIFADDRPREF, &ifap) == -1) {
		if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT)
			return 0;
		warn("SIOCGIFADDRPREF");
	}
	return ifap.ifap_preference;
}
예제 #5
0
파일: xinstall.c 프로젝트: maandree/sbase
static int
install(const char *s1, const char *s2, int depth)
{
	DIR *dp;
	FILE *f1, *f2;
	struct dirent *d;
	struct stat st;
	ssize_t r;
	char target[PATH_MAX], ns1[PATH_MAX], ns2[PATH_MAX];

	if (stat(s1, &st) < 0)
		eprintf("stat %s:", s1);

	if (S_ISLNK(st.st_mode)) {
		if ((r = readlink(s1, target, sizeof(target) - 1)) >= 0) {
			target[r] = '\0';
			if (unlink(s2) < 0 && errno != ENOENT)
				eprintf("unlink %s:", s2);
			else if (symlink(target, s2) < 0)
				eprintf("symlink %s -> %s:", s2, target);
		}
	} else if (S_ISDIR(st.st_mode)) {
		if (!(dp = opendir(s1)))
			eprintf("opendir %s:", s1);
		if (mkdir(s2, mode | 0111) < 0 && errno != EEXIST)
			eprintf("mkdir %s:", s2);

		while ((d = readdir(dp))) {
			if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
				continue;

			estrlcpy(ns1, s1, sizeof(ns1));
			if (s1[strlen(s1) - 1] != '/')
				estrlcat(ns1, "/", sizeof(ns1));
			estrlcat(ns1, d->d_name, sizeof(ns1));

			estrlcpy(ns2, s2, sizeof(ns2));
			if (s2[strlen(s2) - 1] != '/')
				estrlcat(ns2, "/", sizeof(ns2));
			estrlcat(ns2, d->d_name, sizeof(ns2));

			fnck(ns1, ns2, install, depth + 1);
		}

		closedir(dp);
	} else if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode) ||
	           S_ISSOCK(st.st_mode) || S_ISFIFO(st.st_mode)) {
		if (unlink(s2) < 0 && errno != ENOENT)
			eprintf("unlink %s:", s2);
		else if (mknod(s2, (st.st_mode & ~07777) | mode, st.st_rdev) < 0)
			eprintf("mknod %s:", s2);
	} else {
		if (!(f1 = fopen(s1, "r")))
			eprintf("fopen %s:", s1);
		if (!(f2 = fopen(s2, "w"))) {
			if (unlink(s2) < 0 && errno != ENOENT)
				eprintf("unlink %s:", s2);
			else if (!(f2 = fopen(s2, "w")))
				eprintf("fopen %s:", s2);
		}
		concat(f1, s1, f2, s2);

		fchmod(fileno(f2), mode);

		if (fclose(f2) == EOF)
			eprintf("fclose %s:", s2);
		if (fclose(f1) == EOF)
			eprintf("fclose %s:", s1);

		if (sflag)
			strip(s2);
	}

	if (lchown(s2, owner, group) < 0)
		eprintf("lchown %s:", s2);

	return 0;
}
예제 #6
0
파일: nl.c 프로젝트: rovaughn/distro
int
main(int argc, char *argv[])
{
	FILE *fp = NULL;
	size_t l, s;
	int ret = 0;
	char *d, *formattype, *formatblit;

	ARGBEGIN {
	case 'd':
		d = EARGF(usage());
		l = utflen(d);

		switch (l) {
		case 0:
			break;
		case 1:
			s = strlen(d);
			delim = emalloc(s + 1 + 1);
			estrlcpy(delim, d, s + 1 + 1);
			estrlcat(delim, ":", s + 1 + 1);
			delimlen = s + 1;
			break;
		default:
			delim = d;
			delimlen = strlen(delim);
			break;
		}
		break;
	case 'f':
		type[0] = getlinetype(EARGF(usage()), preg);
		break;
	case 'b':
		type[1] = getlinetype(EARGF(usage()), preg + 1);
		break;
	case 'h':
		type[2] = getlinetype(EARGF(usage()), preg + 2);
		break;
	case 'i':
		incr = estrtonum(EARGF(usage()), 0, MIN(LLONG_MAX, SIZE_MAX));
		break;
	case 'l':
		blines = estrtonum(EARGF(usage()), 0, MIN(LLONG_MAX, SIZE_MAX));
		break;
	case 'n':
		formattype = EARGF(usage());
		estrlcpy(format, "%", sizeof(format));

		if (!strcmp(formattype, "ln")) {
			formatblit = "-";
		} else if (!strcmp(formattype, "rn")) {
			formatblit = "";
		} else if (!strcmp(formattype, "rz")) {
			formatblit = "0";
		} else {
			eprintf("%s: bad format\n", formattype);
		}

		estrlcat(format, formatblit, sizeof(format));
		estrlcat(format, "*ld%s", sizeof(format));
		break;
	case 'p':
		pflag = 1;
		break;
	case 's':
		sep = EARGF(usage());
		break;
	case 'v':
		startnum = estrtonum(EARGF(usage()), 0, MIN(LLONG_MAX, SIZE_MAX));
		break;
	case 'w':
		width = estrtonum(EARGF(usage()), 1, INT_MAX);
		break;
	default:
		usage();
	} ARGEND;

	if (argc > 1)
		usage();

	if (!argc) {
		nl("<stdin>", stdin);
	} else {
		if (!strcmp(argv[0], "-")) {
			argv[0] = "<stdin>";
			fp = stdin;
		} else if (!(fp = fopen(argv[0], "r"))) {
			eprintf("fopen %s:", argv[0]);
		}
		nl(argv[0], fp);
	}

	ret |= fp && fp != stdin && fshut(fp, argv[0]);
	ret |= fshut(stdin, "<stdin>") | fshut(stdout, "<stdout>");

	return ret;
}
예제 #7
0
파일: complete.c 프로젝트: ryo/netbsd-src
/*
 * Complete a local filename.
 */
static unsigned char
complete_filename(EditLine *el, char *word, int dolist)
{
	StringList *words;
	char dir[MAXPATHLEN];
	char *fname;
	DIR *dd;
	struct dirent *dp;
	unsigned char rv;
	size_t len;

	if ((fname = strrchr(word, '/')) == NULL) {
		dir[0] = '.';
		dir[1] = '\0';
		fname = word;
	} else {
		if (fname == word) {
			dir[0] = '/';
			dir[1] = '\0';
		} else {
			len = fname - word + 1;
			(void)estrlcpy(dir, word, sizeof(dir));
			dir[len] = '\0';
		}
		fname++;
	}
	if (dir[0] == '~') {
		char *p;

		if ((p = globulize(dir)) == NULL)
			return CC_ERROR;
		(void)estrlcpy(dir, p, sizeof(dir));
		free(p);
	}

	if ((dd = opendir(dir)) == NULL)
		return CC_ERROR;

	words = mail_sl_init();
	len = strlen(fname);

	for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) {
		if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
			continue;

#if defined(DIRENT_MISSING_D_NAMLEN)
		if (len > strlen(dp->d_name))
			continue;
#else
		if (len > dp->d_namlen)
			continue;
#endif
		if (strncmp(fname, dp->d_name, len) == 0) {
			char *tcp;

			tcp = estrdup(dp->d_name);
			mail_sl_add(words, tcp);
		}
	}
	(void)closedir(dd);

	rv = complete_ambiguous(el, fname, dolist, words);
	if (rv == CC_REFRESH) {
		struct stat sb;
		char path[MAXPATHLEN];

		(void)estrlcpy(path, dir,		sizeof(path));
		(void)estrlcat(path, "/",		sizeof(path));
		(void)estrlcat(path, words->sl_str[0],	sizeof(path));

		if (stat(path, &sb) >= 0) {
			char suffix[2] = " ";

			if (S_ISDIR(sb.st_mode))
				suffix[0] = '/';
			if (el_insertstr(el, suffix) == -1)
				rv = CC_ERROR;
		}
	}
	sl_free(words, 1);
	return rv;
}