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; }
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; }
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; }
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; }
/* * 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; }