shithub: toe

ref: 7bc4d4f57bc35956c69039e92ebef1737f973e95
dir: /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");
  }
}