]>
git.ipfire.org Git - thirdparty/util-linux.git/blob - login-utils/islocal.c
2 * islocal.c - returns true if user is registered in the local
3 * /etc/passwd file. Written by Álvaro Martínez Echevarria,
4 * alvaro@enano.etsit.upm.es, to allow peaceful coexistence with yp. Nov 94.
6 * Hacked a bit by poe@daimi.aau.dk
7 * See also ftp://ftp.daimi.aau.dk/pub/linux/poe/admutil*
9 * Hacked by Peter Breitenlohner, peb@mppmu.mpg.de,
10 * to distinguish user names where one is a prefix of the other,
11 * and to use "pathnames.h". Oct 5, 96.
13 * 1999-02-22 Arkadiusz Miśkiewicz <misiek@pld.ORG.PL>
14 * - added Native Language Support
16 * 2008-04-06 James Youngman, jay@gnu.org
17 * - Completely rewritten to remove assumption that /etc/passwd
18 * lines are < 1024 characters long. Also added unit tests.
25 #include "closestream.h"
28 #include "pathnames.h"
30 static int is_local_in_file(const char *user
, const char *filename
)
37 if (NULL
== (f
= fopen(filename
, "r")))
42 while ((chin
= getc(f
)) != EOF
) {
44 /* Looking for the start of the next line. */
46 /* Start matching username at the next char. */
52 if (0 == user
[match
]) {
55 /* next line has no test coverage,
56 * but it is just an optimisation
60 /* we read a whole username, but it
61 * is the wrong user. Skip to the
64 } else if ('\n' == chin
) {
65 /* This line contains no colon; it's
66 * malformed. No skip since we are already
67 * at the start of the next line. */
69 } else if (chin
!= user
[match
]) {
70 /* username does not match. */
81 int is_local(const char *user
)
85 if ((rv
= is_local_in_file(user
, _PATH_PASSWD
)) < 0)
86 err(EXIT_FAILURE
, _("cannot open %s"), _PATH_PASSWD
);
91 int main(int argc
, char *argv
[])
93 close_stdout_atexit();
95 fprintf(stderr
, _("Usage: %s <passwordfile> <username>...\n"),
101 for (i
= 2; i
< argc
; i
++) {
102 const int rv
= is_local_in_file(argv
[i
], argv
[1]);
107 printf("%d:%s\n", rv
, argv
[i
]);