ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/user_stats.c
Revision: 1.19
Committed: Mon Feb 16 14:55:32 2004 UTC (20 years, 3 months ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_9
Changes since 1.18: +2 -2 lines
Log Message:
Add support for DragonFly BSD 1.0.
Also a minor tweak to the network interface code to make it more portable.

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.19 * $Id: user_stats.c,v 1.18 2004/02/12 23:04:52 tdb 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 tdb 1.19 #if defined(LINUX) || defined(FREEBSD) || defined(DFBSD)
50 pajs 1.13 #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     }