1/* $NetBSD: pwgr.c,v 1.1 2012/03/17 16:33:14 jruoho Exp $ */ 2/* 3 * Copyright (c) 2007 The NetBSD Foundation, Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28/* 29 * This file implements replacements for all user/group-related functions 30 * called by id(1). It provides fake but deterministic user and group 31 * information. The details are as such: 32 * User root, uid 0, primary group 0 (wheel). 33 * User test, uid 100, primary group 100 (users), secondary group 0 (wheel). 34 */ 35 36#include <sys/types.h> 37 38#include <errno.h> 39#include <grp.h> 40#include <pwd.h> 41#include <stdlib.h> 42#include <unistd.h> 43#include <string.h> 44 45char Login[16]; 46struct group GrEntry; 47struct passwd PwEntry; 48 49gid_t 50getgid(void) 51{ 52 return 100; 53} 54 55gid_t 56getegid(void) 57{ 58 if (getenv("LIBFAKE_EGID_ROOT") != NULL) 59 return 0; 60 else 61 return 100; 62} 63 64uid_t 65getuid(void) 66{ 67 return 100; 68} 69 70uid_t 71geteuid(void) 72{ 73 if (getenv("LIBFAKE_EUID_ROOT") != NULL) 74 return 0; 75 else 76 return 100; 77} 78 79char * 80getlogin(void) 81{ 82 strcpy(Login, "test"); 83 return Login; 84} 85 86struct group * 87getgrgid(gid_t gid) 88{ 89 struct group *g = &GrEntry; 90 91 memset(g, 0, sizeof(*g)); 92 if (gid == 0) { 93 g->gr_name = __UNCONST("wheel"); 94 g->gr_gid = 0; 95 } else if (gid == 100) { 96 g->gr_name = __UNCONST("users"); 97 g->gr_gid = 100; 98 } else 99 g = NULL; 100 101 return g; 102} 103 104int 105getgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroups) 106{ 107 int cnt, ret; 108 109 if (strcmp(name, "root") == 0) { 110 if (*ngroups >= 1) { 111 groups[0] = basegid; 112 cnt = 1; 113 } 114 115 ret = (*ngroups >= cnt) ? 0 : -1; 116 *ngroups = cnt; 117 } else if (strcmp(name, "test") == 0) { 118 if (*ngroups >= 1) { 119 groups[0] = basegid; 120 cnt = 1; 121 } 122 123 if (*ngroups >= 2) { 124 groups[1] = 0; 125 cnt = 2; 126 } 127 128 ret = (*ngroups >= cnt) ? 0 : -1; 129 *ngroups = cnt; 130 } else 131 ret = -1; 132 133 return ret; 134} 135 136int 137getgroups(int gidsetlen, gid_t *gidset) 138{ 139 if (gidsetlen < 2) { 140 errno = EINVAL; 141 return -1; 142 } 143 144 gidset[0] = 100; 145 gidset[1] = 0; 146 return 2; 147} 148 149struct passwd * 150getpwnam(const char *login) 151{ 152 struct passwd *p = &PwEntry; 153 154 memset(p, 0, sizeof(*p)); 155 if (strcmp(login, "root") == 0) { 156 p->pw_name = __UNCONST("root"); 157 p->pw_uid = 0; 158 p->pw_gid = 0; 159 } else if (strcmp(login, "test") == 0) { 160 p->pw_name = __UNCONST("test"); 161 p->pw_uid = 100; 162 p->pw_gid = 100; 163 } else 164 p = NULL; 165 166 return p; 167} 168 169struct passwd * 170getpwuid(uid_t uid) 171{ 172 struct passwd *p = &PwEntry; 173 174 memset(p, 0, sizeof(*p)); 175 if (uid == 0) { 176 p->pw_name = __UNCONST("root"); 177 p->pw_uid = 0; 178 p->pw_gid = 0; 179 } else if (uid == 100) { 180 p->pw_name = __UNCONST("test"); 181 p->pw_uid = 100; 182 p->pw_gid = 100; 183 } else 184 p = NULL; 185 186 return p; 187} 188