id.c revision 53298
1231200Smm/*- 2231200Smm * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3231200Smm * All rights reserved. 4231200Smm * 5231200Smm * Redistribution and use in source and binary forms, with or without 6231200Smm * modification, are permitted provided that the following conditions 7231200Smm * are met: 8231200Smm * 1. Redistributions of source code must retain the above copyright 9231200Smm * notice, this list of conditions and the following disclaimer. 10231200Smm * 2. Redistributions in binary form must reproduce the above copyright 11231200Smm * notice, this list of conditions and the following disclaimer in the 12231200Smm * documentation and/or other materials provided with the distribution. 13231200Smm * 14231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15231200Smm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16231200Smm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17231200Smm * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18231200Smm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19231200Smm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20231200Smm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21231200Smm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22231200Smm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23231200Smm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24231200Smm * SUCH DAMAGE. 25238856Smm * 26231200Smm * $FreeBSD: head/usr.sbin/ppp/id.c 53298 1999-11-17 21:12:35Z brian $ 27231200Smm */ 28231200Smm 29231200Smm#include <sys/param.h> 30231200Smm#include <sys/socket.h> 31231200Smm#include <sys/un.h> 32231200Smm 33231200Smm#include <sys/ioctl.h> 34231200Smm#include <fcntl.h> 35231200Smm#include <signal.h> 36238856Smm#include <stdarg.h> 37231200Smm#include <stdio.h> 38231200Smm#include <string.h> 39231200Smm#include <sysexits.h> 40231200Smm#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 41231200Smm#include <sys/linker.h> 42231200Smm#endif 43231200Smm#include <unistd.h> 44231200Smm#ifdef __OpenBSD__ 45231200Smm#include <util.h> 46231200Smm#else 47231200Smm#include <libutil.h> 48231200Smm#endif 49231200Smm#include <utmp.h> 50231200Smm 51231200Smm#include "log.h" 52231200Smm#include "main.h" 53231200Smm#include "id.h" 54231200Smm 55231200Smmstatic int uid; 56231200Smmstatic int euid; 57231200Smm 58231200Smmvoid 59231200SmmID0init() 60231200Smm{ 61231200Smm uid = getuid(); 62231200Smm euid = geteuid(); 63231200Smm} 64231200Smm 65231200Smmstatic void 66231200SmmID0setuser(void) 67231200Smm{ 68231200Smm if (seteuid(uid) == -1) { 69231200Smm log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n"); 70231200Smm AbortProgram(EX_NOPERM); 71231200Smm } 72231200Smm} 73231200Smm 74231200Smmuid_t 75231200SmmID0realuid() 76231200Smm{ 77231200Smm return uid; 78231200Smm} 79231200Smm 80231200Smmstatic void 81231200SmmID0set0(void) 82231200Smm{ 83231200Smm if (seteuid(euid) == -1) { 84231200Smm log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n"); 85231200Smm AbortProgram(EX_NOPERM); 86231200Smm } 87231200Smm} 88231200Smm 89231200Smmint 90231200SmmID0ioctl(int fd, unsigned long req, void *arg) 91231200Smm{ 92231200Smm int ret; 93231200Smm 94231200Smm ID0set0(); 95231200Smm ret = ioctl(fd, req, arg); 96231200Smm log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg); 97231200Smm ID0setuser(); 98231200Smm return ret; 99231200Smm} 100231200Smm 101231200Smmint 102231200SmmID0unlink(const char *name) 103231200Smm{ 104231200Smm int ret; 105231200Smm 106231200Smm ID0set0(); 107231200Smm ret = unlink(name); 108231200Smm log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name); 109231200Smm ID0setuser(); 110231200Smm return ret; 111231200Smm} 112231200Smm 113231200Smmint 114231200SmmID0socket(int domain, int type, int protocol) 115231200Smm{ 116231200Smm int ret; 117231200Smm 118231200Smm ID0set0(); 119231200Smm ret = socket(domain, type, protocol); 120231200Smm log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol); 121231200Smm ID0setuser(); 122231200Smm return ret; 123231200Smm} 124231200Smm 125231200SmmFILE * 126231200SmmID0fopen(const char *path, const char *mode) 127231200Smm{ 128231200Smm FILE *ret; 129231200Smm 130231200Smm ID0set0(); 131231200Smm ret = fopen(path, mode); 132231200Smm log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode); 133231200Smm ID0setuser(); 134231200Smm return ret; 135231200Smm} 136231200Smm 137231200Smmint 138231200SmmID0open(const char *path, int flags, ...) 139231200Smm{ 140231200Smm int ret; 141231200Smm va_list ap; 142231200Smm 143231200Smm va_start(ap, flags); 144231200Smm ID0set0(); 145231200Smm ret = open(path, flags, va_arg(ap, int)); 146231200Smm log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags); 147231200Smm ID0setuser(); 148231200Smm va_end(ap); 149231200Smm return ret; 150231200Smm} 151231200Smm 152231200Smmint 153231200SmmID0write(int fd, const void *data, size_t len) 154231200Smm{ 155231200Smm int ret; 156231200Smm 157231200Smm ID0set0(); 158231200Smm ret = write(fd, data, len); 159231200Smm log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len); 160231200Smm ID0setuser(); 161231200Smm return ret; 162231200Smm} 163231200Smm 164231200Smmint 165231200SmmID0uu_lock(const char *basettyname) 166231200Smm{ 167231200Smm int ret; 168231200Smm 169231200Smm ID0set0(); 170231200Smm ret = uu_lock(basettyname); 171231200Smm log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname); 172231200Smm ID0setuser(); 173231200Smm return ret; 174231200Smm} 175231200Smm 176231200Smmint 177231200SmmID0uu_lock_txfr(const char *basettyname, pid_t newpid) 178231200Smm{ 179231200Smm int ret; 180231200Smm 181231200Smm ID0set0(); 182231200Smm ret = uu_lock_txfr(basettyname, newpid); 183231200Smm log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %d)\n", ret, basettyname, 184231200Smm (int)newpid); 185231200Smm ID0setuser(); 186231200Smm return ret; 187231200Smm} 188231200Smm 189231200Smmint 190231200SmmID0uu_unlock(const char *basettyname) 191231200Smm{ 192231200Smm int ret; 193231200Smm 194231200Smm ID0set0(); 195231200Smm ret = uu_unlock(basettyname); 196231200Smm log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname); 197231200Smm ID0setuser(); 198231200Smm return ret; 199231200Smm} 200231200Smm 201231200Smmvoid 202231200SmmID0login(struct utmp *ut) 203231200Smm{ 204231200Smm ID0set0(); 205231200Smm if (logout(ut->ut_line)) { 206231200Smm log_Printf(LogID0, "logout(\"%s\")\n", ut->ut_line); 207231200Smm logwtmp(ut->ut_line, "", ""); 208231200Smm log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut->ut_line); 209231200Smm } 210231200Smm login(ut); 211231200Smm log_Printf(LogID0, "login(\"%s\", \"%.*s\")\n", 212231200Smm ut->ut_line, (int)(sizeof ut->ut_name), ut->ut_name); 213231200Smm ID0setuser(); 214231200Smm} 215231200Smm 216231200Smmvoid 217231200SmmID0logout(const char *device, int nologout) 218231200Smm{ 219231200Smm struct utmp ut; 220231200Smm 221231200Smm strncpy(ut.ut_line, device, sizeof ut.ut_line - 1); 222231200Smm ut.ut_line[sizeof ut.ut_line - 1] = '\0'; 223231200Smm 224231200Smm ID0set0(); 225 if (nologout || logout(ut.ut_line)) { 226 log_Printf(LogID0, "logout(\"%s\")\n", ut.ut_line); 227 logwtmp(ut.ut_line, "", ""); 228 log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut.ut_line); 229 } else 230 log_Printf(LogERROR, "ID0logout: No longer logged in on %s\n", ut.ut_line); 231 ID0setuser(); 232} 233 234int 235ID0bind_un(int s, const struct sockaddr_un *name) 236{ 237 int result; 238 239 ID0set0(); 240 result = bind(s, (const struct sockaddr *)name, sizeof *name); 241 log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n", 242 result, s, name->sun_path, (int)sizeof(*name)); 243 ID0setuser(); 244 return result; 245} 246 247int 248ID0connect_un(int s, const struct sockaddr_un *name) 249{ 250 int result; 251 252 ID0set0(); 253 result = connect(s, (const struct sockaddr *)name, sizeof *name); 254 log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n", 255 result, s, name->sun_path, (int)sizeof(*name)); 256 ID0setuser(); 257 return result; 258} 259 260int 261ID0kill(pid_t pid, int sig) 262{ 263 int result; 264 265 ID0set0(); 266 result = kill(pid, sig); 267 log_Printf(LogID0, "%d = kill(%d, %d)\n", result, (int)pid, sig); 268 ID0setuser(); 269 return result; 270} 271 272void 273ID0setproctitle(const char *title) 274{ 275 ID0set0(); 276 if (title == NULL) { 277 setproctitle(NULL); 278 log_Printf(LogID0, "setproctitle(NULL)\n"); 279 } else { 280 setproctitle("%s", title); 281 log_Printf(LogID0, "setproctitle(\"%%s\", \"%s\")\n", title); 282 } 283 ID0setuser(); 284} 285 286#if defined(__FreeBSD__) && !defined(NOKLDLOAD) 287int 288ID0kldload(const char *dev) 289{ 290 int result; 291 292 ID0set0(); 293 result = kldload(dev); 294 log_Printf(LogID0, "%d = kldload(\"%s\")\n", result, dev); 295 ID0setuser(); 296 return result; 297} 298#endif 299