1/* getutline.c: A replacement for the getutline() function
2
3%%% copyright-cmetz-96
4This software is Copyright 1996-2001 by Craig Metz, All Rights Reserved.
5The Inner Net License Version 3 applies to this software.
6You should have received a copy of the license with this software. If
7you 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, play the SVID game, then use
15		Autoconf-discovered values.
16	Created by cmetz for OPIE 2.3.
17*/
18
19#include "opie_cfg.h"
20#include <stdio.h>
21#include <utmp.h>
22#include "opie.h"
23
24static struct utmp u;
25
26#ifndef _PATH_UTMP
27#ifdef UTMP_FILE
28#define _PATH_UTMP UTMP_FILE
29#else /* UTMP_FILE */
30#define _PATH_UTMP PATH_UTMP_AC
31#endif /* UTMP_FILE */
32#endif /* _PATH_UTMP */
33
34struct utmp *getutline FUNCTION((utmp), struct utmp *utmp)
35{
36  FILE *f;
37  int i;
38
39  if (!(f = __opieopen(_PATH_UTMP, 0, 0644)))
40    return 0;
41
42#if HAVE_TTYSLOT
43  if (i = ttyslot()) {
44    if (fseek(f, i * sizeof(struct utmp), SEEK_SET) < 0)
45      goto ret;
46    if (fread(&u, sizeof(struct utmp), 1, f) != 1)
47      goto ret;
48    fclose(f);
49    return &u;
50  }
51#endif /* HAVE_TTYSLOT */
52
53  while(fread(&u, sizeof(struct utmp), 1, f) == 1) {
54    if (!strncmp(utmp->ut_line, u.ut_line, sizeof(u.ut_line) - 1)) {
55      fclose(f);
56      return &u;
57    }
58  }
59
60ret:
61  fclose(f);
62  return NULL;
63}
64