diff --git a/checkpassword.c b/checkpassword.c index 6e5c576..07609b9 100644 --- a/checkpassword.c +++ b/checkpassword.c @@ -4,6 +4,11 @@ extern char *crypt(); extern char *malloc(); extern char **environ; +#include +#include +#include + + int error_txtbsy = #ifdef ETXTBSY ETXTBSY; @@ -28,6 +33,8 @@ static struct spwd *spw; static struct userpw *upw; #endif +#include /* for getenv */ + void doit(login) char *login; { @@ -70,7 +77,7 @@ char *str1e2(name,value) char *name; char *value; char up[513]; int uplen; -void main(argc,argv) +int main(argc,argv) int argc; char **argv; { @@ -81,13 +88,16 @@ char **argv; int i; char **newenv; int numenv; - + int unit = 3; + char* unit_str = getenv("CHECKPASSWORD_UNIT"); + if (unit_str) unit = atoi(unit_str); + if (!argv[1]) _exit(2); uplen = 0; for (;;) { do - r = read(3,up + uplen,sizeof(up) - uplen); + r = read(unit, up + uplen,sizeof(up) - uplen); while ((r == -1) && (errno == EINTR)); if (r == -1) _exit(111); if (r == 0) break; @@ -95,7 +105,7 @@ char **argv; if (uplen >= sizeof(up)) _exit(1); } - close(3); + close(unit); i = 0; login = up + i; @@ -108,10 +118,14 @@ char **argv; encrypted = crypt(password,stored); - for (i = 0;i < sizeof(up);++i) up[i] = 0; + for (i = 0;i < sizeof(up);++i) up[i] = 0; // don't leave it lying around if (!*stored || strcmp(encrypted,stored)) _exit(1); +// OK, the password checks out. + + if (argv[1][0] == '-' && argv[1][1] == 0) _exit(0); + if (prot_gid((int) pw->pw_gid) == -1) _exit(1); if (prot_uid((int) pw->pw_uid) == -1) _exit(1); if (chdir(pw->pw_dir) == -1) _exit(111);