URI: 
       passwd.c - ubase - suckless linux base utils
  HTML git clone git://git.suckless.org/ubase
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       passwd.c (1384B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <sys/resource.h>
            3 #include <sys/time.h>
            4 
            5 #include <errno.h>
            6 #include <pwd.h>
            7 #include <shadow.h>
            8 #include <stdio.h>
            9 #include <stdlib.h>
           10 #include <string.h>
           11 #include <unistd.h>
           12 
           13 #include "../passwd.h"
           14 #include "../text.h"
           15 #include "../util.h"
           16 
           17 /* Returns -1 on error, 0 for incorrect password
           18  * and 1 if all went OK */
           19 int
           20 pw_check(const struct passwd *pw, const char *pass)
           21 {
           22         char *cryptpass, *p;
           23         struct spwd *spw;
           24 
           25         p = pw->pw_passwd;
           26         if (p[0] == '!' || p[0] == '*') {
           27                 weprintf("denied\n");
           28                 return -1;
           29         }
           30 
           31         if (pw->pw_passwd[0] == '\0') {
           32                 if (pass[0] == '\0')
           33                         return 1;
           34                 weprintf("incorrect password\n");
           35                 return 0;
           36         }
           37 
           38         if (pw->pw_passwd[0] == 'x' && pw->pw_passwd[1] == '\0') {
           39                 errno = 0;
           40                 spw = getspnam(pw->pw_name);
           41                 if (!spw) {
           42                         if (errno)
           43                                 weprintf("getspnam: %s:", pw->pw_name);
           44                         else
           45                                 weprintf("who are you?\n");
           46                         return -1;
           47                 }
           48                 p = spw->sp_pwdp;
           49                 if (p[0] == '!' || p[0] == '*') {
           50                         weprintf("denied\n");
           51                         return -1;
           52                 }
           53         }
           54 
           55         cryptpass = crypt(pass, p);
           56         if (!cryptpass) {
           57                 weprintf("crypt:");
           58                 return -1;
           59         }
           60         if (strcmp(cryptpass, p) != 0) {
           61                 weprintf("incorrect password\n");
           62                 return 0;
           63         }
           64         return 1;
           65 }
           66 
           67 int
           68 pw_init(void)
           69 {
           70         struct rlimit rlim;
           71 
           72         rlim.rlim_cur = 0;
           73         rlim.rlim_max = 0;
           74         if (setrlimit(RLIMIT_CORE, &rlim) < 0)
           75                 eprintf("setrlimit:");
           76         return 0;
           77 }