Module Name: src Committed By: pooka Date: Fri Nov 5 13:42:37 UTC 2010
Modified Files: src/usr.sbin/envstat: Makefile envstat.c Log Message: support rump client mode To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/envstat/Makefile cvs rdiff -u -r1.80 -r1.81 src/usr.sbin/envstat/envstat.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/envstat/Makefile diff -u src/usr.sbin/envstat/Makefile:1.7 src/usr.sbin/envstat/Makefile:1.8 --- src/usr.sbin/envstat/Makefile:1.7 Thu Oct 29 14:38:37 2009 +++ src/usr.sbin/envstat/Makefile Fri Nov 5 13:42:37 2010 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.7 2009/10/29 14:38:37 christos Exp $ +# $NetBSD: Makefile,v 1.8 2010/11/05 13:42:37 pooka Exp $ PROG= envstat SRCS+= envstat.c config.c config_yacc.y config_lex.l @@ -12,4 +12,11 @@ YHEADER= yes +.ifdef RUMP_ACTION +LDADD+= -lrumpclient +CPPFLAGS+= -DRUMP_SYS_OPEN -DRUMP_SYS_CLOSE +CPPFLAGS+= -DRUMP_ACTION +DBG= -g +.endif + .include <bsd.prog.mk> Index: src/usr.sbin/envstat/envstat.c diff -u src/usr.sbin/envstat/envstat.c:1.80 src/usr.sbin/envstat/envstat.c:1.81 --- src/usr.sbin/envstat/envstat.c:1.80 Tue Oct 5 00:14:55 2010 +++ src/usr.sbin/envstat/envstat.c Fri Nov 5 13:42:37 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: envstat.c,v 1.80 2010/10/05 00:14:55 pgoyette Exp $ */ +/* $NetBSD: envstat.c,v 1.81 2010/11/05 13:42:37 pooka Exp $ */ /*- * Copyright (c) 2007, 2008 Juan Romero Pardines. @@ -27,12 +27,13 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: envstat.c,v 1.80 2010/10/05 00:14:55 pgoyette Exp $"); +__RCSID("$NetBSD: envstat.c,v 1.81 2010/11/05 13:42:37 pooka Exp $"); #endif /* not lint */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> +#include <stdarg.h> #include <string.h> #include <unistd.h> #include <fcntl.h> @@ -41,12 +42,19 @@ #include <paths.h> #include <syslog.h> #include <sys/envsys.h> +#include <sys/ioctl.h> #include <sys/types.h> #include <sys/queue.h> #include <prop/proplib.h> #include "envstat.h" +#ifdef RUMP_ACTION +#include <rump/rump.h> +#include <rump/rumpclient.h> +#include <rump/rump_syscalls.h> +#endif + #define ENVSYS_DFLAG 0x00000001 /* list registered devices */ #define ENVSYS_FFLAG 0x00000002 /* show temp in farenheit */ #define ENVSYS_LFLAG 0x00000004 /* list sensors */ @@ -106,20 +114,47 @@ static u_int header_passes; static int parse_dictionary(int); -static int send_dictionary(FILE *, int); +static int send_dictionary(FILE *); static int find_sensors(prop_array_t, const char *, dvprops_t); static void print_sensors(void); static int check_sensors(char *); static int usage(void); +static int sysmonfd; /* fd of /dev/sysmon */ + +/* sneak in between ioctl() */ +#ifdef RUMP_ACTION +#include <sys/syscall.h> +int +ioctl(int fd, unsigned long request, ...) +{ + va_list ap; + int rv; + + va_start(ap, request); + if (fd == sysmonfd) + rv = rump_sys_ioctl(fd, request, va_arg(ap, void *)); + else + rv = syscall(SYS_ioctl, fd, request, va_arg(ap, void *)); + va_end(ap); + + return rv; +} +#endif int main(int argc, char **argv) { prop_dictionary_t dict; - int c, fd, rval = 0; + int c, rval = 0; char *endptr, *configfile = NULL; FILE *cf; +#ifdef RUMP_ACTION + int error; + if ((error = rumpclient_init()) != 0) + errx(1, "rumpclient init failed: %s", strerror(error)); +#endif + setprogname(argv[0]); while ((c = getopt(argc, argv, "c:Dd:fIi:klrSs:Tw:Wx")) != -1) { @@ -207,12 +242,12 @@ errx(EXIT_FAILURE, "-d flag cannot be used with -s"); /* Open the device in ro mode */ - if ((fd = open(_PATH_SYSMON, O_RDONLY)) == -1) + if ((sysmonfd = open(_PATH_SYSMON, O_RDONLY)) == -1) err(EXIT_FAILURE, "%s", _PATH_SYSMON); /* Print dictionary in raw mode */ if (flags & ENVSYS_XFLAG) { - rval = prop_dictionary_recv_ioctl(fd, + rval = prop_dictionary_recv_ioctl(sysmonfd, ENVSYS_GETDICTIONARY, &dict); if (rval) @@ -223,10 +258,10 @@ /* Remove all properties set in dictionary */ } else if (flags & ENVSYS_SFLAG) { /* Close the ro descriptor */ - (void)close(fd); + (void)close(sysmonfd); /* open the fd in rw mode */ - if ((fd = open(_PATH_SYSMON, O_RDWR)) == -1) + if ((sysmonfd = open(_PATH_SYSMON, O_RDWR)) == -1) err(EXIT_FAILURE, "%s", _PATH_SYSMON); dict = prop_dictionary_create(); @@ -240,7 +275,8 @@ err(EXIT_FAILURE, "prop_dict_set_bool"); /* send the dictionary to the kernel now */ - rval = prop_dictionary_send_ioctl(dict, fd, ENVSYS_REMOVEPROPS); + rval = prop_dictionary_send_ioctl(dict, sysmonfd, + ENVSYS_REMOVEPROPS); if (rval) warnx("%s", strerror(rval)); @@ -254,13 +290,13 @@ errx(EXIT_FAILURE, "%s", strerror(errno)); } - rval = send_dictionary(cf, fd); + rval = send_dictionary(cf); (void)fclose(cf); /* Show sensors with interval */ } else if (interval) { for (;;) { - rval = parse_dictionary(fd); + rval = parse_dictionary(sysmonfd); if (rval) break; @@ -269,26 +305,27 @@ } /* Show sensors without interval */ } else { - rval = parse_dictionary(fd); + rval = parse_dictionary(sysmonfd); } if (sensors) free(sensors); if (mydevname) free(mydevname); - (void)close(fd); + (void)close(sysmonfd); return rval ? EXIT_FAILURE : EXIT_SUCCESS; } static int -send_dictionary(FILE *cf, int fd) +send_dictionary(FILE *cf) { prop_dictionary_t kdict, udict; int error = 0; /* Retrieve dictionary from kernel */ - error = prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &kdict); + error = prop_dictionary_recv_ioctl(sysmonfd, + ENVSYS_GETDICTIONARY, &kdict); if (error) return error; @@ -302,8 +339,8 @@ /* * Close the read only descriptor and open a new one read write. */ - (void)close(fd); - if ((fd = open(_PATH_SYSMON, O_RDWR)) == -1) { + (void)close(sysmonfd); + if ((sysmonfd = open(_PATH_SYSMON, O_RDWR)) == -1) { error = errno; warn("%s", _PATH_SYSMON); return error; @@ -312,7 +349,8 @@ /* * Send our sensor properties dictionary to the kernel then. */ - error = prop_dictionary_send_ioctl(udict, fd, ENVSYS_SETDICTIONARY); + error = prop_dictionary_send_ioctl(udict, + sysmonfd, ENVSYS_SETDICTIONARY); if (error) warnx("%s", strerror(error));