ref: a4d0372d0f1916d1d9df34c4fe4ae7a98c8de020
dir: /mez.c/
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <auth.h>
#include <mp.h>
#include <libsec.h>
#include <draw.h>
#include <mouse.h>
#include <frame.h>
#include "mez.h"
Image *nicksscreen, *cmdscreen, *nickscols[NCOL], *cols[NCOL], *cmdcols[NCOL];
char *nickswsys = "/mnt/nickswsys", *cmdwsys = "/mnt/cmdwsys";
Screen *_nicksscreen, *_cmdscreen;
enum {
MOUSE,
KEYBD,
RESIZE,
NICKSMOUSE,
NICKSKEYBD,
NICKSRESIZE,
CMDMOUSE,
CMDKEYBD,
CMDRESIZE,
NCHAN,
};
void
usage(void)
{
fprint(2, "usage: %s [-u user] host netid\n", argv0);
threadexits("usage");
}
void
error(char *s)
{
fprint(2, "%s: error: %s: %r\n", argv0, s);
threadexits(s);
}
void*
emallocz(ulong sz, int clr)
{
void *p;
if((p = mallocz(sz, clr)) == nil)
error("Out of memory");
setmalloctag(p, getcallerpc(&sz));
return p;
}
void*
erealloc(void *ptr, ulong size)
{
void *p;
if((p = realloc(ptr, size)) == nil)
error("Out of memory there");
setmalloctag(p, getcallerpc(&ptr));
return p;
}
void
vwmsg(Net *n, char *fmt, va_list v)
{
char *e;
e = vseprint(n->out, n->out+sizeof(n->out), fmt, v);
va_end(v);
*e++ = '\r';
*e++ = '\n';
write(n->fd, n->out, e-n->out);
}
void
wmsg(Net *n, char *fmt, ...)
{
va_list v;
va_start(v, fmt);
vwmsg(n, fmt, v);
}
char*
rmsg(Net *n)
{
int bytes;
bytes = read(n->fd, n->in, sizeof(n->in));
n->in[bytes-2] = '\n';
n->in[bytes-1] = '\0';
return n->in;
}
char*
wrmsg(Net *n, char *fmt, ...)
{
va_list v;
va_start(v, fmt);
vwmsg(n, fmt, v);
return rmsg(n);
}
Net*
connect(App *a, int netid)
{
Net *n;
int bytes;
char b64[512];
uchar buf[512];
TLSconn *conn;
n = emallocz(sizeof(*n), 1);
n->id = netid;
n->fd = dial(netmkaddr(a->host, "tcp", "6697"), nil, nil, nil);
if(n->fd == -1)
error("Could not connect");
conn = emallocz(sizeof(*conn), 1);
n->fd = tlsClient(n->fd, conn);
free(conn);
if(n->fd == -1)
error("Could not negotiate tls connection");
wmsg(n, "CAP LS 302");
wmsg(n, "NICK %s", a->user);
print(wrmsg(n, "USER %s 0 * %s", a->user, a->user));
print(wrmsg(n, "CAP REQ :sasl"));
print(wrmsg(n, "AUTHENTICATE PLAIN\r\n"));
bytes = snprint((char*)buf, sizeof(buf), "%c%s%c%s", '\0', a->user, '\0', a->passwd);
enc64(b64, sizeof(b64), buf, bytes);
print(wrmsg(n, "AUTHENTICATE %s\r\n", b64));
if(n->id < 0){
wmsg(n, "CAP END");
wmsg(n, "BOUNCER LISTNETWORKS");
return n;
}
wmsg(n, "BOUNCER BIND %d", netid);
wmsg(n, "CAP END");
return n;
}
void
readnetproc(void *a)
{
Net *net;
char *in;
net = a;
for(;;){
in = rmsg(net);
if(strncmp(in, "PING", 4) == 0){
wmsg(net, "PONG%s", in+4);
continue;
}
}
}
Msg*
parse(char *s)
{
}
void
createwindow(char *wsys, Image **screen, Screen **_screen, Rectangle r)
{
static char s[512];
char *wsysv;
int fd;
if((wsysv = getenv("wsys")) == nil)
sysfatal("cannot find $wsys: %r");
if((fd = open(wsysv, ORDWR)) < 0)
sysfatal("cannot open $wsys: %r");
free(wsysv);
snprint(s, sizeof(s), "new -r %d %d %d %d", r.min.x, r.min.y, r.max.x, r.max.y);
if(mount(fd, -1, wsys, MREPL, s) < 0)
sysfatal("cannot create new window: %r");
close(fd);
snprint(s, sizeof(s), "%s/label", wsys);
if((fd = open(s, OWRITE)) < 0)
sysfatal("cannot open label: %r");
write(fd, "guitest", sizeof("guitest"));
close(fd);
snprint(s, sizeof(s), "%s/winname", wsys);
if(gengetwindow(display, s, screen, _screen, Refnone) < 0)
sysfatal("cannot get window: %r");
}
void
threadmain(int argc, char **argv)
{
App app;
UserPasswd *up;
Net *n;
int netid;
app.user = getenv("user");
ARGBEGIN{
default:
usage();
case 'u':
app.user = EARGF(usage());
break;
}ARGEND
if (argc != 2)
usage();
app.host = argv[0];
netid = strtol(argv[1], nil, 0);
up = auth_getuserpasswd(auth_getkey, "proto=pass server=%s service=irc user=%s", app.host, app.user);
if(up == nil)
error("could not get a password");
app.passwd = up->passwd;
n = connect(&app, netid);
for(int i = 0; i < 10000; i++){
print(rmsg(n));
}
free(up);
close(n->fd);
free(n);
threadexits(0);
}