From e012b7c5f7c9e347af196e22396fcdef4be26049 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Tue, 27 Mar 2007 17:39:00 -0400 Subject: [PATCH] Fix ARGBEGIN bug. Refactor wmiir.c. Create lib and include directories before installing. --- cmd/wmiir.c | 46 ++++++++++++++++++++++++++-------------------- include/util.h | 2 +- mk/common.mk | 2 +- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/cmd/wmiir.c b/cmd/wmiir.c index 8293290b..fffc31ce 100644 --- a/cmd/wmiir.c +++ b/cmd/wmiir.c @@ -27,13 +27,12 @@ write_data(IxpCFid *fid, char *name) { uint len; buf = ixp_emalloc(fid->iounit);; - while((len = read(0, buf, fid->iounit)) > 0) - if(ixp_write(fid, buf, len) != len) - fatal("cannot write file '%s': %s\n", name, errstr); - /* do an explicit empty write when no writing has been done yet */ - if(fid->offset == 0) - if(ixp_write(fid, buf, 0) != 0) + do { + len = read(0, buf, fid->iounit); + if(len >= 0 && ixp_write(fid, buf, len) != len) fatal("cannot write file '%s': %s\n", name, errstr); + } while(len > 0); + free(buf); } @@ -277,10 +276,25 @@ xls(int argc, char *argv[]) { return 0; } +typedef struct exectab exectab; +struct exectab { + char *cmd; + int (*fn)(int, char**); +} etab[] = { + {"write", xwrite}, + {"xwrite", xawrite}, + {"read", xread}, + {"create", xcreate}, + {"remove", xremove}, + {"ls", xls}, + {0, 0} +}; + int main(int argc, char *argv[]) { - int ret; char *cmd, *address; + exectab *tab; + int ret; address = getenv("WMII_ADDRESS"); @@ -304,21 +318,13 @@ main(int argc, char *argv[]) { if(client == nil) fatal("%s\n", errstr); - if(!strcmp(cmd, "create")) - ret = xcreate(argc, argv); - else if(!strcmp(cmd, "ls")) - ret = xls(argc, argv); - else if(!strcmp(cmd, "read")) - ret = xread(argc, argv); - else if(!strcmp(cmd, "remove")) - ret = xremove(argc, argv); - else if(!strcmp(cmd, "write")) - ret = xwrite(argc, argv); - else if(!strcmp(cmd, "xwrite")) - ret = xawrite(argc, argv); - else + for(tab = etab; tab->cmd; tab++) + if(strcmp(cmd, tab->cmd) == 0) break; + if(tab->cmd == 0) usage(); + ret = tab->fn(argc, argv); + ixp_unmount(client); return ret; } diff --git a/include/util.h b/include/util.h index 1d8072b4..d2d6c951 100644 --- a/include/util.h +++ b/include/util.h @@ -42,7 +42,7 @@ char *argv0; #define ARGBEGIN int _argi, _argtmp, _inargv=0; char *_argv; \ if(!argv0)argv0=ARGF(); _inargv=1; \ while(argc && argv[0][0] == '-') { \ - _argi=1; _argv=*argv++; argc++; \ + _argi=1; _argv=*argv++; argc--; \ while(_argv[_argi]) switch(_argv[_argi++]) #define ARGEND }_inargv=0;USED(_argtmp);USED(_argv);USED(_argi) #define ARGF() ((_inargv && _argv[_argi]) ? \ diff --git a/mk/common.mk b/mk/common.mk index 7f0325df..55f6776f 100644 --- a/mk/common.mk +++ b/mk/common.mk @@ -5,7 +5,7 @@ depend: cleandep MANDIRS=${MAN}/man1 mkdirs: - for i in ${BIN} ${ETC} ${MANDIRS} ${DIRS}; do \ + for i in ${BIN} ${ETC} ${LIBDIR} ${MANDIRS} ${INCLUDE} ${DIRS}; do \ test -d $$i || echo MKDIR $$i; \ mkdir -pm 0755 $$i; \ done