X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=driver%2Fpasswd.c;h=1847d1be1f7cddce077ccc22ffdfc35c0787a96c;hp=25b3b04880ab2d41d7b2b279aa64b380fbc8931e;hb=551b3de3f619c04c2dd1971ee9b3f02e270c28c9;hpb=a719ec12b8b2563112366a8ac3196816fd64d2c7 diff --git a/driver/passwd.c b/driver/passwd.c index 25b3b048..1847d1be 100644 --- a/driver/passwd.c +++ b/driver/passwd.c @@ -39,8 +39,10 @@ extern char *blurb(void); struct auth_methods { const char *name; Bool (*init) (int argc, char **argv, Bool verbose_p); + Bool (*priv_init) (int argc, char **argv, Bool verbose_p); Bool (*valid_p) (const char *typed_passwd, Bool verbose_p); Bool initted_p; + Bool priv_initted_p; }; @@ -53,6 +55,7 @@ extern Bool pam_lock_init (int argc, char **argv, Bool verbose_p); extern Bool pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p); #endif extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p); +extern Bool pwent_priv_init (int argc, char **argv, Bool verbose_p); extern Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p); @@ -63,15 +66,41 @@ extern Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p); */ struct auth_methods methods[] = { # ifdef HAVE_KERBEROS - { "Kerberos", kerberos_lock_init, kerberos_passwd_valid_p, False }, + { "Kerberos", kerberos_lock_init, 0, kerberos_passwd_valid_p, + False, False }, # endif # ifdef HAVE_PAM - { "PAM", pam_lock_init, pam_passwd_valid_p, False }, + { "PAM", pam_lock_init, 0, pam_passwd_valid_p, + False, False }, # endif - { "normal", pwent_lock_init, pwent_passwd_valid_p, False } + { "normal", pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p, + False, False } }; +Bool +lock_priv_init (int argc, char **argv, Bool verbose_p) +{ + int i; + Bool any_ok = False; + for (i = 0; i < countof(methods); i++) + { + if (!methods[i].priv_init) + methods[i].priv_initted_p = True; + else + methods[i].priv_initted_p = methods[i].priv_init (argc, argv, + verbose_p); + + if (methods[i].priv_initted_p) + any_ok = True; + else if (verbose_p) + fprintf (stderr, "%s: initialization of %s passwords failed.\n", + blurb(), methods[i].name); + } + return any_ok; +} + + Bool lock_init (int argc, char **argv, Bool verbose_p) { @@ -79,6 +108,9 @@ lock_init (int argc, char **argv, Bool verbose_p) Bool any_ok = False; for (i = 0; i < countof(methods); i++) { + if (!methods[i].priv_initted_p) /* Bail if lock_priv_init failed. */ + continue; + methods[i].initted_p = methods[i].init (argc, argv, verbose_p); if (methods[i].initted_p) any_ok = True;