ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/user_stats.c
Revision: 1.25
Committed: Wed Apr 7 21:08:40 2004 UTC (20 years, 1 month ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_10
Changes since 1.24: +2 -1 lines
Log Message:
The rest of the error handling stuff (except the vector code).

I've been extremely unimaginative with the string names in error.c, but
they're all in one place so much easier to tidy up. I'm also beginning to
wonder if we actually needed an SG_ERROR_SYSTEM_CALL to indicate some call
into the system failed - because the majority of our errors are those :-)

Still to do, then:
 - vector code
 - better string names in error.c
 - deal with arg string in some way
 - make use of the error status in statgrab/saidar/examples

File Contents

# Content
1 /*
2 * i-scream libstatgrab
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2004 i-scream
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 * 02111-1307 USA
20 *
21 * $Id: user_stats.c,v 1.24 2004/04/07 14:53:40 tdb Exp $
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include "statgrab.h"
32 #include "vector.h"
33 #ifdef ALLBSD
34 #include <sys/types.h>
35 #endif
36 #if defined(NETBSD) || defined(OPENBSD)
37 #include <limits.h>
38 #endif
39 #ifdef OPENBSD
40 #include <sys/param.h>
41 #endif
42 #include <utmp.h>
43 #ifdef CYGWIN
44 #include <sys/unistd.h>
45 #endif
46
47 sg_user_stats *sg_get_user_stats(){
48 int num_users = 0, pos = 0, new_pos;
49 VECTOR_DECLARE_STATIC(name_list, char, 128, NULL, NULL);
50 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
58
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
77 if ((f=fopen(_PATH_UTMP, "r")) == NULL){
78 sg_set_error(SG_ERROR_OPEN, _PATH_UTMP);
79 return NULL;
80 }
81 while((fread(&entry, sizeof(entry),1,f)) != 0){
82 if (entry.ut_name[0] == '\0') continue;
83
84 new_pos = pos + strlen(entry.ut_name) + 1;
85 if (VECTOR_RESIZE(name_list, new_pos) < 0) {
86 return NULL;
87 }
88
89 strcpy(name_list + pos, entry.ut_name);
90 name_list[new_pos - 1] = ' ';
91 pos = new_pos;
92 num_users++;
93 }
94 fclose(f);
95 #endif
96
97 /* Remove the extra space at the end, and append a \0. */
98 if (num_users != 0) {
99 pos--;
100 }
101 if (VECTOR_RESIZE(name_list, pos + 1) < 0) {
102 return NULL;
103 }
104 name_list[pos] = '\0';
105
106 user_stats.num_entries = num_users;
107 user_stats.name_list = name_list;
108 return &user_stats;
109 }