tName setting and printing the ID are now exposed via the fs - ratox - FIFO based tox client
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit cd7ff86b2a9af3a16245c3e0b3de56675e137adc
 (DIR) parent f28a584136131956beb50f4b7e6fc9fe69d4972d
 (HTM) Author: sin <sin@2f30.org>
       Date:   Tue, 16 Sep 2014 15:30:59 +0100
       
       Name setting and printing the ID are now exposed via the fs
       
       We will gradually expose the other commands as well.
       
       Diffstat:
         M ratatox.c                           |     184 ++++++++++++++++++++-----------
       
       1 file changed, 121 insertions(+), 63 deletions(-)
       ---
 (DIR) diff --git a/ratatox.c b/ratatox.c
       t@@ -31,19 +31,34 @@ struct node {
        
        #include "config.h"
        
       +struct fifo {
       +        const char *name;
       +        int flags;
       +        mode_t mode;
       +};
       +
       +enum {
       +        NAME_FIFO,
       +        NR_GFIFOS
       +};
       +
       +/* Global FIFOs for modifying our own state, they go in $(PWD)/{name,status}_in */
       +static struct fifo gfifos[] = {
       +        { .name = "name_in",    .flags = O_RDONLY | O_NONBLOCK, .mode = 0644 },
       +};
       +
       +static int globalfd[NR_GFIFOS];
       +
        enum {
                TEXT_IN_FIFO,
                FILE_IN_FIFO,
       -        NR_FIFOS
       +        NR_FFIFOS
        };
        
       -static struct fifo {
       -        const char *name;
       -        int flags;
       -        mode_t mode;
       -} fifos[] = {
       +/* Friend related FIFOs, they go in <friend-id/{text,file}_in */
       +static struct fifo ffifos[] = {
                { .name = "text_in", .flags = O_RDONLY | O_NONBLOCK, .mode = 0644 },
       -        { .name = "file_in", .flags = O_RDONLY | O_NONBLOCK, .mode = 0644 }
       +        { .name = "file_in", .flags = O_RDONLY | O_NONBLOCK, .mode = 0644 },
        };
        
        enum {
       t@@ -69,7 +84,7 @@ struct friend {
                uint8_t id[TOX_CLIENT_ID_SIZE];
                /* null terminated id */
                char idstr[2 * TOX_CLIENT_ID_SIZE + 1];
       -        int fd[NR_FIFOS];
       +        int fd[NR_FFIFOS];
                struct transfer t;
                TAILQ_ENTRY(friend) entry;
        };
       t@@ -102,6 +117,7 @@ static void send_friend_file(struct friend *);
        static void send_friend_text(struct friend *);
        static void dataload(void);
        static void datasave(void);
       +static int localinit(void);
        static int toxinit(void);
        static int toxconnect(void);
        static void id2str(uint8_t *, char *);
       t@@ -111,8 +127,6 @@ static void friendload(void);
        static int cmdrun(void);
        static int cmdaccept(char *, size_t);
        static int cmdfriend(char *, size_t);
       -static int cmdid(char *, size_t);
       -static int cmdname(char *, size_t);
        static int cmdhelp(char *, size_t);
        static void writeparam(struct friend *, const char *, const char *, const char *, ...);
        static void loop(void);
       t@@ -522,11 +536,60 @@ datasave(void)
        }
        
        static int
       -toxinit(void)
       +localinit(void)
        {
       +        uint8_t name[TOX_MAX_NAME_LENGTH + 1];
                uint8_t address[TOX_FRIEND_ADDRESS_SIZE];
       -        int i;
       +        FILE *fp;
       +        int r;
       +        size_t i;
       +
       +        for (i = 0; i < LEN(gfifos); i++) {
       +                r = mkfifo(gfifos[i].name, gfifos[i].mode);
       +                if (r < 0 && errno != EEXIST) {
       +                        perror("mkfifo");
       +                        exit(EXIT_FAILURE);
       +                }
       +                r = open(gfifos[i].name, gfifos[i].flags, 0);
       +                if (r < 0) {
       +                        perror("open");
       +                        exit(EXIT_FAILURE);
       +                }
       +                globalfd[i] = r;
       +        }
       +
       +        /* Dump current name */
       +        r = tox_get_self_name(tox, name);
       +        if (r > TOX_MAX_NAME_LENGTH)
       +                r = TOX_MAX_NAME_LENGTH;
       +        name[r] = '\0';
       +        fp = fopen("name_out", "w");
       +        if (!fp) {
       +                perror("fopen");
       +                exit(EXIT_FAILURE);
       +        }
       +        fputs(name, fp);
       +        fputc('\n', fp);
       +        fclose(fp);
       +
       +        /* Dump ID */
       +        fp = fopen("id", "w");
       +        if (!fp) {
       +                perror("fopen");
       +                exit(EXIT_FAILURE);
       +        }
       +        tox_get_address(tox, address);
       +        for (i = 0; i < TOX_FRIEND_ADDRESS_SIZE; i++)
       +                fprintf(fp, "%02x", address[i]);
       +        fputc('\n', fp);
       +        fclose(fp);
       +
       +        return 0;
       +}
        
       +static int
       +toxinit(void)
       +{
                /* IPv4 only */
                tox = tox_new(0);
                dataload();
       t@@ -538,13 +601,6 @@ toxinit(void)
                tox_callback_status_message(tox, cb_status_message, NULL);
                tox_callback_user_status(tox, cb_user_status, NULL);
                tox_callback_file_control(tox, cb_file_control, NULL);
       -
       -        tox_get_address(tox, address);
       -        printf("ID: ");
       -        for (i = 0; i < TOX_FRIEND_ADDRESS_SIZE; i++)
       -                printf("%02x", address[i]);
       -        printf("\n");
       -
                return 0;
        }
        
       t@@ -616,15 +672,15 @@ friendcreate(int32_t fid)
                        exit(EXIT_FAILURE);
                }
        
       -        for (i = 0; i < LEN(fifos); i++) {
       +        for (i = 0; i < LEN(ffifos); i++) {
                        snprintf(path, sizeof(path), "%s/%s", f->idstr,
       -                         fifos[i].name);
       -                r = mkfifo(path, fifos[i].mode);
       +                         ffifos[i].name);
       +                r = mkfifo(path, ffifos[i].mode);
                        if (r < 0 && errno != EEXIST) {
                                perror("mkfifo");
                                exit(EXIT_FAILURE);
                        }
       -                r = open(path, fifos[i].flags, 0);
       +                r = open(path, ffifos[i].flags, 0);
                        if (r < 0) {
                                perror("open");
                                exit(EXIT_FAILURE);
       t@@ -676,8 +732,6 @@ struct cmd {
        } cmds[] = {
                { .cmd = "a", .cb = cmdaccept, .usage = "usage: a [id]\tAccept or list pending requests\n" },
                { .cmd = "f", .cb = cmdfriend, .usage = "usage: f id\tSend friend request to ID\n" },
       -        { .cmd = "i", .cb = cmdid,     .usage = "usage: i\tShow ID\n" },
       -        { .cmd = "n", .cb = cmdname,   .usage = "usage: n [name]\tChange or show current name\n" },
                { .cmd = "h", .cb = cmdhelp,   .usage = NULL },
        };
        
       t@@ -758,41 +812,6 @@ cmdfriend(char *cmd, size_t sz)
        }
        
        static int
       -cmdid(char *cmd, size_t sz)
       -{
       -        uint8_t address[TOX_FRIEND_ADDRESS_SIZE];
       -        int i;
       -
       -        tox_get_address(tox, address);
       -        for (i = 0; i < TOX_FRIEND_ADDRESS_SIZE; i++)
       -                printf("%02x", address[i]);
       -        printf("\n");
       -        return 0;
       -}
       -
       -static int
       -cmdname(char *cmd, size_t sz)
       -{
       -        char *args[2];
       -        uint8_t name[TOX_MAX_NAME_LENGTH + 1];
       -        uint16_t len;
       -        int r;
       -
       -        r = tokenize(cmd, args, 2);
       -
       -        if (r == 1) {
       -                len = tox_get_self_name(tox, name);
       -                name[len] = '\0';
       -                printf("%s\n", name);
       -        } else {
       -                tox_set_name(tox, (uint8_t *)args[1], strlen(args[1]));
       -                datasave();
       -        }
       -
       -        return 0;
       -}
       -
       -static int
        cmdhelp(char *cmd, size_t sz)
        {
                size_t i;
       t@@ -858,10 +877,11 @@ writeparam(struct friend *f, const char *file, const char *mode,
        static void
        loop(void)
        {
       +        FILE *fp;
                struct friend *f;
                time_t t0, t1;
                int connected = 0;
       -        int i, n;
       +        int i, n, r;
                int fdmax;
                fd_set rfds;
                struct timeval tv;
       t@@ -890,10 +910,16 @@ loop(void)
                        FD_SET(STDIN_FILENO, &rfds);
                        fdmax = STDIN_FILENO;
        
       +                for (i = 0; i < NR_GFIFOS; i++) {
       +                        FD_SET(globalfd[i], &rfds);
       +                        if (globalfd[i] > fdmax)
       +                                fdmax = globalfd[i];
       +                }
       +
                        TAILQ_FOREACH(f, &friendhead, entry) {
                                /* Only monitor friends that are online */
                                if (tox_get_friend_connection_status(tox, f->fid) == 1) {
       -                                for (i = 0; i < NR_FIFOS; i++) {
       +                                for (i = 0; i < NR_FFIFOS; i++) {
                                                FD_SET(f->fd[i], &rfds);
                                                if (f->fd[i] > fdmax)
                                                        fdmax = f->fd[i];
       t@@ -957,8 +983,39 @@ loop(void)
                        if (FD_ISSET(STDIN_FILENO, &rfds) != 0)
                                cmdrun();
        
       +                for (i = 0; i < NR_GFIFOS; i++) {
       +                        if (FD_ISSET(globalfd[i], &rfds) == 0)
       +                                continue;
       +                        if (strcmp(gfifos[i].name, "name_in") == 0) {
       +                                uint8_t name[TOX_MAX_NAME_LENGTH + 1];
       +again:
       +                                r = read(globalfd[i], name, TOX_MAX_NAME_LENGTH);
       +                                if (r < 0) {
       +                                        if (errno == EINTR)
       +                                                goto again;
       +                                        if (errno == EWOULDBLOCK)
       +                                                continue;
       +                                        perror("read");
       +                                        continue;
       +                                }
       +                                if (name[r - 1] == '\n')
       +                                        r--;
       +                                name[r] = '\0';
       +                                tox_set_name(tox, name, r);
       +                                printout("Changed name to %s\n", name);
       +                                fp = fopen("name_out", "w");
       +                                if (!fp) {
       +                                        perror("fopen");
       +                                        exit(EXIT_FAILURE);
       +                                }
       +                                fputs(name, fp);
       +                                fputc('\n', fp);
       +                                fclose(fp);
       +                        }
       +                }
       +
                        TAILQ_FOREACH(f, &friendhead, entry) {
       -                        for (i = 0; i < NR_FIFOS; i++) {
       +                        for (i = 0; i < NR_FFIFOS; i++) {
                                        if (FD_ISSET(f->fd[i], &rfds) == 0)
                                                continue;
                                        switch (i) {
       t@@ -999,6 +1056,7 @@ main(int argc, char *argv[])
                printrat();
                printf("Type h for help\n");
                toxinit();
       +        localinit();
                friendload();
                loop();
                return EXIT_SUCCESS;