summaryrefslogtreecommitdiff
path: root/usr/src/cmd/cron/crontab.c
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2020-08-26 13:42:44 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2020-08-26 13:42:44 +0000
commit82a64156a05f057b7e7c3cd9bbad35c59730dc69 (patch)
treec0c7df376804aecaa5635d77c75c15c2a648c00c /usr/src/cmd/cron/crontab.c
parentc37fdb60f2ec20204a6b8fdbb774fddb0da87d41 (diff)
parentdbe930bf51e0d7458b24d30e9f25756c5da54ddf (diff)
downloadillumos-joyent-release-20200827.tar.gz
[illumos-gate merge]release-20200827
commit dbe930bf51e0d7458b24d30e9f25756c5da54ddf 13040 grep can leverage bmg in more cases commit 81dd18d87c3c2e198d2178dfd1f30d62a81b69ea 3546 add support for grep -o option commit 8ccd021704a4fe1b4022c110d3dd497f8cd907d5 13038 grep could support --label commit 2e5ac464a5683c5bf11439ccad74c9f279051820 13037 grep could support -L commit f415aa8f1340638644c6cf63e9d11d3767f4cbba 13036 grep tests could be easier to extend commit cd94aa947d1e02a1c25259f2cf06c165d75aa4fa 13061 Import sed tests from freebsd commit c6fc7f7b786ce47c35645054cdce73e83f39e7f3 13051 sed: lastline check does not work properly with empty files commit e0721d5ae1542c80097f6fcd487736fdfe601233 13003 console: multiple issues related to colors and font loading and switching commit 6863ede29751efd2be66ec1b48c3c0ee705d7d61 13066 Want crontab -u commit 31c9b836861e74f837a36ca29220b58f3657585a 13044 Clarify parts of getopt_long(3C) commit 9fff840dca14d75459a8240b19c931e2fec186c5 13032 printf(3C) should talk about NULL string pointers Conflicts: usr/src/test/util-tests/tests/grep_xpg4/grep_test.ksh usr/src/man/man1/crontab.1 usr/src/cmd/cron/crontab.c
Diffstat (limited to 'usr/src/cmd/cron/crontab.c')
-rw-r--r--usr/src/cmd/cron/crontab.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/usr/src/cmd/cron/crontab.c b/usr/src/cmd/cron/crontab.c
index 2d9eea8755..18716bc8c2 100644
--- a/usr/src/cmd/cron/crontab.c
+++ b/usr/src/cmd/cron/crontab.c
@@ -26,7 +26,7 @@
/* All Rights Reserved */
/*
- * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
#include <sys/types.h>
@@ -72,10 +72,9 @@
#define WARNSHELL "warning: commands will be executed using /usr/bin/sh\n"
#define BADUSAGE \
"usage:\n" \
- "\tcrontab [file]\n" \
- "\tcrontab -e [username]\n" \
- "\tcrontab -l [-g] [username]\n" \
- "\tcrontab -r [username]"
+ "\tcrontab [-u username] [file]\n" \
+ "\tcrontab [-u username] { -e | -g | -l | -r }\n" \
+ "\tcrontab { -e | -g | -l | -r } [username]"
#define INVALIDUSER "you are not a valid user (no entry in /etc/passwd)."
#define NOTALLOWED "you are not authorized to use cron. Sorry."
#define NOTROOT \
@@ -137,6 +136,7 @@ main(int argc, char **argv)
int stat_loc;
int ret;
char real_login[UNAMESIZE];
+ char *user = NULL;
int tmpfd = -1;
pam_handle_t *pamh;
int pam_error;
@@ -145,7 +145,7 @@ main(int argc, char **argv)
(void) setlocale(LC_ALL, "");
#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
-#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
+#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it wasn't */
#endif
(void) textdomain(TEXT_DOMAIN);
@@ -155,7 +155,7 @@ main(int argc, char **argv)
exit(1);
}
- while ((c = getopt(argc, argv, "eglr")) != EOF)
+ while ((c = getopt(argc, argv, "eglru:")) != EOF) {
switch (c) {
case 'e':
eflag++;
@@ -169,10 +169,17 @@ main(int argc, char **argv)
case 'r':
rflag++;
break;
+ case 'u':
+ user = optarg;
+ break;
case '?':
errflg++;
break;
}
+ }
+
+ argc -= optind;
+ argv += optind;
if (eflag + lflag + rflag > 1)
errflg++;
@@ -180,8 +187,13 @@ main(int argc, char **argv)
if (gflag && !lflag)
errflg++;
- argc -= optind;
- argv += optind;
+ if ((eflag || lflag || rflag) && argc > 0) {
+ if (user != NULL)
+ errflg++;
+ else
+ user = *argv;
+ }
+
if (errflg || argc > 1)
crabort(BADUSAGE);
@@ -190,11 +202,12 @@ main(int argc, char **argv)
crabort(INVALIDUSER);
if (strlcpy(real_login, pwp->pw_name, sizeof (real_login))
- >= sizeof (real_login))
+ >= sizeof (real_login)) {
crabort(NAMETOOLONG);
+ }
- if ((eflag || lflag || rflag) && argc == 1) {
- if ((pwp = getpwnam(*argv)) == NULL)
+ if (user != NULL) {
+ if ((pwp = getpwnam(user)) == NULL)
crabort(INVALIDUSER);
if (!cron_admin(real_login)) {
@@ -202,8 +215,9 @@ main(int argc, char **argv)
crabort(NOTROOT);
else
pp = getuser(ruid);
- } else
- pp = *argv++;
+ } else {
+ pp = user;
+ }
} else {
pp = getuser(ruid);
}