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