ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/user_stats.c
Revision: 1.18
Committed: Thu Feb 12 23:04:52 2004 UTC (20 years, 3 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.17: +6 -3 lines
Log Message:
Add preliminary support for OpenBSD (tested on 3.3).

All works apart from Disk IO stats - currently the disks are not named
correctly. The fix for this is probably to use KVM.

Mostly similar to the NetBSD code, the notable exception being the uvm
stuff. In NetBSD there's a function to get it, in OpenBSD sysctl is needed
to get hold of it.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
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.17 2004/01/21 14:44:22 ats 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 #ifdef ALLBSD
33 #include <sys/types.h>
34 #endif
35 #if defined(NETBSD) || defined(OPENBSD)
36 #include <limits.h>
37 #endif
38 #ifdef OPENBSD
39 #include <sys/param.h>
40 #endif
41 #include <utmp.h>
42 #ifdef CYGWIN
43 #include <sys/unistd.h>
44 #endif
45
46 #ifdef SOLARIS
47 #define MAX_LOGIN_NAME_SIZE 8
48 #endif
49 #if defined(LINUX) || defined(FREEBSD)
50 #define MAX_LOGIN_NAME_SIZE UT_NAMESIZE
51 #endif
52 #if defined(NETBSD) || defined(OPENBSD)
53 #define MAX_LOGIN_NAME_SIZE _POSIX_LOGIN_NAME_MAX
54 #endif
55 #if defined(CYGWIN)
56 #define MAX_LOGIN_NAME_SIZE _SC_LOGIN_NAME_MAX
57 #endif
58
59 #define START_VAL (5*(1+MAX_LOGIN_NAME_SIZE))
60
61 user_stat_t *get_user_stats(){
62 int num_users=0;
63
64 static user_stat_t user_stats;
65 static int size_of_namelist=-1;
66 char *tmp;
67 #if defined(SOLARIS) || defined(LINUX) || defined(CYGWIN)
68 struct utmp *entry;
69 #endif
70 #ifdef ALLBSD
71 struct utmp entry;
72 FILE *f;
73 #endif
74
75 /* First case call */
76 if (size_of_namelist==-1){
77 user_stats.name_list=malloc(START_VAL);
78 if(user_stats.name_list==NULL){
79 return NULL;
80 }
81 size_of_namelist=START_VAL;
82 }
83
84 /* Essentially blank the list, or give it a inital starting string */
85 strcpy(user_stats.name_list, "");
86
87 #if defined(SOLARIS) || defined(LINUX) || defined(CYGWIN)
88 setutent();
89 while((entry=getutent()) != NULL) {
90 if(entry->ut_type==USER_PROCESS) {
91 if((strlen(user_stats.name_list)+MAX_LOGIN_NAME_SIZE+2) > size_of_namelist){
92 tmp=user_stats.name_list;
93 user_stats.name_list=realloc(user_stats.name_list, 1+(size_of_namelist*2));
94 if(user_stats.name_list==NULL){
95 user_stats.name_list=tmp;
96 return NULL;
97 }
98 size_of_namelist=1+(size_of_namelist*2);
99 }
100
101 strncat(user_stats.name_list, entry->ut_user, MAX_LOGIN_NAME_SIZE);
102 strcat(user_stats.name_list, " ");
103 num_users++;
104 }
105 }
106 endutent();
107 #endif
108 #ifdef ALLBSD
109 if ((f=fopen(_PATH_UTMP, "r")) == NULL){
110 return NULL;
111 }
112 while((fread(&entry, sizeof(entry),1,f)) != 0){
113 if (entry.ut_name[0] == '\0') continue;
114 if((strlen(user_stats.name_list)+MAX_LOGIN_NAME_SIZE+2) > size_of_namelist){
115 tmp=user_stats.name_list;
116 user_stats.name_list=realloc(user_stats.name_list, 1+(size_of_namelist*2));
117 if(user_stats.name_list==NULL){
118 user_stats.name_list=tmp;
119 return NULL;
120 }
121 size_of_namelist=1+(size_of_namelist*2);
122
123 }
124 strncat(user_stats.name_list, entry.ut_name, MAX_LOGIN_NAME_SIZE);
125 strcat(user_stats.name_list, " ");
126 num_users++;
127 }
128 fclose(f);
129
130 #endif
131 /* We want to remove the last " " */
132 if(num_users!=0){
133 tmp=strrchr(user_stats.name_list, ' ');
134 if(tmp!=NULL){
135 *tmp='\0';
136 user_stats.num_entries=num_users;
137 }
138 }
139
140 return &user_stats;
141
142 }