Unix Technical Forum

Re: =?ISO-8859-1?Q?Andr=E9s?= Delfino: IMHO, wsconsctl(8) output when setting variable values should be modified

This is a discussion on Re: =?ISO-8859-1?Q?Andr=E9s?= Delfino: IMHO, wsconsctl(8) output when setting variable values should be modified within the lucky.openbsd.tech forums, part of the OpenBSD category; --> In response to the mail on misc@ from Andris Delfino: > I guess wsconsctl(8) output when setting variable values ...


Go Back   Unix Technical Forum > Unix Operating Systems > OpenBSD > lucky.openbsd.tech

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 02-22-2008, 12:11 PM
Jared Yanovich
 
Posts: n/a
Default Re: =?ISO-8859-1?Q?Andr=E9s?= Delfino: IMHO, wsconsctl(8) output when setting variable values should be modified

In response to the mail on misc@ from Andris Delfino:

> I guess wsconsctl(8) output when setting variable values should be
> slightly modified, since mixerctl and sysctl uses: "variable:
> old_value -> new_value", and wsconsctl(8) uses: "variable ->
> new_value", as you can see below.
>
> $ mixerctl outputs.master=199,199
> outputs.master: 199,199 -> 199,199
>
> $ sudo sysctl machdep.userldt=1
> machdep.userldt: 1 -> 1
>
> $ wsconsctl keyboard.bell.pitch=50
> keyboard.bell.pitch -> 50


Here is a patch. Tested quite a bit, but not extensively. Comments?

Index: display.c
================================================== =================
RCS file: /cvs/src/sbin/wsconsctl/display.c,v
retrieving revision 1.10
diff -u -p -r1.10 display.c
--- display.c 19 Nov 2004 19:34:40 -0000 1.10
+++ display.c 12 Mar 2006 20:23:56 -0000
@@ -148,7 +148,7 @@ display_get_values(const char *pre, int
}
}

-void
+int
display_put_values(const char *pre, int fd)
{
struct wsdisplay_param param;
@@ -157,7 +157,7 @@ display_put_values(const char *pre, int
const char *cmd_str;
void *ptr;
unsigned long cmd;
- int id;
+ int id, error = 0;

for (pf = display_field_tab; pf->name; pf++) {

@@ -222,10 +222,11 @@ display_put_values(const char *pre, int
if (errno == ENOTTY) {
pf->flags |= FLG_DEAD;
continue;
- } else
+ } else {
warn(cmd_str);
+ error = 1;
+ }
}
-
- pr_field(pre, pf, " -> ");
}
+ return (error);
}
Index: keyboard.c
================================================== =================
RCS file: /cvs/src/sbin/wsconsctl/keyboard.c,v
retrieving revision 1.5
diff -u -p -r1.5 keyboard.c
--- keyboard.c 7 Mar 2003 00:04:21 -0000 1.5
+++ keyboard.c 12 Mar 2006 20:23:56 -0000
@@ -134,9 +134,11 @@ keyboard_get_values(const char *pre, int
warn("WSKBDIO_GETENCODING");
}

-void
+int
keyboard_put_values(const char *pre, int fd)
{
+ int error = 0;
+
bell.which = 0;
if (field_by_value(keyboard_field_tab, &bell.pitch)->flags & FLG_SET)
bell.which |= WSKBD_BELL_DOPITCH;
@@ -144,18 +146,9 @@ keyboard_put_values(const char *pre, int
bell.which |= WSKBD_BELL_DOPERIOD;
if (field_by_value(keyboard_field_tab, &bell.volume)->flags & FLG_SET)
bell.which |= WSKBD_BELL_DOVOLUME;
- if (bell.which != 0 && ioctl(fd, WSKBDIO_SETBELL, &bell) < 0)
+ if (bell.which != 0 && ioctl(fd, WSKBDIO_SETBELL, &bell) < 0) {
warn("WSKBDIO_SETBELL");
- else {
- if (bell.which & WSKBD_BELL_DOPITCH)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &bell.pitch), " -> ");
- if (bell.which & WSKBD_BELL_DOPERIOD)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &bell.period), " -> ");
- if (bell.which & WSKBD_BELL_DOVOLUME)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &bell.volume), " -> ");
+ error = 1;
}

dfbell.which = 0;
@@ -166,23 +159,15 @@ keyboard_put_values(const char *pre, int
if (field_by_value(keyboard_field_tab, &dfbell.volume)->flags & FLG_SET)
dfbell.which |= WSKBD_BELL_DOVOLUME;
if (dfbell.which != 0 &&
- ioctl(fd, WSKBDIO_SETDEFAULTBELL, &dfbell) < 0)
+ ioctl(fd, WSKBDIO_SETDEFAULTBELL, &dfbell) < 0) {
warn("WSKBDIO_SETDEFAULTBELL");
- else {
- if (dfbell.which & WSKBD_BELL_DOPITCH)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &dfbell.pitch), " -> ");
- if (dfbell.which & WSKBD_BELL_DOPERIOD)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &dfbell.period), " -> ");
- if (dfbell.which & WSKBD_BELL_DOVOLUME)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &dfbell.volume), " -> ");
+ error = 1;
}

if (field_by_value(keyboard_field_tab, &kbmap)->flags & FLG_SET) {
if (ioctl(fd, WSKBDIO_SETMAP, &kbmap) < 0)
warn("WSKBDIO_SETMAP");
+ error = 1;
}

repeat.which = 0;
@@ -191,15 +176,9 @@ keyboard_put_values(const char *pre, int
if (field_by_value(keyboard_field_tab, &repeat.delN)->flags & FLG_SET)
repeat.which |= WSKBD_KEYREPEAT_DODELN;
if (repeat.which != 0 &&
- ioctl(fd, WSKBDIO_SETKEYREPEAT, &repeat) < 0)
+ ioctl(fd, WSKBDIO_SETKEYREPEAT, &repeat) < 0) {
warn("WSKBDIO_SETKEYREPEAT");
- else {
- if (repeat.which & WSKBD_KEYREPEAT_DODEL1)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &repeat.del1), " -> ");
- if (repeat.which & WSKBD_KEYREPEAT_DODELN)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &repeat.delN), " -> ");
+ error = 1;
}

dfrepeat.which = 0;
@@ -208,32 +187,23 @@ keyboard_put_values(const char *pre, int
if (field_by_value(keyboard_field_tab, &dfrepeat.delN)->flags & FLG_SET)
dfrepeat.which |= WSKBD_KEYREPEAT_DODELN;
if (dfrepeat.which != 0 &&
- ioctl(fd, WSKBDIO_SETDEFAULTKEYREPEAT, &dfrepeat) < 0)
+ ioctl(fd, WSKBDIO_SETDEFAULTKEYREPEAT, &dfrepeat) < 0) {
warn("WSKBDIO_SETDEFAULTKEYREPEAT");
- else {
- if (dfrepeat.which &WSKBD_KEYREPEAT_DODEL1)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &dfrepeat.del1), " -> ");
- if (dfrepeat.which & WSKBD_KEYREPEAT_DODELN)
- pr_field(pre, field_by_value(keyboard_field_tab,
- &dfrepeat.delN), " -> ");
+ error = 1;
}

if (field_by_value(keyboard_field_tab, &ledstate)->flags & FLG_SET) {
- if (ioctl(fd, WSKBDIO_SETLEDS, &ledstate) < 0)
+ if (ioctl(fd, WSKBDIO_SETLEDS, &ledstate) < 0) {
warn("WSKBDIO_SETLEDS");
- else {
- pr_field(pre, field_by_value(keyboard_field_tab,
- &ledstate), " -> ");
+ error = 1;
}
}

if (field_by_value(keyboard_field_tab, &kbdencoding)->flags & FLG_SET) {
- if (ioctl(fd, WSKBDIO_SETENCODING, &kbdencoding) < 0)
+ if (ioctl(fd, WSKBDIO_SETENCODING, &kbdencoding) < 0) {
warn("WSKBDIO_SETENCODING");
- else {
- pr_field(pre, field_by_value(keyboard_field_tab,
- &kbdencoding), " -> ");
+ error = 1;
}
}
+ return (error);
}
Index: mouse.c
================================================== =================
RCS file: /cvs/src/sbin/wsconsctl/mouse.c,v
retrieving revision 1.5
diff -u -p -r1.5 mouse.c
--- mouse.c 11 Dec 2002 18:27:19 -0000 1.5
+++ mouse.c 12 Mar 2006 20:23:57 -0000
@@ -62,23 +62,22 @@ mouse_get_values(const char *pre, int fd
warn("WSMOUSEIO_GTYPE");
}

-void
+int
mouse_put_values(const char *pre, int fd)
{
+ int error = 0;
+
if (field_by_value(mouse_field_tab, &resolution)->flags & FLG_SET) {
- if (ioctl(fd, WSMOUSEIO_SRES, &resolution) < 0)
+ if (ioctl(fd, WSMOUSEIO_SRES, &resolution) < 0) {
warn("WSMOUSEIO_SRES");
- else {
- pr_field(pre, field_by_value(mouse_field_tab,
- &resolution), " -> ");
+ error = 1;
}
}
if (field_by_value(mouse_field_tab, &samplerate)->flags & FLG_SET) {
- if (ioctl(fd, WSMOUSEIO_SRATE, &samplerate) < 0)
+ if (ioctl(fd, WSMOUSEIO_SRATE, &samplerate) < 0) {
warn("WSMOUSEIO_SRATE");
- else {
- pr_field(pre, field_by_value(mouse_field_tab,
- &samplerate), " -> ");
+ error = 1;
}
}
+ return (error);
}
Index: util.c
================================================== =================
RCS file: /cvs/src/sbin/wsconsctl/util.c,v
retrieving revision 1.32
diff -u -p -r1.32 util.c
--- util.c 14 Feb 2006 18:52:15 -0000 1.32
+++ util.c 12 Mar 2006 20:23:57 -0000
@@ -43,6 +43,7 @@
#include <err.h>
#include <string.h>
#include <stdio.h>
+#include <stdlib.h>
#include <unistd.h>
#include "wsconsctl.h"

@@ -210,16 +211,13 @@ name2int(char *val, const struct nameint
}

void
-pr_field(const char *pre, struct field *f, const char *sep)
+pr_fieldval(struct field *f)
{
struct field_pc *pc;
u_int flags;
int i, n;
char *p;

- if (sep)
- printf("%s.%s%s", pre, f->name, sep);
-
switch (f->format) {
case FMT_UINT:
printf("%u", *((u_int *) f->valp));
@@ -269,11 +267,61 @@ pr_field(const char *pre, struct field *
print_kmap((struct wskbd_map_data *) f->valp);
break;
default:
- errx(1, "internal error: pr_field: no format %d", f->format);
+ errx(1, "internal error: pr_fieldval: no format %d", f->format);
break;
}
+}

+void
+pr_field(const char *pre, struct field *fold, const char *sep, struct field *fcur)
+{
+ if (sep)
+ printf("%s.%s", pre, fcur->name);
+ if (fold) {
+ printf(": ");
+ pr_fieldval(fold);
+ }
+ printf("%s", sep);
+ pr_fieldval(fcur);
printf("\n");
+}
+
+struct field *
+dupfield(struct field *f)
+{
+ struct field *p;
+ size_t siz;
+
+ if ((p = malloc(sizeof(*f))) == NULL)
+ err(1, NULL);
+ memcpy(p, f, sizeof(*p));
+
+ if ((p->name = strdup(f->name)) == NULL)
+ err(1, "strdup");
+
+ switch (f->format) {
+ case FMT_UINT:
+ case FMT_BOOL:
+ case FMT_KBDENC:
+ siz = sizeof(u_int);
+ break;
+ case FMT_INT:
+ siz = sizeof(int);
+ break;
+ case FMT_PC:
+ siz = sizeof(struct field_pc);
+ break;
+ case FMT_KBMAP:
+ break;
+ default:
+ errx(1, "internal error: dupfield: no format %d", f->format);
+ break;
+ }
+
+ if ((p->valp = malloc(siz)) == NULL)
+ err(1, NULL);
+ memcpy(p->valp, f->valp, siz);
+ return (p);
}

void
Index: wsconsctl.c
================================================== =================
RCS file: /cvs/src/sbin/wsconsctl/wsconsctl.c,v
retrieving revision 1.16
diff -u -p -r1.16 wsconsctl.c
--- wsconsctl.c 9 Aug 2004 18:39:22 -0000 1.16
+++ wsconsctl.c 12 Mar 2006 20:23:57 -0000
@@ -62,7 +62,7 @@ struct vartypesw {
int fd;
struct field *field_tab;
void (*getval)(const char *pre, int);
- void (*putval)(const char *pre, int);
+ int (*putval)(const char *pre, int);
} typesw[] = {
{ "keyboard", PATH_KEYBOARD, -1, keyboard_field_tab,
keyboard_get_values, keyboard_put_values },
@@ -97,7 +97,7 @@ main(int argc, char *argv[])
int i, ch, error = 0, aflag = 0, do_merge;
struct vartypesw *sw = NULL;
char *sep = "=", *p;
- struct field *f;
+ struct field *f, *fold;

while ((ch = getopt(argc, argv, "anw")) != -1) {
switch(ch) {
@@ -141,41 +141,20 @@ main(int argc, char *argv[])
warnx("Use explicit arg to view %s.%s.",
sw->name, f->name);
else if (f->flags & FLG_GET)
- pr_field(sw->name, f, sep);
+ pr_field(sw->name, NULL, sep, f);
}
} else if (argc > 0) {
for (i = 0; i < argc; i++) {
- p = strchr(argv[i], '=');
- if (p == NULL) {
- sw = tab_by_name(argv[i]);
- if (!sw)
- continue;
- if (sw->fd < 0 &&
- (sw->fd = open(sw->file, O_WRONLY)) < 0 &&
- (sw->fd = open(sw->file, O_RDONLY)) < 0) {
- warn("open: %s", sw->file);
- error = 1;
- continue;
- }
- f = field_by_name(sw->field_tab, argv[i]);
- if (f->flags & FLG_DEAD)
- continue;
- if ((f->flags & FLG_WRONLY) != 0) {
- warnx("%s: write only", argv[i]);
- continue;
- }
- f->flags |= FLG_GET;
- (*sw->getval)(sw->name, sw->fd);
- pr_field(sw->name, f, sep);
- continue;
+ if ((p = strchr(argv[i], '=')) != NULL) {
+ if (p > argv[i] &&
+ (*(p - 1) == '+' || *(p - 1) == '-')) {
+ do_merge = *(p - 1);
+ *(p - 1) = '\0';
+ } else
+ do_merge = 0;
+ *p++ = '\0';
}
- if (p > argv[i] &&
- (*(p - 1) == '+' || *(p - 1) == '-')) {
- do_merge = *(p - 1);
- *(p - 1) = '\0';
- } else
- do_merge = 0;
- *p++ = '\0';
+
sw = tab_by_name(argv[i]);
if (!sw)
continue;
@@ -189,10 +168,29 @@ main(int argc, char *argv[])
f = field_by_name(sw->field_tab, argv[i]);
if (f->flags & FLG_DEAD)
continue;
- if ((f->flags & FLG_RDONLY) != 0) {
- warnx("%s: read only", argv[i]);
+ if (p == NULL) {
+ /* No `=' found, try to read. */
+ if ((f->flags & FLG_WRONLY) != 0) {
+ warnx("%s: write only", argv[i]);
+ continue;
+ }
+ } else {
+ /* Trying to write it. */
+ if ((f->flags & FLG_RDONLY) != 0) {
+ warnx("%s: read only", argv[i]);
+ continue;
+ }
+ }
+ f->flags |= FLG_GET;
+ (*sw->getval)(sw->name, sw->fd);
+ f->flags &= ~FLG_GET;
+
+ if (p == NULL) {
+ /* Not setting, just print and move on. */
+ pr_field(sw->name, NULL, sep, f);
continue;
}
+ fold = dupfield(f);
if (do_merge || f->flags & FLG_INIT) {
if ((f->flags & FLG_MODIFY) == 0)
errx(1, "%s: can only be set",
@@ -203,8 +201,15 @@ main(int argc, char *argv[])
}
rd_field(f, p, do_merge);
f->flags |= FLG_SET;
- (*sw->putval)(sw->name, sw->fd);
+ if ((*sw->putval)(sw->name, sw->fd))
+ continue;
f->flags &= ~FLG_SET;
+
+ f->flags |= FLG_GET;
+ (*sw->getval)(sw->name, sw->fd);
+ f->flags &= ~FLG_GET;
+
+ pr_field(sw->name, fold, " -> ", f);
}
} else
usage(NULL);
Index: wsconsctl.h
================================================== =================
RCS file: /cvs/src/sbin/wsconsctl/wsconsctl.h,v
retrieving revision 1.6
diff -u -p -r1.6 wsconsctl.h
--- wsconsctl.h 17 Dec 2002 07:10:25 -0000 1.6
+++ wsconsctl.h 12 Mar 2006 20:23:57 -0000
@@ -67,19 +67,20 @@ struct field_pc {
int max, min, cur;
};

+struct field *dupfield(struct field *);
struct field *field_by_name(struct field *, char *);
struct field *field_by_value(struct field *, void *);
-void pr_field(const char *, struct field *, const char *);
+void pr_field(const char *, struct field *, const char *, struct field *);
void rd_field(struct field *, char *, int);
int name2ksym(char *);
char *ksym2name(int);
keysym_t ksym_upcase(keysym_t);
void keyboard_get_values(const char *,int);
-void keyboard_put_values(const char *,int);
+int keyboard_put_values(const char *,int);
void mouse_get_values(const char *,int);
-void mouse_put_values(const char *,int);
+int mouse_put_values(const char *,int);
void display_get_values(const char *,int);
-void display_put_values(const char *,int);
+int display_put_values(const char *,int);
int yyparse(void);
void yyerror(char *);
int yylex(void);

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT. The time now is 05:13 PM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0
www.UnixAdminTalk.com