1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <bits/libc-lock.h>
21: #include <stdlib.h>
22: #include <string.h>
23: #include <utmp.h>
24:
25: #include "utmp-private.h"
26:
27:
28:
29: static const char default_file_name[] = _PATH_UTMP;
30:
31:
32: const char *__libc_utmp_file_name = (const char *) default_file_name;
33:
34:
35: __libc_lock_define (extern, __libc_utmp_lock attribute_hidden)
36:
37:
38: int
39: __utmpname (const char *file)
40: {
41: int result = -1;
42:
43: __libc_lock_lock (__libc_utmp_lock);
44:
45:
46: (*__libc_utmp_jump_table->endutent) ();
47: __libc_utmp_jump_table = &__libc_utmp_unknown_functions;
48:
49: if (strcmp (file, __libc_utmp_file_name) != 0)
50: {
51: if (strcmp (file, default_file_name) == 0)
52: {
53: free ((char *) __libc_utmp_file_name);
54:
55: __libc_utmp_file_name = default_file_name;
56: }
57: else
58: {
59: char *file_name = __strdup (file);
60: if (file_name == NULL)
61:
62: goto done;
63:
64: if (__libc_utmp_file_name != default_file_name)
65: free ((char *) __libc_utmp_file_name);
66:
67: __libc_utmp_file_name = file_name;
68: }
69: }
70:
71: result = 0;
72:
73: done:
74: __libc_lock_unlock (__libc_utmp_lock);
75: return result;
76: }
77: weak_alias (__utmpname, utmpname)