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

# User Rev Content
1 tdb 1.14 /*
2 pajs 1.1 * i-scream central monitoring system
3 tdb 1.9 * http://www.i-scream.org
4 tdb 1.14 * Copyright (C) 2000-2004 i-scream
5 pajs 1.1 *
6 tdb 1.14 * 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 pajs 1.1 *
11 tdb 1.14 * This library is distributed in the hope that it will be useful,
12 pajs 1.1 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 tdb 1.14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * Lesser General Public License for more details.
15 pajs 1.1 *
16 tdb 1.14 * 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 tdb 1.15 *
21 tdb 1.18 * $Id: user_stats.c,v 1.17 2004/01/21 14:44:22 ats Exp $
22 pajs 1.1 */
23    
24     #ifdef HAVE_CONFIG_H
25     #include "config.h"
26     #endif
27 tdb 1.3
28 pajs 1.1 #include <stdlib.h>
29     #include <stdio.h>
30     #include <string.h>
31 pajs 1.8 #include "statgrab.h"
32 ats 1.10 #ifdef ALLBSD
33 pajs 1.8 #include <sys/types.h>
34 ats 1.17 #endif
35 tdb 1.18 #if defined(NETBSD) || defined(OPENBSD)
36 ats 1.17 #include <limits.h>
37 pajs 1.8 #endif
38 tdb 1.18 #ifdef OPENBSD
39     #include <sys/param.h>
40     #endif
41 pajs 1.1 #include <utmp.h>
42 tdb 1.16 #ifdef CYGWIN
43     #include <sys/unistd.h>
44     #endif
45 pajs 1.1
46 pajs 1.13 #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 tdb 1.18 #if defined(NETBSD) || defined(OPENBSD)
53 pajs 1.13 #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 pajs 1.5 #define START_VAL (5*(1+MAX_LOGIN_NAME_SIZE))
60 pajs 1.1
61     user_stat_t *get_user_stats(){
62     int num_users=0;
63    
64 pajs 1.5 static user_stat_t user_stats;
65     static int size_of_namelist=-1;
66     char *tmp;
67 ats 1.12 #if defined(SOLARIS) || defined(LINUX) || defined(CYGWIN)
68 pajs 1.1 struct utmp *entry;
69 pajs 1.8 #endif
70 ats 1.10 #ifdef ALLBSD
71 pajs 1.8 struct utmp entry;
72     FILE *f;
73     #endif
74 pajs 1.1
75     /* First case call */
76 pajs 1.5 if (size_of_namelist==-1){
77     user_stats.name_list=malloc(START_VAL);
78     if(user_stats.name_list==NULL){
79 pajs 1.1 return NULL;
80     }
81 pajs 1.5 size_of_namelist=START_VAL;
82 pajs 1.1 }
83    
84 pajs 1.5 /* Essentially blank the list, or give it a inital starting string */
85     strcpy(user_stats.name_list, "");
86 pajs 1.8
87 ats 1.12 #if defined(SOLARIS) || defined(LINUX) || defined(CYGWIN)
88 pajs 1.1 setutent();
89     while((entry=getutent()) != NULL) {
90     if(entry->ut_type==USER_PROCESS) {
91 pajs 1.5 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 pajs 1.1 return NULL;
97     }
98 pajs 1.5 size_of_namelist=1+(size_of_namelist*2);
99 pajs 1.1 }
100    
101 pajs 1.5 strncat(user_stats.name_list, entry->ut_user, MAX_LOGIN_NAME_SIZE);
102     strcat(user_stats.name_list, " ");
103 pajs 1.1 num_users++;
104     }
105     }
106     endutent();
107 pajs 1.8 #endif
108 ats 1.10 #ifdef ALLBSD
109 pajs 1.8 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 pajs 1.1
130 pajs 1.8 #endif
131 pajs 1.5 /* We want to remove the last " " */
132 pajs 1.7 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 pajs 1.5
140     return &user_stats;
141 pajs 1.1
142     }