xref: /freebsd/usr.sbin/ppp/id.c (revision a8445737e740901f5f2c8d24c12ef7fc8b00134e)
1 /*-
2  * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  *	$Id: id.c,v 1.10 1998/05/29 18:33:08 brian Exp $
27  */
28 
29 #include <sys/types.h>
30 #include <sys/socket.h>
31 #include <sys/un.h>
32 
33 #include <sys/ioctl.h>
34 #include <fcntl.h>
35 #include <signal.h>
36 #include <stdarg.h>
37 #include <stdio.h>
38 #include <string.h>
39 #include <sysexits.h>
40 #include <unistd.h>
41 #ifdef __OpenBSD__
42 #include <util.h>
43 #else
44 #include <libutil.h>
45 #endif
46 #include <utmp.h>
47 
48 #include "log.h"
49 #include "main.h"
50 #include "id.h"
51 
52 static int uid;
53 static int euid;
54 
55 void
56 ID0init()
57 {
58   uid = getuid();
59   euid = geteuid();
60 }
61 
62 static void
63 ID0setuser(void)
64 {
65   if (seteuid(uid) == -1) {
66     log_Printf(LogERROR, "ID0setuser: Unable to seteuid!\n");
67     AbortProgram(EX_NOPERM);
68   }
69 }
70 
71 uid_t
72 ID0realuid()
73 {
74   return uid;
75 }
76 
77 static void
78 ID0set0(void)
79 {
80   if (seteuid(euid) == -1) {
81     log_Printf(LogERROR, "ID0set0: Unable to seteuid!\n");
82     AbortProgram(EX_NOPERM);
83   }
84 }
85 
86 int
87 ID0ioctl(int fd, unsigned long req, void *arg)
88 {
89   int ret;
90 
91   ID0set0();
92   ret = ioctl(fd, req, arg);
93   log_Printf(LogID0, "%d = ioctl(%d, %lu, %p)\n", ret, fd, req, arg);
94   ID0setuser();
95   return ret;
96 }
97 
98 int
99 ID0unlink(const char *name)
100 {
101   int ret;
102 
103   ID0set0();
104   ret = unlink(name);
105   log_Printf(LogID0, "%d = unlink(\"%s\")\n", ret, name);
106   ID0setuser();
107   return ret;
108 }
109 
110 int
111 ID0socket(int domain, int type, int protocol)
112 {
113   int ret;
114 
115   ID0set0();
116   ret = socket(domain, type, protocol);
117   log_Printf(LogID0, "%d = socket(%d, %d, %d)\n", ret, domain, type, protocol);
118   ID0setuser();
119   return ret;
120 }
121 
122 FILE *
123 ID0fopen(const char *path, const char *mode)
124 {
125   FILE *ret;
126 
127   ID0set0();
128   ret = fopen(path, mode);
129   log_Printf(LogID0, "%p = fopen(\"%s\", \"%s\")\n", ret, path, mode);
130   ID0setuser();
131   return ret;
132 }
133 
134 int
135 ID0open(const char *path, int flags, ...)
136 {
137   int ret;
138   va_list ap;
139 
140   va_start(ap, flags);
141   ID0set0();
142   ret = open(path, flags, va_arg(ap, int));
143   log_Printf(LogID0, "%d = open(\"%s\", %d)\n", ret, path, flags);
144   ID0setuser();
145   va_end(ap);
146   return ret;
147 }
148 
149 int
150 ID0write(int fd, const void *data, size_t len)
151 {
152   int ret;
153 
154   ID0set0();
155   ret = write(fd, data, len);
156   log_Printf(LogID0, "%d = write(%d, data, %ld)\n", ret, fd, (long)len);
157   ID0setuser();
158   return ret;
159 }
160 
161 int
162 ID0uu_lock(const char *basettyname)
163 {
164   int ret;
165 
166   ID0set0();
167   ret = uu_lock(basettyname);
168   log_Printf(LogID0, "%d = uu_lock(\"%s\")\n", ret, basettyname);
169   ID0setuser();
170   return ret;
171 }
172 
173 int
174 ID0uu_lock_txfr(const char *basettyname, pid_t newpid)
175 {
176   int ret;
177 
178   ID0set0();
179   ret = uu_lock_txfr(basettyname, newpid);
180   log_Printf(LogID0, "%d = uu_lock_txfr(\"%s\", %d)\n", ret, basettyname,
181              (int)newpid);
182   ID0setuser();
183   return ret;
184 }
185 
186 int
187 ID0uu_unlock(const char *basettyname)
188 {
189   int ret;
190 
191   ID0set0();
192   ret = uu_unlock(basettyname);
193   log_Printf(LogID0, "%d = uu_unlock(\"%s\")\n", ret, basettyname);
194   ID0setuser();
195   return ret;
196 }
197 
198 void
199 ID0login(struct utmp *ut)
200 {
201   ID0set0();
202   if (logout(ut->ut_line)) {
203     log_Printf(LogID0, "logout(\"%s\")\n", ut->ut_line);
204     logwtmp(ut->ut_line, "", "");
205     log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut->ut_line);
206   }
207   login(ut);
208   log_Printf(LogID0, "login(\"%s\", \"%.*s\")\n",
209             ut->ut_line, (int)(sizeof ut->ut_name), ut->ut_name);
210   ID0setuser();
211 }
212 
213 void
214 ID0logout(const char *device)
215 {
216   struct utmp ut;
217 
218   strncpy(ut.ut_line, device, sizeof ut.ut_line - 1);
219   ut.ut_line[sizeof ut.ut_line - 1] = '\0';
220 
221   ID0set0();
222   if (logout(ut.ut_line)) {
223     log_Printf(LogID0, "logout(\"%s\")\n", ut.ut_line);
224     logwtmp(ut.ut_line, "", "");
225     log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut.ut_line);
226   } else
227     log_Printf(LogERROR, "ID0logout: No longer logged in on %s\n", ut.ut_line);
228   ID0setuser();
229 }
230 
231 int
232 ID0bind_un(int s, const struct sockaddr_un *name)
233 {
234   int result;
235 
236   ID0set0();
237   result = bind(s, (const struct sockaddr *)name, sizeof *name);
238   log_Printf(LogID0, "%d = bind(%d, \"%s\", %d)\n",
239             result, s, name->sun_path, (int)sizeof(*name));
240   ID0setuser();
241   return result;
242 }
243 
244 int
245 ID0connect_un(int s, const struct sockaddr_un *name)
246 {
247   int result;
248 
249   ID0set0();
250   result = connect(s, (const struct sockaddr *)name, sizeof *name);
251   log_Printf(LogID0, "%d = connect(%d, \"%s\", %d)\n",
252             result, s, name->sun_path, (int)sizeof(*name));
253   ID0setuser();
254   return result;
255 }
256 
257 int
258 ID0kill(pid_t pid, int sig)
259 {
260   int result;
261 
262   ID0set0();
263   result = kill(pid, sig);
264   log_Printf(LogID0, "%d = kill(%d, %d)\n", result, (int)pid, sig);
265   ID0setuser();
266   return result;
267 }
268