ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/tools.c
Revision: 1.27
Committed: Tue Feb 10 16:23:07 2004 UTC (20 years, 3 months ago) by pajs
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_8_2
Changes since 1.26: +3 -1 lines
Log Message:
Added extra ifdef due to compile error

File Contents

# User Rev Content
1 tdb 1.23 /*
2 tdb 1.5 * i-scream central monitoring system
3 tdb 1.6 * http://www.i-scream.org
4 tdb 1.23 * Copyright (C) 2000-2004 i-scream
5 tdb 1.5 *
6 tdb 1.23 * 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 tdb 1.5 *
11 tdb 1.23 * This library is distributed in the hope that it will be useful,
12 tdb 1.5 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 tdb 1.23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * Lesser General Public License for more details.
15 tdb 1.5 *
16 tdb 1.23 * 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.24 *
21 pajs 1.27 * $Id: tools.c,v 1.26 2004/02/10 16:16:22 pajs Exp $
22 tdb 1.5 */
23    
24     #ifdef HAVE_CONFIG_H
25     #include "config.h"
26     #endif
27    
28 pajs 1.1 #include <stdio.h>
29     #include <string.h>
30 pajs 1.3 #include <stdlib.h>
31 ats 1.18 #include <unistd.h>
32 pajs 1.3 #include <sys/types.h>
33     #include <regex.h>
34 ats 1.9 #ifdef ALLBSD
35 ats 1.8 #include <fcntl.h>
36     #include <kvm.h>
37     #endif
38 ats 1.9 #ifdef NETBSD
39     #include <uvm/uvm_extern.h>
40     #endif
41 pajs 1.1
42 ats 1.7 #include "tools.h"
43    
44 pajs 1.14 #ifdef SOLARIS
45 pajs 1.27 #ifdef HAVE_LIBDEVINFO_H
46 pajs 1.14 #include <libdevinfo.h>
47 pajs 1.27 #endif
48 pajs 1.14 #include <kstat.h>
49     #include <unistd.h>
50     #include <ctype.h>
51     #include <sys/types.h>
52     #include <sys/dkio.h>
53     #include <sys/stat.h>
54     #include <fcntl.h>
55     #include <sys/fcntl.h>
56     #include <dirent.h>
57     #endif
58    
59 pajs 1.26 #if defined(SOLARIS) && defined(HAVE_LIBDEVINFO_H)
60 pajs 1.14 struct map{
61     char *bsd;
62     char *svr;
63    
64     struct map *next;
65     };
66     typedef struct map mapping_t;
67    
68     static mapping_t *mapping = NULL;
69 pajs 1.26 #endif
70 pajs 1.14
71 pajs 1.26 #ifdef SOLARIS
72 pajs 1.14 char *get_svr_from_bsd(char *bsd){
73 pajs 1.26 #ifdef HAVE_LIBDEVINFO_H
74 pajs 1.14 mapping_t *map_ptr;
75     for(map_ptr = mapping; map_ptr != NULL; map_ptr = map_ptr->next)
76     if(!strcmp(map_ptr->bsd, bsd)) return map_ptr->svr;
77 pajs 1.26 #endif
78 pajs 1.14 return bsd;
79     }
80 pajs 1.26 #endif
81 pajs 1.14
82 pajs 1.26 #if defined(SOLARIS) && defined(HAVE_LIBDEVINFO_H)
83 pajs 1.14 void add_mapping(char *bsd, char *svr){
84     mapping_t *map_ptr;
85     mapping_t *map_end_ptr;
86    
87     bsd = strdup(bsd);
88     svr = strdup(svr);
89    
90     if (mapping == NULL){
91     mapping = malloc(sizeof(mapping_t));
92     if (mapping == NULL) return;
93     map_ptr = mapping;
94     }else{
95     /* See if its already been added */
96     for(map_ptr = mapping; map_ptr != NULL; map_ptr = map_ptr->next){
97     if( (!strcmp(map_ptr->bsd, bsd)) || (!strcmp(map_ptr->svr, svr)) ){
98     return;
99     }
100     map_end_ptr = map_ptr;
101     }
102    
103     /* We've reached end of list and not found the entry.. So we need to malloc
104     * new mapping_t
105     */
106     map_end_ptr->next = malloc(sizeof(mapping_t));
107     if (map_end_ptr->next == NULL) return;
108     map_ptr = map_end_ptr->next;
109     }
110    
111     map_ptr->next = NULL;
112     map_ptr->bsd = bsd;
113     map_ptr->svr = svr;
114    
115     return;
116     }
117    
118     char *read_dir(char *disk_path){
119     DIR *dirp;
120 tdb 1.15 struct dirent *dp;
121     struct stat stbuf;
122 pajs 1.14 char *svr_name;
123 tdb 1.15 char current_dir[MAXPATHLEN];
124     char file_name[MAXPATHLEN];
125     char temp_name[MAXPATHLEN];
126     char dir_dname[MAXPATHLEN];
127 pajs 1.14 char *dsk_dir;
128     int x;
129    
130     dsk_dir = "/dev/osa/dev/dsk";
131 tdb 1.15 strncpy(current_dir, dsk_dir, sizeof current_dir);
132     if ((dirp = opendir(current_dir)) == NULL){
133 pajs 1.14 dsk_dir = "/dev/dsk";
134     snprintf(current_dir, sizeof current_dir, "%s", dsk_dir);
135     if ((dirp = opendir(current_dir)) == NULL){
136     return NULL;
137     }
138     }
139    
140 tdb 1.15 while ((dp = readdir(dirp)) != NULL){
141 pajs 1.14 snprintf(temp_name, sizeof temp_name, "../..%s", disk_path);
142     snprintf(dir_dname, sizeof dir_dname, "%s/%s", dsk_dir, dp->d_name);
143     stat(dir_dname,&stbuf);
144    
145     if (S_ISBLK(stbuf.st_mode)){
146     x = readlink(dir_dname, file_name, sizeof(file_name));
147     file_name[x] = '\0';
148     if (strcmp(file_name, temp_name) == 0) {
149     svr_name = strdup(dp->d_name);
150     closedir(dirp);
151     return svr_name;
152     }
153     }
154     }
155 tdb 1.16 closedir(dirp);
156 pajs 1.14 return NULL;
157     }
158    
159    
160    
161     int get_alias(char *alias){
162     char file[MAXPATHLEN];
163     di_node_t root_node;
164     di_node_t node;
165     di_minor_t minor = DI_MINOR_NIL;
166     char tmpnode[MAXPATHLEN];
167     char *phys_path;
168     char *minor_name;
169     char *value;
170     int instance;
171     if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) {
172 pajs 1.17 return 1;
173 pajs 1.14 }
174     node = di_drv_first_node(alias, root_node);
175     while (node != DI_NODE_NIL) {
176     if ((minor = di_minor_next(node, DI_MINOR_NIL)) != DI_MINOR_NIL) {
177     instance = di_instance(node);
178     phys_path = di_devfs_path(node);
179     minor_name = di_minor_name(minor);
180     strcpy(tmpnode, alias);
181     sprintf(tmpnode, "%s%d", tmpnode, instance);
182 pajs 1.17 strlcpy(file, "/devices", sizeof file);
183     strlcat(file, phys_path, sizeof file);
184     strlcat(file, ":", sizeof file);
185     strlcat(file, minor_name, sizeof file);
186 pajs 1.14 value = read_dir(file);
187     if (value != NULL){
188     add_mapping(tmpnode, value);
189     }
190     di_devfs_path_free(phys_path);
191     node = di_drv_next_node(node);
192     }else{
193     node = di_drv_next_node(node);
194     }
195 tdb 1.15 }
196 pajs 1.14 di_fini(root_node);
197 pajs 1.17 return 0;
198 pajs 1.14 }
199    
200 pajs 1.22
201     #define BIG_ENOUGH 512
202 pajs 1.17 int build_mapping(){
203 pajs 1.22 char device_name[BIG_ENOUGH];
204 pajs 1.14 int x;
205 tdb 1.15 kstat_ctl_t *kc;
206     kstat_t *ksp;
207     kstat_io_t kios;
208 pajs 1.14
209 pajs 1.22 char driver_list[BIG_ENOUGH][BIG_ENOUGH];
210     int list_entries = 0;
211     int found;
212    
213 pajs 1.14 if ((kc = kstat_open()) == NULL) {
214 tdb 1.16 return;
215 tdb 1.15 }
216 pajs 1.14
217 tdb 1.15 for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) {
218     if (!strcmp(ksp->ks_class, "disk")) {
219     if(ksp->ks_type != KSTAT_TYPE_IO) continue;
220     /* We dont want metadevices appearing as num_diskio */
221     if(strcmp(ksp->ks_module, "md")==0) continue;
222     if((kstat_read(kc, ksp, &kios))==-1) continue;
223 pajs 1.14 strncpy(device_name, ksp->ks_name, sizeof device_name);
224     for(x=0;x<(sizeof device_name);x++){
225     if( isdigit((int)device_name[x]) ) break;
226     }
227     if(x == sizeof device_name) x--;
228     device_name[x] = '\0';
229 pajs 1.22
230     /* Check if we've not already looked it up */
231     found = 0;
232     for(x=0;x<list_entries;x++){
233     if (x>=BIG_ENOUGH){
234     /* We've got bigger than we thought was massive */
235     /* If we hit this.. Make big enough bigger */
236     return 1;
237     }
238     if( !strncmp(driver_list[x], device_name, BIG_ENOUGH)){
239     found = 1;
240     break;
241     }
242     }
243    
244     if(!found){
245     if((get_alias(device_name)) != 0){
246     return 1;
247     }
248     strncpy(driver_list[x], device_name, BIG_ENOUGH);
249     list_entries++;
250 pajs 1.17 }
251 tdb 1.15 }
252 pajs 1.14 }
253 tdb 1.15
254 pajs 1.17 return 0;
255 pajs 1.14 }
256    
257     #endif
258    
259    
260    
261 pajs 1.1 char *f_read_line(FILE *f, const char *string){
262     /* Max line length. 8k should be more than enough */
263     static char line[8192];
264    
265 pajs 1.2 while((fgets(line, sizeof(line), f))!=NULL){
266 pajs 1.1 if(strncmp(string, line, strlen(string))==0){
267     return line;
268     }
269     }
270    
271     return NULL;
272 pajs 1.3 }
273    
274     char *get_string_match(char *line, regmatch_t *match){
275     int len=match->rm_eo - match->rm_so;
276     char *match_string=malloc(len+1);
277    
278     match_string=strncpy(match_string, line+match->rm_so, len);
279     match_string[len]='\0';
280    
281     return match_string;
282     }
283 ats 1.7
284 pajs 1.14
285    
286 ats 1.13 #ifndef HAVE_ATOLL
287     static long long atoll(const char *s) {
288     long long value = 0;
289     int isneg = 0;
290    
291     while (*s == ' ' || *s == '\t') {
292     s++;
293     }
294     if (*s == '-') {
295     isneg = 1;
296     s++;
297     }
298     while (*s >= '0' && *s <= '9') {
299     value = (10 * value) + (*s - '0');
300     s++;
301     }
302     return (isneg ? -value : value);
303     }
304     #endif
305    
306 pajs 1.19 #ifndef HAVE_STRLCPY
307 ats 1.21 /* $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $ */
308 pajs 1.19
309     /*
310     * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
311     *
312     * Permission to use, copy, modify, and distribute this software for any
313     * purpose with or without fee is hereby granted, provided that the above
314     * copyright notice and this permission notice appear in all copies.
315     *
316     * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
317     * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
318     * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
319     * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
320     * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
321     * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
322     * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
323     */
324    
325     /*
326     * Copy src to string dst of size siz. At most siz-1 characters
327     * will be copied. Always NUL terminates (unless siz == 0).
328     * Returns strlen(src); if retval >= siz, truncation occurred.
329     */
330     size_t strlcpy(char *dst, const char *src, size_t siz){
331     register char *d = dst;
332     register const char *s = src;
333     register size_t n = siz;
334    
335     /* Copy as many bytes as will fit */
336     if (n != 0 && --n != 0) {
337     do {
338     if ((*d++ = *s++) == 0)
339     break;
340     } while (--n != 0);
341     }
342    
343     /* Not enough room in dst, add NUL and traverse rest of src */
344     if (n == 0) {
345     if (siz != 0)
346     *d = '\0'; /* NUL-terminate dst */
347     while (*s++)
348     ;
349     }
350    
351     return(s - src - 1); /* count does not include NUL */
352     }
353     #endif
354    
355     #ifndef HAVE_STRLCAT
356     /* $OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $ */
357    
358     /*
359     * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
360     *
361     * Permission to use, copy, modify, and distribute this software for any
362     * purpose with or without fee is hereby granted, provided that the above
363     * copyright notice and this permission notice appear in all copies.
364     *
365     * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
366     * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
367     * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
368     * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
369     * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
370     * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
371     * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
372     */
373    
374     /*
375     * Appends src to string dst of size siz (unlike strncat, siz is the
376     * full size of dst, not space left). At most siz-1 characters
377     * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
378     * Returns strlen(src) + MIN(siz, strlen(initial dst)).
379     * If retval >= siz, truncation occurred.
380     */
381     size_t strlcat(char *dst, const char *src, size_t siz){
382     register char *d = dst;
383     register const char *s = src;
384     register size_t n = siz;
385     size_t dlen;
386    
387     /* Find the end of dst and adjust bytes left but don't go past end */
388     while (n-- != 0 && *d != '\0')
389     d++;
390     dlen = d - dst;
391     n = siz - dlen;
392    
393     if (n == 0)
394     return(dlen + strlen(s));
395     while (*s != '\0') {
396     if (n != 1) {
397     *d++ = *s;
398     n--;
399     }
400     s++;
401     }
402     *d = '\0';
403    
404     return(dlen + (s - src)); /* count does not include NUL */
405     }
406    
407     #endif
408    
409 pajs 1.3 long long get_ll_match(char *line, regmatch_t *match){
410     char *ptr;
411     long long num;
412    
413     ptr=line+match->rm_so;
414     num=atoll(ptr);
415    
416     return num;
417 ats 1.8 }
418    
419 ats 1.9 #ifdef ALLBSD
420 ats 1.8 kvm_t *get_kvm() {
421     static kvm_t *kvmd = NULL;
422    
423     if (kvmd != NULL) {
424     return kvmd;
425     }
426    
427     kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL);
428     return kvmd;
429 pajs 1.1 }
430 pajs 1.4 #endif
431 ats 1.9
432     #ifdef NETBSD
433     struct uvmexp *get_uvmexp() {
434     static u_long addr = 0;
435     static struct uvmexp uvm;
436     kvm_t *kvmd = get_kvm();
437    
438     if (kvmd == NULL) {
439     return NULL;
440     }
441    
442     if (addr == 0) {
443     struct nlist symbols[] = {
444     { "_uvmexp" },
445     { NULL }
446     };
447    
448     if (kvm_nlist(kvmd, symbols) != 0) {
449     return NULL;
450     }
451     addr = symbols[0].n_value;
452     }
453    
454     if (kvm_read(kvmd, addr, &uvm, sizeof uvm) != sizeof uvm) {
455     return NULL;
456     }
457     return &uvm;
458     }
459     #endif
460    
461 pajs 1.10 int statgrab_init(){
462 pajs 1.11 #ifdef ALLBSD
463     {
464     kvm_t *kvmd = get_kvm();
465 tdb 1.15 if (kvmd == NULL) return 1;
466 pajs 1.11 }
467 pajs 1.10 #endif
468     #ifdef NETBSD
469 pajs 1.11 {
470     struct uvmexp *uvm = get_uvmexp();
471     if (uvm == NULL) return 1;
472     }
473 pajs 1.14 #endif
474     #ifdef SOLARIS
475 pajs 1.20 /* On solaris 7, this will fail if you are not root. But, everything
476     * will still work, just no disk mappings. So we will ignore the exit
477     * status of this, and carry on merrily.
478     */
479 pajs 1.26 #ifdef HAVE_LIBDEVINFO_H
480 pajs 1.20 build_mapping();
481 pajs 1.25 #endif
482 pajs 1.10 #endif
483     return 0;
484     }
485 ats 1.18
486     int statgrab_drop_privileges() {
487     if (setegid(getgid()) != 0) return -1;
488     if (seteuid(getuid()) != 0) return -1;
489     return 0;
490     }
491