Index: head/usr.bin/killall/killall.c =================================================================== --- head/usr.bin/killall/killall.c (revision 353010) +++ head/usr.bin/killall/killall.c (revision 353011) @@ -1,439 +1,439 @@ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD * * Copyright (c) 2000 Peter Wemm * Copyright (c) 2000 Paul Saab * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD$"); #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static void __dead2 usage(void) { fprintf(stderr, "usage: killall [-delmsqvz] [-help] [-I] [-j jail]\n"); fprintf(stderr, " [-u user] [-t tty] [-c cmd] [-SIGNAL] [cmd]...\n"); fprintf(stderr, "At least one option or argument to specify processes must be given.\n"); exit(1); } static void printsig(FILE *fp) { const char *const * p; int cnt; int offset = 0; for (cnt = NSIG, p = sys_signame + 1; --cnt; ++p) { offset += fprintf(fp, "%s ", *p); if (offset >= 75 && cnt > 1) { offset = 0; fprintf(fp, "\n"); } } fprintf(fp, "\n"); } static void nosig(char *name) { warnx("unknown signal %s; valid signals:", name); printsig(stderr); exit(1); } int main(int ac, char **av) { char **saved_av; struct kinfo_proc *procs, *newprocs; struct stat sb; struct passwd *pw; regex_t rgx; - regmatch_t pmatch[1]; + regmatch_t pmatch; int i, j, ch; char buf[256]; char first; char *user = NULL; char *tty = NULL; char *cmd = NULL; int qflag = 0; int vflag = 0; int sflag = 0; int dflag = 0; int eflag = 0; int Iflag = 0; int jflag = 0; int mflag = 0; int zflag = 0; uid_t uid = 0; dev_t tdev = 0; pid_t mypid; char thiscmd[MAXCOMLEN + 1]; pid_t thispid; uid_t thisuid; dev_t thistdev; int sig = SIGTERM; const char *const *p; char *ep; int errors = 0; int jid; int mib[4]; size_t miblen; int st, nprocs; size_t size; int matched; int killed = 0; setlocale(LC_ALL, ""); av++; ac--; while (ac > 0) { if (strcmp(*av, "-l") == 0) { printsig(stdout); exit(0); } if (strcmp(*av, "-help") == 0) usage(); if (**av == '-') { ++*av; switch (**av) { case 'j': ++*av; if (**av == '\0') { ++av; --ac; } jflag++; if (*av == NULL) errx(1, "must specify jail"); jid = jail_getid(*av); if (jid < 0) errx(1, "%s", jail_errmsg); if (jail_attach(jid) == -1) err(1, "jail_attach(%d)", jid); break; case 'u': ++*av; if (**av == '\0') { ++av; --ac; } if (*av == NULL) errx(1, "must specify user"); user = *av; break; case 't': ++*av; if (**av == '\0') { ++av; --ac; } if (*av == NULL) errx(1, "must specify tty"); tty = *av; break; case 'c': ++*av; if (**av == '\0') { ++av; --ac; } if (*av == NULL) errx(1, "must specify procname"); cmd = *av; break; case 'q': qflag++; break; case 'v': vflag++; break; case 's': sflag++; break; case 'd': dflag++; break; case 'e': eflag++; break; case 'm': mflag++; break; case 'z': zflag++; break; default: saved_av = av; if (isalpha((unsigned char)**av)) { if (strncasecmp(*av, "SIG", 3) == 0) *av += 3; for (sig = NSIG, p = sys_signame + 1; --sig; ++p) if (strcasecmp(*p, *av) == 0) { sig = p - sys_signame; break; } if (!sig) { if (**saved_av == 'I') { av = saved_av; Iflag = 1; break; } else nosig(*av); } } else if (isdigit((unsigned char)**av)) { sig = strtol(*av, &ep, 10); if (!*av || *ep) errx(1, "illegal signal number: %s", *av); if (sig < 0 || sig >= NSIG) nosig(*av); } else nosig(*av); } ++av; --ac; } else { break; } } if (user == NULL && tty == NULL && cmd == NULL && !jflag && ac == 0) usage(); if (tty) { if (strncmp(tty, "/dev/", 5) == 0) snprintf(buf, sizeof(buf), "%s", tty); else if (strncmp(tty, "tty", 3) == 0) snprintf(buf, sizeof(buf), "/dev/%s", tty); else snprintf(buf, sizeof(buf), "/dev/tty%s", tty); if (stat(buf, &sb) < 0) err(1, "stat(%s)", buf); if (!S_ISCHR(sb.st_mode)) errx(1, "%s: not a character device", buf); tdev = sb.st_rdev; if (dflag) printf("ttydev:0x%jx\n", (uintmax_t)tdev); } if (user) { uid = strtol(user, &ep, 10); if (*user == '\0' || *ep != '\0') { /* was it a number? */ pw = getpwnam(user); if (pw == NULL) errx(1, "user %s does not exist", user); uid = pw->pw_uid; if (dflag) printf("uid:%d\n", uid); } } else { uid = getuid(); if (uid != 0) { pw = getpwuid(uid); if (pw) user = pw->pw_name; if (dflag) printf("uid:%d\n", uid); } } size = 0; mib[0] = CTL_KERN; mib[1] = KERN_PROC; if (user) { mib[2] = eflag ? KERN_PROC_UID : KERN_PROC_RUID; mib[3] = uid; miblen = 4; } else if (tty) { mib[2] = KERN_PROC_TTY; mib[3] = tdev; miblen = 4; } else { mib[2] = KERN_PROC_PROC; mib[3] = 0; miblen = 3; } procs = NULL; st = sysctl(mib, miblen, NULL, &size, NULL, 0); do { size += size / 10; newprocs = realloc(procs, size); if (newprocs == NULL) { free(procs); err(1, "could not reallocate memory"); } procs = newprocs; st = sysctl(mib, miblen, procs, &size, NULL, 0); } while (st == -1 && errno == ENOMEM); if (st == -1) err(1, "could not sysctl(KERN_PROC)"); if (size % sizeof(struct kinfo_proc) != 0) { fprintf(stderr, "proc size mismatch (%zu total, %zu chunks)\n", size, sizeof(struct kinfo_proc)); fprintf(stderr, "userland out of sync with kernel\n"); exit(1); } nprocs = size / sizeof(struct kinfo_proc); if (dflag) printf("nprocs %d\n", nprocs); mypid = getpid(); for (i = 0; i < nprocs; i++) { if (procs[i].ki_stat == SZOMB && !zflag) continue; thispid = procs[i].ki_pid; strlcpy(thiscmd, procs[i].ki_comm, sizeof(thiscmd)); thistdev = procs[i].ki_tdev; if (eflag) thisuid = procs[i].ki_uid; /* effective uid */ else thisuid = procs[i].ki_ruid; /* real uid */ if (thispid == mypid) continue; matched = 1; if (user) { if (thisuid != uid) matched = 0; } if (tty) { if (thistdev != tdev) matched = 0; } if (cmd) { if (mflag) { if (regcomp(&rgx, cmd, REG_EXTENDED|REG_NOSUB) != 0) { mflag = 0; warnx("%s: illegal regexp", cmd); } } if (mflag) { - pmatch[0].rm_so = 0; - pmatch[0].rm_eo = strlen(thiscmd); - if (regexec(&rgx, thiscmd, 0, pmatch, + pmatch.rm_so = 0; + pmatch.rm_eo = strlen(thiscmd); + if (regexec(&rgx, thiscmd, 0, &pmatch, REG_STARTEND) != 0) matched = 0; regfree(&rgx); } else { if (strncmp(thiscmd, cmd, MAXCOMLEN) != 0) matched = 0; } } if (jflag && thispid == getpid()) matched = 0; if (matched == 0) continue; if (ac > 0) matched = 0; for (j = 0; j < ac; j++) { if (mflag) { if (regcomp(&rgx, av[j], REG_EXTENDED|REG_NOSUB) != 0) { mflag = 0; warnx("%s: illegal regexp", av[j]); } } if (mflag) { - pmatch[0].rm_so = 0; - pmatch[0].rm_eo = strlen(thiscmd); - if (regexec(&rgx, thiscmd, 0, pmatch, + pmatch.rm_so = 0; + pmatch.rm_eo = strlen(thiscmd); + if (regexec(&rgx, thiscmd, 0, &pmatch, REG_STARTEND) == 0) matched = 1; regfree(&rgx); } else { if (strcmp(thiscmd, av[j]) == 0) matched = 1; } if (matched) break; } if (matched != 0 && Iflag) { printf("Send signal %d to %s (pid %d uid %d)? ", sig, thiscmd, thispid, thisuid); fflush(stdout); first = ch = getchar(); while (ch != '\n' && ch != EOF) ch = getchar(); if (first != 'y' && first != 'Y') matched = 0; } if (matched == 0) continue; if (dflag) printf("sig:%d, cmd:%s, pid:%d, dev:0x%jx uid:%d\n", sig, thiscmd, thispid, (uintmax_t)thistdev, thisuid); if (vflag || sflag) printf("kill -%s %d\n", sys_signame[sig], thispid); killed++; if (!dflag && !sflag) { if (kill(thispid, sig) < 0 /* && errno != ESRCH */ ) { warn("warning: kill -%s %d", sys_signame[sig], thispid); errors = 1; } } } if (killed == 0) { if (!qflag) fprintf(stderr, "No matching processes %swere found\n", getuid() != 0 ? "belonging to you " : ""); errors = 1; } exit(errors); } Index: head/usr.bin/split/split.c =================================================================== --- head/usr.bin/split/split.c (revision 353010) +++ head/usr.bin/split/split.c (revision 353011) @@ -1,404 +1,404 @@ /*- * SPDX-License-Identifier: BSD-3-Clause * * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD$"); #ifndef lint static const char copyright[] = "@(#) Copyright (c) 1987, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n"; #endif #ifndef lint static const char sccsid[] = "@(#)split.c 8.2 (Berkeley) 4/16/94"; #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFLINE 1000 /* Default num lines per file. */ static off_t bytecnt; /* Byte count to split on. */ static off_t chunks = 0; /* Chunks count to split into. */ static long numlines; /* Line count to split on. */ static int file_open; /* If a file open. */ static int ifd = -1, ofd = -1; /* Input/output file descriptors. */ static char bfr[MAXBSIZE]; /* I/O buffer. */ static char fname[MAXPATHLEN]; /* File name prefix. */ static regex_t rgx; static int pflag; static bool dflag; static long sufflen = 2; /* File name suffix length. */ static void newfile(void); static void split1(void); static void split2(void); static void split3(void); static void usage(void); int main(int argc, char **argv) { int ch; int error; char *ep, *p; setlocale(LC_ALL, ""); dflag = false; while ((ch = getopt(argc, argv, "0123456789a:b:dl:n:p:")) != -1) switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* * Undocumented kludge: split was originally designed * to take a number after a dash. */ if (numlines == 0) { p = argv[optind - 1]; if (p[0] == '-' && p[1] == ch && !p[2]) numlines = strtol(++p, &ep, 10); else numlines = strtol(argv[optind] + 1, &ep, 10); if (numlines <= 0 || *ep) errx(EX_USAGE, "%s: illegal line count", optarg); } break; case 'a': /* Suffix length */ if ((sufflen = strtol(optarg, &ep, 10)) <= 0 || *ep) errx(EX_USAGE, "%s: illegal suffix length", optarg); break; case 'b': /* Byte count. */ errno = 0; error = expand_number(optarg, &bytecnt); if (error == -1) errx(EX_USAGE, "%s: offset too large", optarg); break; case 'd': /* Decimal suffix */ dflag = true; break; case 'l': /* Line count. */ if (numlines != 0) usage(); if ((numlines = strtol(optarg, &ep, 10)) <= 0 || *ep) errx(EX_USAGE, "%s: illegal line count", optarg); break; case 'n': /* Chunks. */ if (!isdigit((unsigned char)optarg[0]) || (chunks = (size_t)strtoul(optarg, &ep, 10)) == 0 || *ep != '\0') { errx(EX_USAGE, "%s: illegal number of chunks", optarg); } break; case 'p': /* pattern matching. */ if (regcomp(&rgx, optarg, REG_EXTENDED|REG_NOSUB) != 0) errx(EX_USAGE, "%s: illegal regexp", optarg); pflag = 1; break; default: usage(); } argv += optind; argc -= optind; if (*argv != NULL) { /* Input file. */ if (strcmp(*argv, "-") == 0) ifd = STDIN_FILENO; else if ((ifd = open(*argv, O_RDONLY, 0)) < 0) err(EX_NOINPUT, "%s", *argv); ++argv; } if (*argv != NULL) /* File name prefix. */ if (strlcpy(fname, *argv++, sizeof(fname)) >= sizeof(fname)) errx(EX_USAGE, "file name prefix is too long"); if (*argv != NULL) usage(); if (strlen(fname) + (unsigned long)sufflen >= sizeof(fname)) errx(EX_USAGE, "suffix is too long"); if (pflag && (numlines != 0 || bytecnt != 0 || chunks != 0)) usage(); if (numlines == 0) numlines = DEFLINE; else if (bytecnt != 0 || chunks != 0) usage(); if (bytecnt && chunks) usage(); if (ifd == -1) /* Stdin by default. */ ifd = 0; if (bytecnt) { split1(); exit (0); } else if (chunks) { split3(); exit (0); } split2(); if (pflag) regfree(&rgx); exit(0); } /* * split1 -- * Split the input by bytes. */ static void split1(void) { off_t bcnt; char *C; ssize_t dist, len; int nfiles; nfiles = 0; for (bcnt = 0;;) switch ((len = read(ifd, bfr, MAXBSIZE))) { case 0: exit(0); case -1: err(EX_IOERR, "read"); /* NOTREACHED */ default: if (!file_open) { if (!chunks || (nfiles < chunks)) { newfile(); nfiles++; } } if (bcnt + len >= bytecnt) { dist = bytecnt - bcnt; if (write(ofd, bfr, dist) != dist) err(EX_IOERR, "write"); len -= dist; for (C = bfr + dist; len >= bytecnt; len -= bytecnt, C += bytecnt) { if (!chunks || (nfiles < chunks)) { newfile(); nfiles++; } if (write(ofd, C, bytecnt) != bytecnt) err(EX_IOERR, "write"); } if (len != 0) { if (!chunks || (nfiles < chunks)) { newfile(); nfiles++; } if (write(ofd, C, len) != len) err(EX_IOERR, "write"); } else file_open = 0; bcnt = len; } else { bcnt += len; if (write(ofd, bfr, len) != len) err(EX_IOERR, "write"); } } } /* * split2 -- * Split the input by lines. */ static void split2(void) { long lcnt = 0; FILE *infp; /* Stick a stream on top of input file descriptor */ if ((infp = fdopen(ifd, "r")) == NULL) err(EX_NOINPUT, "fdopen"); /* Process input one line at a time */ while (fgets(bfr, sizeof(bfr), infp) != NULL) { const int len = strlen(bfr); /* If line is too long to deal with, just write it out */ if (bfr[len - 1] != '\n') goto writeit; /* Check if we need to start a new file */ if (pflag) { - regmatch_t pmatch[1]; + regmatch_t pmatch; - pmatch[0].rm_so = 0; - pmatch[0].rm_eo = len - 1; - if (regexec(&rgx, bfr, 0, pmatch, REG_STARTEND) == 0) + pmatch.rm_so = 0; + pmatch.rm_eo = len - 1; + if (regexec(&rgx, bfr, 0, &pmatch, REG_STARTEND) == 0) newfile(); } else if (lcnt++ == numlines) { newfile(); lcnt = 1; } writeit: /* Open output file if needed */ if (!file_open) newfile(); /* Write out line */ if (write(ofd, bfr, len) != len) err(EX_IOERR, "write"); } /* EOF or error? */ if (ferror(infp)) err(EX_IOERR, "read"); else exit(0); } /* * split3 -- * Split the input into specified number of chunks */ static void split3(void) { struct stat sb; if (fstat(ifd, &sb) == -1) { err(1, "stat"); /* NOTREACHED */ } if (chunks > sb.st_size) { errx(1, "can't split into more than %d files", (int)sb.st_size); /* NOTREACHED */ } bytecnt = sb.st_size / chunks; split1(); } /* * newfile -- * Open a new output file. */ static void newfile(void) { long i, maxfiles, tfnum; static long fnum; static char *fpnt; char beg, end; int pattlen; if (ofd == -1) { if (fname[0] == '\0') { fname[0] = 'x'; fpnt = fname + 1; } else { fpnt = fname + strlen(fname); } ofd = fileno(stdout); } if (dflag) { beg = '0'; end = '9'; } else { beg = 'a'; end = 'z'; } pattlen = end - beg + 1; /* maxfiles = pattlen^sufflen, but don't use libm. */ for (maxfiles = 1, i = 0; i < sufflen; i++) if (LONG_MAX / pattlen < maxfiles) errx(EX_USAGE, "suffix is too long (max %ld)", i); else maxfiles *= pattlen; if (fnum == maxfiles) errx(EX_DATAERR, "too many files"); /* Generate suffix of sufflen letters */ tfnum = fnum; i = sufflen - 1; do { fpnt[i] = tfnum % pattlen + beg; tfnum /= pattlen; } while (i-- > 0); fpnt[sufflen] = '\0'; ++fnum; if (!freopen(fname, "w", stdout)) err(EX_IOERR, "%s", fname); file_open = 1; } static void usage(void) { (void)fprintf(stderr, "usage: split [-l line_count] [-a suffix_length] [file [prefix]]\n" " split -b byte_count[K|k|M|m|G|g] [-a suffix_length] [file [prefix]]\n" " split -n chunk_count [-a suffix_length] [file [prefix]]\n" " split -p pattern [-a suffix_length] [file [prefix]]\n"); exit(EX_USAGE); }