1272343Sngie/* $NetBSD: pwgr.c,v 1.1 2012/03/17 16:33:14 jruoho Exp $ */ 2272343Sngie/* 3272343Sngie * Copyright (c) 2007 The NetBSD Foundation, Inc. 4272343Sngie * All rights reserved. 5272343Sngie * 6272343Sngie * Redistribution and use in source and binary forms, with or without 7272343Sngie * modification, are permitted provided that the following conditions 8272343Sngie * are met: 9272343Sngie * 1. Redistributions of source code must retain the above copyright 10272343Sngie * notice, this list of conditions and the following disclaimer. 11272343Sngie * 2. Redistributions in binary form must reproduce the above copyright 12272343Sngie * notice, this list of conditions and the following disclaimer in the 13272343Sngie * documentation and/or other materials provided with the distribution. 14272343Sngie * 15272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18272343Sngie * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25272343Sngie * POSSIBILITY OF SUCH DAMAGE. 26272343Sngie */ 27272343Sngie 28272343Sngie/* 29272343Sngie * This file implements replacements for all user/group-related functions 30272343Sngie * called by id(1). It provides fake but deterministic user and group 31272343Sngie * information. The details are as such: 32272343Sngie * User root, uid 0, primary group 0 (wheel). 33272343Sngie * User test, uid 100, primary group 100 (users), secondary group 0 (wheel). 34272343Sngie */ 35272343Sngie 36272343Sngie#include <sys/types.h> 37272343Sngie 38272343Sngie#include <errno.h> 39272343Sngie#include <grp.h> 40272343Sngie#include <pwd.h> 41272343Sngie#include <stdlib.h> 42272343Sngie#include <unistd.h> 43272343Sngie#include <string.h> 44272343Sngie 45272343Sngiechar Login[16]; 46272343Sngiestruct group GrEntry; 47272343Sngiestruct passwd PwEntry; 48272343Sngie 49272343Sngiegid_t 50272343Sngiegetgid(void) 51272343Sngie{ 52272343Sngie return 100; 53272343Sngie} 54272343Sngie 55272343Sngiegid_t 56272343Sngiegetegid(void) 57272343Sngie{ 58272343Sngie if (getenv("LIBFAKE_EGID_ROOT") != NULL) 59272343Sngie return 0; 60272343Sngie else 61272343Sngie return 100; 62272343Sngie} 63272343Sngie 64272343Sngieuid_t 65272343Sngiegetuid(void) 66272343Sngie{ 67272343Sngie return 100; 68272343Sngie} 69272343Sngie 70272343Sngieuid_t 71272343Sngiegeteuid(void) 72272343Sngie{ 73272343Sngie if (getenv("LIBFAKE_EUID_ROOT") != NULL) 74272343Sngie return 0; 75272343Sngie else 76272343Sngie return 100; 77272343Sngie} 78272343Sngie 79272343Sngiechar * 80272343Sngiegetlogin(void) 81272343Sngie{ 82272343Sngie strcpy(Login, "test"); 83272343Sngie return Login; 84272343Sngie} 85272343Sngie 86272343Sngiestruct group * 87272343Sngiegetgrgid(gid_t gid) 88272343Sngie{ 89272343Sngie struct group *g = &GrEntry; 90272343Sngie 91272343Sngie memset(g, 0, sizeof(*g)); 92272343Sngie if (gid == 0) { 93272343Sngie g->gr_name = __UNCONST("wheel"); 94272343Sngie g->gr_gid = 0; 95272343Sngie } else if (gid == 100) { 96272343Sngie g->gr_name = __UNCONST("users"); 97272343Sngie g->gr_gid = 100; 98272343Sngie } else 99272343Sngie g = NULL; 100272343Sngie 101272343Sngie return g; 102272343Sngie} 103272343Sngie 104272343Sngieint 105272343Sngiegetgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroups) 106272343Sngie{ 107272343Sngie int cnt, ret; 108272343Sngie 109272343Sngie if (strcmp(name, "root") == 0) { 110272343Sngie if (*ngroups >= 1) { 111272343Sngie groups[0] = basegid; 112272343Sngie cnt = 1; 113272343Sngie } 114272343Sngie 115272343Sngie ret = (*ngroups >= cnt) ? 0 : -1; 116272343Sngie *ngroups = cnt; 117272343Sngie } else if (strcmp(name, "test") == 0) { 118272343Sngie if (*ngroups >= 1) { 119272343Sngie groups[0] = basegid; 120272343Sngie cnt = 1; 121272343Sngie } 122272343Sngie 123272343Sngie if (*ngroups >= 2) { 124272343Sngie groups[1] = 0; 125272343Sngie cnt = 2; 126272343Sngie } 127272343Sngie 128272343Sngie ret = (*ngroups >= cnt) ? 0 : -1; 129272343Sngie *ngroups = cnt; 130272343Sngie } else 131272343Sngie ret = -1; 132272343Sngie 133272343Sngie return ret; 134272343Sngie} 135272343Sngie 136272343Sngieint 137272343Sngiegetgroups(int gidsetlen, gid_t *gidset) 138272343Sngie{ 139272343Sngie if (gidsetlen < 2) { 140272343Sngie errno = EINVAL; 141272343Sngie return -1; 142272343Sngie } 143272343Sngie 144272343Sngie gidset[0] = 100; 145272343Sngie gidset[1] = 0; 146272343Sngie return 2; 147272343Sngie} 148272343Sngie 149272343Sngiestruct passwd * 150272343Sngiegetpwnam(const char *login) 151272343Sngie{ 152272343Sngie struct passwd *p = &PwEntry; 153272343Sngie 154272343Sngie memset(p, 0, sizeof(*p)); 155272343Sngie if (strcmp(login, "root") == 0) { 156272343Sngie p->pw_name = __UNCONST("root"); 157272343Sngie p->pw_uid = 0; 158272343Sngie p->pw_gid = 0; 159272343Sngie } else if (strcmp(login, "test") == 0) { 160272343Sngie p->pw_name = __UNCONST("test"); 161272343Sngie p->pw_uid = 100; 162272343Sngie p->pw_gid = 100; 163272343Sngie } else 164272343Sngie p = NULL; 165272343Sngie 166272343Sngie return p; 167272343Sngie} 168272343Sngie 169272343Sngiestruct passwd * 170272343Sngiegetpwuid(uid_t uid) 171272343Sngie{ 172272343Sngie struct passwd *p = &PwEntry; 173272343Sngie 174272343Sngie memset(p, 0, sizeof(*p)); 175272343Sngie if (uid == 0) { 176272343Sngie p->pw_name = __UNCONST("root"); 177272343Sngie p->pw_uid = 0; 178272343Sngie p->pw_gid = 0; 179272343Sngie } else if (uid == 100) { 180272343Sngie p->pw_name = __UNCONST("test"); 181272343Sngie p->pw_uid = 100; 182272343Sngie p->pw_gid = 100; 183272343Sngie } else 184272343Sngie p = NULL; 185272343Sngie 186272343Sngie return p; 187272343Sngie} 188