wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit c31ed881a0b788d7a74e30260607f4194f98104a
parent 299ee8005beae94e08b82dbd38a3cf3f53adfe23
Author: garbeam <garbeam@localhost>
Date:   Thu,  5 Jan 2006 17:54:14 +0200

sanitized wmiir2 as follows:
 - create/write reads from stdin arbitrary data which is written to a file
 - all other commands are command line args
 - cleaned up several crap, sanitized libixp2/client.c as well (interface)


Diffstat:
cmd/wmiibar2.c | 3++-
cmd/wmiir2.c | 196++++++++++++++++++++++++++++++++++---------------------------------------------
libixp2/client.c | 7+++++--
3 files changed, 92 insertions(+), 114 deletions(-)

diff --git a/cmd/wmiibar2.c b/cmd/wmiibar2.c @@ -225,7 +225,7 @@ attach(IXPServer * s, IXPConn * c) if(!maps) c->aux = new; else { - for(m = maps; m && m->next; m = m->next); + for(m = maps; m && m->next; m = m->next); m->next = new; } fprintf(stderr, "attaching %u %u %s %s\n", s->fcall.fid, s->fcall.afid, @@ -417,6 +417,7 @@ freeconn(IXPServer * s, IXPConn * c) free(m); } c->aux = nil; + printf("freecon\n"); } static IXPTFunc funcs[] = { diff --git a/cmd/wmiir2.c b/cmd/wmiir2.c @@ -6,28 +6,12 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include "../libixp2/ixp.h" #include <cext.h> -typedef struct { - char *name; - int (*cmd) (char **argv); - int min_argc; -} Command; - -static int xcreate(char **argv); -static int xread(char **argv); -static int xwrite(char **argv); -static int xremove(char **argv); -static Command cmds[] = { - {"create", xcreate, 2}, - {"read", xread, 1}, - {"write", xwrite, 2}, - {"remove", xremove, 1}, - {0, 0} -}; static IXPClient c = { 0 }; static char *version[] = { @@ -39,76 +23,74 @@ static void usage() { fprintf(stderr, "%s", - "usage: wmiir [-a <server address>] [-v]\n" + "usage: wmiir [-a <server address>] [-v] <command>\n" " -a server address (default: $WMIIR_SOCKET)\n" " -v version info\n" - "commands read from stdin:\n" - " create <file> <content> -- creates file\n" - " read <file/directory> -- reads file/directory contents\n" - " write <file> <content> -- writes content to a file\n" - " remove <file/directory> -- removes file\n"); + "valid commands:\n" + " create <file> -- creates file and writes data from stdin to file\n" + " read <file/dir> -- prints file/directory contents\n" + " write <file> -- writes data from stdin to file\n" + " remove <file> -- removes file\n"); exit(1); } -static int -write_data(unsigned int fid, unsigned char *data, unsigned int count) +static void +write_data(unsigned int fid) { - unsigned int len, i, runs = count / c.fcall.iounit; + void *data = cext_emallocz(c.fcall.iounit); + unsigned long long offset = 0; + size_t len = 0; - for(i = 0; i <= runs; i++) { - /* write */ - len = count - (i * c.fcall.iounit); - if(len > c.fcall.iounit) - len = c.fcall.iounit; + while((len = read(0, data, c.fcall.iounit)) > 0) { if(ixp_client_write - (&c, fid, i * c.fcall.iounit, len, - &data[i * c.fcall.iounit]) != count) { + (&c, fid, offset, len, data) != len) { fprintf(stderr, "wmiir: cannot write file: %s\n", c.errstr); - return -1; + break; } + offset += len; } - return count; + free(data); } static int -xcreate(char **argv) +xcreate(char *file) { unsigned int fid; - char *p = strrchr(argv[0], '/'); + char *p = strrchr(file, '/'); fid = c.root_fid << 2; /* walk to bottom-most directory */ *p = 0; - if(ixp_client_walk(&c, fid, argv[0]) == -1) { - fprintf(stderr, "wmiir: cannot walk to %s: %s\n", argv[0], - c.errstr); + if(ixp_client_walk(&c, fid, file) == -1) { + fprintf(stderr, "wmiir: cannot walk to '%s': %s\n", file, c.errstr); return -1; } /* create */ p++; if(ixp_client_create(&c, fid, p, (unsigned int) 0xff, IXP_OWRITE) == -1) { - fprintf(stderr, "wmiir: cannot create file: %s\n", c.errstr); + fprintf(stderr, "wmiir: cannot create file '%s': %s\n", file, c.errstr); return -1; } - write_data(fid, (unsigned char *) argv[1], strlen(argv[1])); + write_data(fid); return ixp_client_close(&c, fid); } static int -xwrite(char **argv) +xwrite(char *file) { + /* open */ unsigned int fid = c.root_fid << 2; - if(ixp_client_open(&c, fid, argv[0], IXP_OWRITE) == -1) { - fprintf(stderr, "wmiir: cannot open file: %s\n", c.errstr); + if(ixp_client_open(&c, fid, file, IXP_OWRITE) == -1) { + fprintf(stderr, "wmiir: cannot open file '%s': %s\n", file, c.errstr); return -1; } - write_data(fid, (unsigned char *) argv[1], strlen(argv[1])); + write_data(fid); return ixp_client_close(&c, fid); } static void -print_directory(void *result, unsigned int msize) +print_dir(void *result, unsigned int msize) { void *p = result; static Stat stat, zerostat = { 0 }; @@ -126,92 +108,82 @@ print_directory(void *result, unsigned int msize) } static int -xread(char **argv) +xread(char *file) { unsigned int fid = c.root_fid << 2; int count, is_directory = 0; static unsigned char result[IXP_MAX_MSG]; + unsigned long long offset = 0; /* open */ - if(ixp_client_open(&c, fid, argv[0], IXP_OREAD) == -1) { - fprintf(stderr, "wmiir: cannot open file '%s': %s\n", argv[0], c.errstr); + if(ixp_client_open(&c, fid, file, IXP_OREAD) == -1) { + fprintf(stderr, "wmiir: cannot open file '%s': %s\n", file, c.errstr); return -1; } is_directory = !c.fcall.nwqid || (c.fcall.qid.type == IXP_QTDIR); + /* read */ - count = ixp_client_read(&c, fid, 0, result, IXP_MAX_MSG); + while((count = ixp_client_read(&c, fid, offset, result, IXP_MAX_MSG)) > 0) { + if(is_directory) + print_dir(result, count); + else { + unsigned int i; + for(i = 0; i < count; i++) + putchar(result[i]); + } + offset += count; + } if(count == -1) { - fprintf(stderr, "wmiir: cannot read file: %s\n", c.errstr); + fprintf(stderr, "wmiir: cannot read file/directory '%s': %s\n", file, c.errstr); return -1; } - if(is_directory) - print_directory(result, count); - else { - unsigned int i; - for(i = 0; i < count; i++) - putchar(result[i]); - } return ixp_client_close(&c, fid); } static int -xremove(char **argv) +xremove(char *file) { unsigned int fid; /* remove */ fid = c.root_fid << 2; - if(ixp_client_remove(&c, fid, argv[0]) == -1) { - fprintf(stderr, "wmiir: cannot remove file: %s\n", c.errstr); + if(ixp_client_remove(&c, fid, file) == -1) { + fprintf(stderr, "wmiir: cannot remove file '%s': %s\n", file, c.errstr); return -1; } return 0; } -static int -perform_cmd(int argc, char **argv) -{ - int i; - for(i = 0; cmds[i].name; i++) - if(!strncmp(cmds[i].name, argv[0], strlen(cmds[i].name))) { - if(cmds[i].min_argc <= argc) - return cmds[i].cmd(&argv[1]); - else - usage(); - } - /* bogus command */ - return -1; -} - int main(int argc, char *argv[]) { - int i = 0, ret; - char line[4096]; - char *sockfile = getenv("WMIIR_SOCKET"); - char *stdin_argv[3]; - int stdin_argc; + int i = 0; + char *cmd, *file, *sockfile = getenv("WMIIR_SOCKET"); /* command line args */ - if(argc > 1) { - for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) { - switch (argv[i][1]) { - case 'v': - fprintf(stderr, "%s", version[0]); - exit(0); - break; - case 'a': - if(i + 1 < argc) - sockfile = argv[++i]; - else - usage(); - break; - default: - usage(); - break; - } - } - } + if(argc < 2) + usage(); + + for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) { + switch (argv[i][1]) { + case 'v': + fprintf(stderr, "%s", version[0]); + exit(0); + break; + case 'a': + if(i + 1 < argc) + sockfile = argv[++i]; + else + usage(); + break; + default: + usage(); + break; + } + } + cmd = argv[argc - 2]; + file = argv[argc - 1]; + if(!sockfile) { fprintf(stderr, "%s", "wmiir: error: WMIIR_SOCKET environment not set\n"); usage(); @@ -221,18 +193,20 @@ main(int argc, char *argv[]) fprintf(stderr, "wmiir: %s\n", c.errstr); exit(1); } - /* wether perform directly or read from stdin */ - while(fgets(line, 4096, stdin)) { - if (line[strlen(line) - 1] == '\n') - line[strlen(line) - 1] = 0; - if((stdin_argc = cext_tokenize(stdin_argv, 3, line, ' '))) { - if((ret = perform_cmd(stdin_argc, stdin_argv))) - break; - } - } + + if(!strncmp(cmd, "create", 7)) + xcreate(file); + else if(!strncmp(cmd, "write", 6)) + xwrite(file); + else if(!strncmp(cmd, "read", 5)) + xread(file); + else if(!strncmp(cmd, "remove", 7)) + xremove(file); + else + usage(); /* close socket */ ixp_client_deinit(&c); - return ret; + return 0; } diff --git a/libixp2/client.c b/libixp2/client.c @@ -102,6 +102,8 @@ ixp_client_create(IXPClient * c, unsigned int dirfid, char *name, int ixp_client_walk(IXPClient * c, unsigned int newfid, char *filepath) { + unsigned int i; + char *wname[IXP_MAX_WELEM]; /* walk */ c->fcall.id = TWALK; c->fcall.fid = c->root_fid; @@ -109,8 +111,9 @@ ixp_client_walk(IXPClient * c, unsigned int newfid, char *filepath) if(filepath) { cext_strlcpy(c->fcall.name, filepath, sizeof(c->fcall.name)); c->fcall.nwname = - cext_tokenize((char **) c->fcall.wname, IXP_MAX_WELEM, - c->fcall.name, '/'); + cext_tokenize(wname, IXP_MAX_WELEM, c->fcall.name, '/'); + for(i = 0; i < c->fcall.nwname; i++) + cext_strlcpy(c->fcall.wname[i], wname[i], sizeof(c->fcall.wname[i])); } return do_fcall(c); }