Merge branch 'vendor/BINUTILS221'
[dragonfly.git] / contrib / opie / libmissing / pututline.c
1 /* pututline.c: A replacement for the pututline() 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.32. Fixed check for fread() return
12                 value.
13         Modified by cmetz for OPIE 2.31. If the OS won't tell us where
14                 _PATH_UTMP is, use Autoconf-discovered values.
15         Created by cmetz for OPIE 2.3.
16 */
17
18 #include "opie_cfg.h"
19 #include <stdio.h>
20 #include <utmp.h>
21 #include "opie.h"
22
23 #ifndef _PATH_UTMP
24 #define _PATH_UTMP      PATH_UTMP_AC
25 #endif /* _PATH_UTMP */
26
27 void pututline FUNCTION((utmp), struct utmp *utmp)
28 {
29   FILE *f;
30   struct utmp u;
31   int i;
32
33   if (!(f = __opieopen(_PATH_UTMP, 1, 0644)))
34     return;
35
36 #if HAVE_TTYSLOT
37   if (i = ttyslot()) {
38     if (fseek(f, i * sizeof(struct utmp), SEEK_SET) < 0)
39       goto ret;
40     fwrite(utmp, sizeof(struct utmp), 1, f);
41     goto ret;
42   }
43 #endif /* HAVE_TTYSLOT */
44
45   while(fread(&u, sizeof(struct utmp), 1, f) == 1) {
46     if (!strncmp(utmp->ut_line, u.ut_line, sizeof(u.ut_line) - 1)) {
47       if ((i = ftell(f)) < 0)
48         goto ret;
49       if (fseek(f, i - sizeof(struct utmp), SEEK_SET) < 0)
50         goto ret;
51       fwrite(utmp, sizeof(struct utmp), 1, f);
52       goto ret;
53     }
54   }
55
56   fclose(f);
57
58   if (!(f = __opieopen(_PATH_UTMP, 2, 0644)))
59     return;
60   fwrite(utmp, sizeof(struct utmp), 1, f);
61
62 ret:
63   fclose(f);
64 }