]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lslogins: return 1 on "lslogins nonexisting"
authorKarel Zak <kzak@redhat.com>
Mon, 13 Aug 2018 12:16:28 +0000 (14:16 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 13 Aug 2018 12:16:28 +0000 (14:16 +0200)
The default behavior for -l and -g is to silently ignore unknown login
names, but this is very confusing when you explicitly specify just one
login name.

Note that the current implementation also prints empty "Last log" for
nonexisting user. It seems ugly.

 # lslogins nonexisting

 Last logs:

new version:

 # lslogins nonexisting
 lt-lslogins: cannot found 'nonexisting'
 # echo $?
 1

The -l and -g behaviour has not been changed.

Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614967
Signed-off-by: Karel Zak <kzak@redhat.com>
login-utils/lslogins.1
login-utils/lslogins.c

index 001ec10f7fc86a367416b3d4e8b167558b3c7ad6..5aa14c706ae3e3a87f415dc5920961562f0c1172 100644 (file)
@@ -18,7 +18,8 @@ and output the desired data.
 The optional argument \fIusername\fR forces
 .BR lslogins
 to print all available details about the specified user only. In this case the
-output format is different than in case of \fB\-l\fR or \fB\-g\fR.
+output format is different than in case of \fB\-l\fR or \fB\-g\fR and unknown
+is \fIusername\fR reported as an error.
 
 .PP
 The default action is to list info about all the users in the system.
index ea40ab615c600c18c52b214bcd613063cb62542c..e2a0d43df7d4d3d045876743357ab1232d9329fb 100644 (file)
@@ -269,6 +269,7 @@ struct lslogins_control {
        const char *journal_path;
 
        unsigned int selinux_enabled : 1,
+                    fail_on_unknown : 1,               /* fail if user does not exist */
                     ulist_on : 1,
                     noheadings : 1,
                     notrunc : 1;
@@ -656,6 +657,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c
        uid_t uid;
        errno = 0;
 
+       errno = 0;
        pwd = username ? getpwnam(username) : getpwent();
        if (!pwd)
                return NULL;
@@ -678,6 +680,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c
                return NULL;
        }
 
+       errno = 0;
        grp = getgrgid(pwd->pw_gid);
        if (!grp)
                return NULL;
@@ -977,10 +980,16 @@ static int create_usertree(struct lslogins_control *ctl)
 
        if (ctl->ulist_on) {
                for (n = 0; n < ctl->ulsiz; n++) {
-                       if (get_user(ctl, &user, ctl->ulist[n]))
+                       int rc = get_user(ctl, &user, ctl->ulist[n]);
+
+                       if (ctl->fail_on_unknown && !user) {
+                               warnx(_("cannot found '%s'"), ctl->ulist[n]);
+                               return -1;
+                       }
+                       if (rc || !user)
                                continue;
-                       if (user) /* otherwise an invalid user name has probably been given */
-                               tsearch(user, &ctl->usertree, cmp_uid);
+
+                       tsearch(user, &ctl->usertree, cmp_uid);
                }
        } else {
                while ((user = get_next_user(ctl)))
@@ -1537,6 +1546,7 @@ int main(int argc, char *argv[])
                        errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users."));
                logins = argv[optind];
                outmode = OUT_PRETTY;
+               ctl->fail_on_unknown = 1;
        } else if (argc != optind)
                errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users."));