ref: 443cea6f92cb01bd6ff800bbcca0ed7be1ede2f1
parent: 422e3d7d957a1b9042d7490b7f91b89f36e7d330
author: halfwit <michaelmisch1985@gmail.com>
date: Thu Oct 8 10:45:59 PDT 2020
Add in c9 includes to the build, remove io.c example code
--- a/io.c
+++ /dev/null
@@ -1,406 +1,0 @@
-#define _DEFAULT_SOURCE
-#define _FILE_OFFSET_BITS 64
-#include <errno.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <termios.h>
-#include <unistd.h>
-#include "c9/c9.h"
-
-enum {
- Msize = 8192,
-
- Rootfid = 0,
- Indexfid,
- Chatfid,
-
- Error = 1<<0,
- Joined = 1<<1,
- Disconnected = 1<<2,
-};
-
-typedef struct C9aux C9aux;
-typedef struct REntry REntry;
-
-struct C9aux {
- C9ctx;
- int f;
- int flags;
- uint8_t rdbuf[Msize];
- uint8_t wrbuf[Msize];
- uint32_t wroff;
-};
-
-static const char *nick;
-static int printjoin;
-static uint64_t chatoff, skipuntil;
-
-static uint8_t *
-ctxread(C9ctx *ctx, uint32_t size, int *err)
-{
- uint32_t n;
- int r;
- C9aux *a;
-
- a = ctx->aux;
- *err = 0;
- for (n = 0; n < size; n += r) {
- if ((r = read(a->f, a->rdbuf+n, size-n)) <= 0) {
- if (errno == EINTR)
- continue;
- a->flags |= Disconnected;
- close(a->f);
- return NULL;
- }
- }
-
- return a->rdbuf;
-}
-
-static int
-wrsend(C9aux *a)
-{
- uint32_t n;
- int w;
-
- for (n = 0; n < a->wroff; n += w) {
- if ((w = write(a->f, a->wrbuf+n, a->wroff-n)) <= 0) {
- if (errno == EINTR)
- continue;
- if (errno != EPIPE) /* remote end closed */
- perror("write");
- return -1;
- }
- }
- a->wroff = 0;
-
- return 0;
-}
-
-static uint8_t *
-ctxbegin(C9ctx *ctx, uint32_t size)
-{
- uint8_t *b;
- C9aux *a;
-
- a = ctx->aux;
- if (a->wroff + size > sizeof(a->wrbuf)) {
- if (wrsend(a) != 0 || a->wroff + size > sizeof(a->wrbuf))
- return NULL;
- }
- b = a->wrbuf + a->wroff;
- a->wroff += size;
-
- return b;
-}
-
-static int
-ctxend(C9ctx *ctx)
-{
- (void)ctx;
- return 0;
-}
-
-static int
-dial(char *s)
-{
- struct addrinfo *r, *a, hint = {.ai_flags = AI_ADDRCONFIG, .ai_family = AF_UNSPEC, 0};
- char host[64], *port;
- int e, f;
-
- if (strncmp(s, "udp!", 4) == 0) {
- hint.ai_socktype = SOCK_DGRAM;
- hint.ai_protocol = IPPROTO_UDP;
- } else if (strncmp(s, "tcp!", 4) == 0) {
- hint.ai_socktype = SOCK_STREAM;
- hint.ai_protocol = IPPROTO_TCP;
- } else {
- fprintf(stderr, "invalid dial string: %s\n", s);
- return -1;
- }
- if ((port = strchr(s+4, '!')) == NULL) {
- fprintf(stderr, "invalid dial string: %s\n", s);
- return -1;
- }
- if (snprintf(host, sizeof(host), "%.*s", (int)(port-s-4), s+4) >= (int)sizeof(host)) {
- fprintf(stderr, "host name too large: %s\n", s);
- return -1;
- }
- port++;
- if ((e = getaddrinfo(host, port, &hint, &r)) != 0)
- return -1;
- f = -1;
- for (a = r; a != NULL; a = a->ai_next) {
- if ((f = socket(a->ai_family, a->ai_socktype, a->ai_protocol)) < 0)
- continue;
- if (connect(f, a->ai_addr, a->ai_addrlen) != 0) {
- close(f);
- f = -1;
- continue;
- }
- }
- freeaddrinfo(r);
-
- return f;
-}
-
-static void
-output(uint8_t *d, int sz)
-{
- int i, j;
-
- for (i = j = 0; i < sz; i++) {
- d[j] = d[i];
- if (d[j] > 31 || d[j] == '\t' || d[j] == '\n')
- j++;
- }
- write(1, d, j);
-}
-
-static void
-ctxchatR(C9ctx *ctx, C9r *r)
-{
- C9aux *a;
- C9tag tag;
- const char *path[2];
- char buf[64];
-
- a = ctx->aux;
- switch (r->type) {
- case Rversion:
- c9attach(ctx, &tag, Rootfid, C9nofid, "none", NULL);
- path[0] = "chat";
- path[1] = NULL;
- c9walk(ctx, &tag, Rootfid, Chatfid, path);
- c9open(ctx, &tag, Chatfid, C9rdwr);
- break;
-
- case Rread:
- if (chatoff >= skipuntil)
- output(r->read.data, r->read.size);
- chatoff += r->read.size;
- /* fallthrough */
- case Ropen:
- if ((a->flags & Joined) == 0 && printjoin) {
- c9write(ctx, &tag, Chatfid, 0, buf, snprintf(buf, sizeof(buf), "JOIN %s to chat\n", nick));
- a->flags |= Joined;
- }
- c9read(ctx, &tag, Chatfid, chatoff, chatoff < skipuntil ? skipuntil-chatoff : Msize);
- break;
-
- case Rerror:
- fprintf(stderr, "chat error: %s\n", r->error);
- a->flags |= Error;
- break;
-
- default:
- break;
- }
-}
-
-static void
-ctxregistryR(C9ctx *ctx, C9r *r)
-{
- char *s, *b;
- C9aux *a;
- C9tag tag;
- const char *path[2];
-
- a = ctx->aux;
- switch (r->type) {
- case Rversion:
- c9attach(ctx, &tag, Rootfid, C9nofid, "none", NULL);
- path[0] = "index";
- path[1] = NULL;
- c9walk(ctx, &tag, Rootfid, Indexfid, path);
- c9open(ctx, &tag, Indexfid, C9read);
- break;
-
- case Ropen:
- c9read(ctx, &tag, Indexfid, 0, Msize);
- break;
-
- case Rread:
- r->read.data[r->read.size] = 0;
- for (s = (char*)r->read.data;;) {
- if ((s = strstr(s, "gridchat")) == NULL)
- break;
- for (b = s; b != (char*)r->read.data && *b != '\n'; b--);
- if (*b == '\n')
- b++;
- if ((s = strchr(s, '\n')) == NULL)
- s = (char*)&r->read.data[r->read.size];
- *s = 0;
- if (strstr(b, "tlssrv") == NULL && (s = strchr(b, ' ')) != NULL) {
- *s = 0;
- close(a->f);
- if ((a->f = dial(b)) < 0)
- exit(1);
- a->flags = 0;
- a->r = ctxchatR;
- a->wroff = 0;
- c9version(ctx, &tag, Msize);
- if (wrsend(a) != 0)
- exit(1);
- return;
- }
- }
- fprintf(stderr, "chat hasn't been found in the registry\n");
- exit(1);
- break;
-
- case Rerror:
- fprintf(stderr, "registry error: %s\n", r->error);
- a->flags |= Error;
- break;
-
- default:
- break;
- }
-}
-
-__attribute__ ((format (printf, 1, 2)))
-static void
-ctxerror(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
- va_end(ap);
-}
-
-static C9aux *
-srv(char *s)
-{
- C9aux *c;
- int f;
-
- if ((f = dial(s)) < 0)
- return NULL;
- c = calloc(1, sizeof(*c));
- c->f = f;
- c->read = ctxread;
- c->begin = ctxbegin;
- c->end = ctxend;
- c->error = ctxerror;
- c->aux = c;
-
- return c;
-}
-
-static C9aux *
-registry(void)
-{
- C9aux *a;
- C9tag tag;
- int i;
-
- for (i = 0; i < 10; i++) {
- if ((a = srv("tcp!registry.9gridchan.org!6675")) != NULL)
- break;
- sleep(5);
- }
- if (a == NULL)
- return NULL;
-
- a->r = ctxregistryR;
- c9version((C9ctx*)a, &tag, Msize);
- wrsend(a);
- while (c9proc((C9ctx*)a) == 0 && a->r == ctxregistryR)
- wrsend(a);
-
- return a;
-}
-
-static int
-chatrw(C9aux *a)
-{
- struct timeval t;
- fd_set r, e;
- int n, sz;
- C9tag tag;
- C9ctx *ctx;
- char *s;
-
- FD_ZERO(&r);
- FD_SET(a->f, &r);
- FD_SET(0, &r);
- FD_ZERO(&e);
- FD_SET(a->f, &e);
- FD_SET(0, &e);
- memset(&t, 0, sizeof(t));
- t.tv_sec = 10;
- for (;;) {
- errno = 0;
- if ((n = select(a->f + 1, &r, NULL, &e, &t)) < 0 || FD_ISSET(a->f, &e) || FD_ISSET(0, &e)) {
- if (errno == EINTR)
- continue;
- return -1;
- }
- break;
- }
-
- ctx = (C9ctx*)a;
- if (FD_ISSET(a->f, &r)) {
- c9proc(ctx);
- } else if (FD_ISSET(0, &r)) {
- s = (char*)a->rdbuf;
- sz = sprintf(s, "%s → ", nick);
- for (;;) {
- if ((n = read(0, s+sz, sizeof(a->rdbuf)-sz)) > 0)
- sz += n;
- else
- exit(0);
- if (s[sz-1] != '\n'){
- s[sz-1] = '\n';
- }else{
- c9write(ctx, &tag, Chatfid, 0, s, sz);
- break;
- }
- }
- } else {
- const char *path[] = {NULL};
- c9walk(ctx, &tag, Rootfid, Rootfid, path);
- }
-
- return 0;
-}
-
-int
-main(int argc, char **argv)
-{
- struct termios t;
- C9aux *a;
- int c, noecho;
-
- if (noecho && tcgetattr(0, &t) == 0) {
- t.c_lflag &= ~ECHO;
- tcsetattr(STDIN_FILENO, TCSANOW, &t);
- }
-
- for (;;) {
- if ((a = registry()) == NULL)
- return 1;
- while (chatrw(a) == 0 && wrsend(a) == 0);
- if (a->flags & (Disconnected|Error)) {
- a->flags &= ~(Disconnected|Error);
- skipuntil = chatoff;
- chatoff = 0;
- free(a);
- } else {
- printf("exiting\n");
- exit(1);
- }
- }
-
- return 0;
-}
--- a/meson.build
+++ b/meson.build
@@ -1,7 +1,8 @@
srcs = [
'x9dev.c',
'draw.c',
- 'io.c',
+ 'c9/c9.c',
+ 'c9/c9.h',
'../../mi/miinitext.c',
'x9dev.h',
'keymap.h',
--- a/x9dev.h
+++ b/x9dev.h
@@ -51,6 +51,8 @@
#include "glx_extinit.h"
#include "input.h"
#include "scrnintstr.h"
+#include "c9/c9.h"
+
typedef struct x9devInfo x9devInfo;
struct x9devInfo