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