43 |
|
#ifdef CYGWIN |
44 |
|
#include <sys/unistd.h> |
45 |
|
#endif |
46 |
+ |
#ifdef HPUX |
47 |
+ |
#include <utmp.h> |
48 |
+ |
#endif |
49 |
|
|
50 |
|
sg_user_stats *sg_get_user_stats(){ |
51 |
|
int num_users = 0, pos = 0, new_pos; |
52 |
|
VECTOR_DECLARE_STATIC(name_list, char, 128, NULL, NULL); |
53 |
|
static sg_user_stats user_stats; |
51 |
– |
#if defined(SOLARIS) || defined(LINUX) || defined(CYGWIN) |
52 |
– |
struct utmp *entry; |
53 |
– |
#endif |
54 |
|
#ifdef ALLBSD |
55 |
|
struct utmp entry; |
56 |
|
FILE *f; |
57 |
– |
#endif |
57 |
|
|
59 |
– |
#if defined(SOLARIS) || defined(LINUX) || defined(CYGWIN) |
60 |
– |
setutent(); |
61 |
– |
while((entry=getutent()) != NULL) { |
62 |
– |
if (entry->ut_type != USER_PROCESS) continue; |
63 |
– |
|
64 |
– |
new_pos = pos + strlen(entry->ut_user) + 1; |
65 |
– |
if (VECTOR_RESIZE(name_list, new_pos) < 0) { |
66 |
– |
return NULL; |
67 |
– |
} |
68 |
– |
|
69 |
– |
strcpy(name_list + pos, entry->ut_user); |
70 |
– |
name_list[new_pos - 1] = ' '; |
71 |
– |
pos = new_pos; |
72 |
– |
num_users++; |
73 |
– |
} |
74 |
– |
endutent(); |
75 |
– |
#endif |
76 |
– |
#ifdef ALLBSD |
58 |
|
if ((f=fopen(_PATH_UTMP, "r")) == NULL){ |
59 |
|
sg_set_error_with_errno(SG_ERROR_OPEN, _PATH_UTMP); |
60 |
|
return NULL; |
73 |
|
num_users++; |
74 |
|
} |
75 |
|
fclose(f); |
76 |
+ |
#else |
77 |
+ |
/* This works on everything else. */ |
78 |
+ |
struct utmp *entry; |
79 |
+ |
|
80 |
+ |
setutent(); |
81 |
+ |
while((entry=getutent()) != NULL) { |
82 |
+ |
if (entry->ut_type != USER_PROCESS) continue; |
83 |
+ |
|
84 |
+ |
new_pos = pos + strlen(entry->ut_user) + 1; |
85 |
+ |
if (VECTOR_RESIZE(name_list, new_pos) < 0) { |
86 |
+ |
return NULL; |
87 |
+ |
} |
88 |
+ |
|
89 |
+ |
strcpy(name_list + pos, entry->ut_user); |
90 |
+ |
name_list[new_pos - 1] = ' '; |
91 |
+ |
pos = new_pos; |
92 |
+ |
num_users++; |
93 |
+ |
} |
94 |
+ |
endutent(); |
95 |
|
#endif |
96 |
|
|
97 |
|
/* Remove the extra space at the end, and append a \0. */ |