support rump client mode

This commit is contained in:
pooka 2010-11-05 13:42:37 +00:00
parent eb6f26d7ad
commit 1ec3731938
2 changed files with 64 additions and 19 deletions

View File

@ -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 @@ CPPFLAGS+= -I${.CURDIR} -I.
YHEADER= yes
.ifdef RUMP_ACTION
LDADD+= -lrumpclient
CPPFLAGS+= -DRUMP_SYS_OPEN -DRUMP_SYS_CLOSE
CPPFLAGS+= -DRUMP_ACTION
DBG= -g
.endif
.include <bsd.prog.mk>

View File

@ -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 @@ __RCSID("$NetBSD: envstat.c,v 1.80 2010/10/05 00:14:55 pgoyette Exp $");
#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 bool statistics;
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 @@ int main(int argc, char **argv)
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 @@ int main(int argc, char **argv)
/* 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 @@ int main(int argc, char **argv)
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 @@ int main(int argc, char **argv)
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 @@ int main(int argc, char **argv)
}
/* 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 @@ send_dictionary(FILE *cf, int fd)
/*
* 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_dictionary(FILE *cf, int fd)
/*
* 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));