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));
 

Reply via email to