xref: /openbsd-src/usr.sbin/smtpd/table_getpwnam.c (revision de8cc8edbc71bd3e3bc7fbffa27ba0e564c37d8b)
1 /*	$OpenBSD: table_getpwnam.c,v 1.12 2018/12/27 14:23:41 eric Exp $	*/
2 
3 /*
4  * Copyright (c) 2012 Gilles Chehade <gilles@poolp.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <sys/queue.h>
21 #include <sys/tree.h>
22 #include <sys/socket.h>
23 
24 #include <ctype.h>
25 #include <err.h>
26 #include <errno.h>
27 #include <event.h>
28 #include <fcntl.h>
29 #include <imsg.h>
30 #include <pwd.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <limits.h>
34 #include <string.h>
35 
36 #include "smtpd.h"
37 #include "log.h"
38 
39 
40 /* getpwnam(3) backend */
41 static int table_getpwnam_config(struct table *);
42 static int table_getpwnam_update(struct table *);
43 static int table_getpwnam_open(struct table *);
44 static int table_getpwnam_lookup(struct table *, enum table_service, const char *,
45     char **);
46 static void table_getpwnam_close(struct table *);
47 
48 struct table_backend table_backend_getpwnam = {
49 	"getpwnam",
50 	K_USERINFO,
51 	table_getpwnam_config,
52 	NULL,
53 	NULL,
54 	table_getpwnam_open,
55 	table_getpwnam_update,
56 	table_getpwnam_close,
57 	table_getpwnam_lookup,
58 };
59 
60 
61 static int
62 table_getpwnam_config(struct table *table)
63 {
64 	if (table->t_config[0])
65 		return 0;
66 	return 1;
67 }
68 
69 static int
70 table_getpwnam_update(struct table *table)
71 {
72 	return 1;
73 }
74 
75 static int
76 table_getpwnam_open(struct table *table)
77 {
78 	return 1;
79 }
80 
81 static void
82 table_getpwnam_close(struct table *table)
83 {
84 	return;
85 }
86 
87 static int
88 table_getpwnam_lookup(struct table *table, enum table_service kind, const char *key,
89     char **dst)
90 {
91 	struct passwd	       *pw;
92 
93 	if (kind != K_USERINFO)
94 		return -1;
95 
96 	errno = 0;
97 	do {
98 		pw = getpwnam(key);
99 	} while (pw == NULL && errno == EINTR);
100 
101 	if (pw == NULL) {
102 		if (errno)
103 			return -1;
104 		return 0;
105 	}
106 	if (dst == NULL)
107 		return 1;
108 
109 	if (asprintf(dst, "%d:%d:%s",
110 	    pw->pw_uid,
111 	    pw->pw_gid,
112 	    pw->pw_dir) == -1) {
113 		*dst = NULL;
114 		return -1;
115 	}
116 
117 	return (1);
118 }
119