]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/opie/libopie/getutmpentry.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / opie / libopie / getutmpentry.c
1 /* getutmpentry.c: The __opiegetutmpentry() library function.
2
3 %%% copyright-cmetz-96
4 This software is Copyright 1996-2001 by Craig Metz, All Rights Reserved.
5 The Inner Net License Version 3 applies to this software.
6 You should have received a copy of the license with this software. If
7 you didn't get a copy, you may request one from <license@inner.net>.
8
9         History:
10
11         Modified by cmetz for OPIE 2.31. Cache result.
12         Created by cmetz for OPIE 2.3 (re-write).
13 */
14
15 #include "opie_cfg.h"
16 #include <stdio.h>
17 #include <sys/types.h>
18
19 #if DOUTMPX
20 #include <utmpx.h>
21 #define setutent setutxent
22 #define getutline(x) getutxline(x)
23 #define utmp utmpx
24 #else
25 #include <utmp.h>
26 #endif /* DOUTMPX */
27
28 #if HAVE_STRING_H
29 #include <string.h>
30 #endif /* HAVE_STRING_H */
31
32 #if DEBUG
33 #include <syslog.h>
34 #endif /* DEBUG */
35 #include "opie.h"
36
37 #if !HAVE_GETUTLINE && !DOUTMPX
38 struct utmp *getutline __P((struct utmp *));
39 #endif /* HAVE_GETUTLINE && !DOUTMPX */
40
41 static struct utmp u;
42
43 int __opiegetutmpentry FUNCTION((line, utmp), char *line AND struct utmp *utmp)
44 {
45   struct utmp *pu;
46
47   if (u.ut_line[0]) {
48     pu = &u;
49     goto gotit;
50   };
51
52   memset(&u, 0, sizeof(u));
53
54   if (!strncmp(line, "/dev/", 5)) {
55     strncpy(u.ut_line, line + 5, sizeof(u.ut_line));
56     setutent();
57     if ((pu = getutline(&u)))
58       goto gotit;
59
60 #ifdef hpux
61     strcpy(u.ut_line, "pty/");
62     strncpy(u.ut_line + 4, line + 5, sizeof(u.ut_line) - 4);
63     setutent();
64     if ((pu = getutline(&u)))
65       goto gotit;
66 #endif /* hpux */
67   }
68
69   strncpy(u.ut_line, line, sizeof(u.ut_line));
70   setutent();
71   if ((pu = getutline(&u)))
72     goto gotit;
73
74 #if DEBUG
75   syslog(LOG_DEBUG, "__opiegetutmpentry: failed to find entry for line %s", line);
76 #endif /* DEBUG */
77   return -1;
78
79 gotit:
80 #if DEBUG
81   syslog(LOG_DEBUG, "__opiegetutmpentry: succeeded with line %s", pu->ut_line);
82 #endif /* DEBUG */
83   memcpy(utmp, pu, sizeof(struct utmp));
84   return 0;
85 }