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