Remove extra whitespace at the end of some lines.
[dragonfly.git] / contrib / libpam / libpam / pam_start.c
1 /* pam_start.c */
2
3 /* Creator Marc Ewing
4  * Maintained by AGM
5  *
6  * $Id: pam_start.c,v 1.10 1997/04/05 06:58:11 morgan Exp $
7  * $FreeBSD: src/contrib/libpam/libpam/pam_start.c,v 1.1.1.1.6.2 2001/06/11 15:28:12 markm Exp $
8  * $DragonFly: src/contrib/libpam/libpam/Attic/pam_start.c,v 1.2 2003/06/17 04:24:03 dillon Exp $
9  *
10  * $Log: pam_start.c,v $
11  */
12
13 #include <ctype.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16 #include <string.h>
17 #include <syslog.h>
18
19 #include "pam_private.h"
20
21 int pam_start (
22     const char *service_name,
23     const char *user,
24     const struct pam_conv *pam_conversation,
25     pam_handle_t **pamh)
26 {
27     D(("called pam_start: [%s] [%s] [%p] [%p]"
28        ,service_name, user, pam_conversation, pamh));
29
30     if ((*pamh = calloc(1, sizeof(**pamh))) == NULL) {
31         pam_system_log(NULL, NULL, LOG_CRIT,
32                        "pam_start: calloc failed for *pamh");
33         return (PAM_BUF_ERR);
34     }
35
36     if (service_name) {
37         char *tmp;
38
39         if (((*pamh)->service_name = _pam_strdup(service_name)) == NULL) {
40             pam_system_log(NULL, NULL, LOG_CRIT,
41                            "pam_start: _pam_strdup failed for service name");
42             _pam_drop(*pamh);
43             return (PAM_BUF_ERR);
44         }
45         for (tmp=(*pamh)->service_name; *tmp; ++tmp)
46             *tmp = tolower(*tmp);                   /* require lower case */
47     } else
48         (*pamh)->service_name = NULL;
49
50     if (user) {
51         if (((*pamh)->user = _pam_strdup(user)) == NULL) {
52             pam_system_log(NULL, NULL, LOG_CRIT,
53                            "pam_start: _pam_strdup failed for user");
54             _pam_drop((*pamh)->service_name);
55             _pam_drop(*pamh);
56             return (PAM_BUF_ERR);
57         }
58     } else
59         (*pamh)->user = NULL;
60
61     (*pamh)->tty = NULL;
62     (*pamh)->prompt = NULL;              /* prompt for pam_get_user() */
63     (*pamh)->ruser = NULL;
64     (*pamh)->rhost = NULL;
65     (*pamh)->authtok = NULL;
66     (*pamh)->oldauthtok = NULL;
67     (*pamh)->fail_delay.delay_fn_ptr = NULL;
68     (*pamh)->former.choice = PAM_NOT_STACKED;
69
70     if (pam_conversation == NULL
71         || ((*pamh)->pam_conversation = (struct pam_conv *)
72             malloc(sizeof(struct pam_conv))) == NULL) {
73         pam_system_log(NULL, NULL, LOG_CRIT,
74                        "pam_start: malloc failed for pam_conv");
75         _pam_drop((*pamh)->service_name);
76         _pam_drop((*pamh)->user);
77         _pam_drop(*pamh);
78         return (PAM_BUF_ERR);
79     } else {
80         memcpy((*pamh)->pam_conversation, pam_conversation,
81                sizeof(struct pam_conv));
82     }
83
84     (*pamh)->data = NULL;
85     if ( _pam_make_env(*pamh) != PAM_SUCCESS ) {
86         pam_system_log(NULL, NULL, LOG_ERR,
87                        "pam_start: failed to initialize environment");
88         _pam_drop((*pamh)->service_name);
89         _pam_drop((*pamh)->user);
90         _pam_drop(*pamh);
91         return PAM_ABORT;
92     }
93
94     _pam_reset_timer(*pamh);         /* initialize timer support */
95
96     _pam_start_handlers(*pamh);                   /* cannot fail */
97
98     /* According to the SunOS man pages, loading modules and resolving
99      * symbols happens on the first call from the application. */
100
101     /*
102      * XXX - should we call _pam_init_handlers() here ? The following
103      * is new as of Linux-PAM 0.55
104      */
105
106     if ( _pam_init_handlers(*pamh) != PAM_SUCCESS ) {
107         pam_system_log(NULL, NULL, LOG_ERR,
108                        "pam_start: failed to initialize handlers");
109         _pam_drop_env(*pamh);                 /* purge the environment */
110         _pam_drop((*pamh)->service_name);
111         _pam_drop((*pamh)->user);
112         _pam_drop(*pamh);
113         return PAM_ABORT;
114     }
115
116     D(("exiting pam_start successfully"));
117
118     return PAM_SUCCESS;
119 }