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 }