Problem: The help command is a lie.
mini:~> memconfig
Valid commands are :
list
set
clear
Use help <command> for command-specific help
mini:~> memconfig help list
memconfig: can't open /dev/mem: Permission denied
Fix: Only open /dev/mem if we're going to use it.
Index: memconfig.c
===================================================================
RCS file: /home/tedu/cvs/src/usr.sbin/memconfig/memconfig.c,v
retrieving revision 1.13
diff -u -r1.13 memconfig.c
--- memconfig.c 20 Apr 2010 16:10:27 -0000 1.13
+++ memconfig.c 6 Jun 2011 00:21:38 -0000
@@ -106,17 +106,18 @@
int
main(int argc, char *argv[])
{
- int i, memfd;
+ int i, memfd = -1;
if (argc < 2) {
help(NULL);
} else {
- if ((memfd = open("/dev/mem", O_RDONLY)) == -1)
- err(1, "can't open /dev/mem");
-
for (i = 0; functions[i].cmd != NULL; i++)
if (!strcmp(argv[1], functions[i].cmd))
break;
+
+ if ((functions[i].func != helpfunc) &&
+ (memfd = open("/dev/mem", O_RDONLY)) == -1)
+ err(1, "can't open /dev/mem");
functions[i].func(memfd, argc - 1, argv + 1);
close(memfd);
}