shithub: toe

ref: 15a7a70d93c42b675dda5057b6088fd3c920dfbd
dir: toe/toe.c

View raw version
#include <u.h>
#include <libc.h>
#include <bio.h>

typedef struct Query
{
    char *domain;
    char *user;
} Query;


void
toe(Query *query)
{
    char *naddr;
    char *line;
    int fd;
    Biobuf out, body;

    naddr = netmkaddr(query->domain, "tcp", "79");
    fd = dial(naddr, 0, 0, 0);
    if(fd < 0){
        print("unable to connect to %s: %r", query->domain);
        return;
    }

    if (query->user == nil) {
        fprint(fd, "\r\n");
    } else {
        fprint(fd, "%s\r\n", query->user);
    }

    Binit(&body, fd, OREAD);
    Binit(&out, 1, OWRITE);

    while((line = Brdstr(&body, '\n', 0)) != nil){
        Bprint(&out, "%s", line);
        free(line);
    }

    Bflush(&out);
    Bflush(&body);
    close(fd);
    free(query);
}

Query *
mk_query(char *query_str)
{
    char *user, *domain;
    Query *new_query = malloc(sizeof(Query));

    if (query_str[0] == '@') {
        user = nil;
        domain = query_str + 1;
    } else if (strstr(query_str, "@") == nil) {
        user = query_str;
        domain = "localhost";
    } else {
        user = strtok(query_str, "@");
        domain = strtok(nil, "@");
    }

    new_query->user = user;
    new_query->domain = domain;

    return new_query;
}

void
main(int argc, char **argv)
{
    if( argc == 2 ) {
        Query *query = mk_query(argv[1]);
        toe(query);
        exits(0);
    } else if( argc > 2 ) {
        print("Too many arguments supplied.\n");
    } else {
        print("Usage: toe [user]@server.\n");
    }
}