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 */
19int
20pw_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
67int
68pw_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}