all repos — xrxs @ 9d81d9d6ab7969be1c152dba9b83537d5d2ebbb2

experimental networked application/game server with 9p

xrxs.c (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
#include <stdio.h>

/* clang-format off */

char  clca(char c) { return c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c; } /* char to lowercase */
char  cuca(char c) { return c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c; } /* char to uppercase */
int   slen(char *s) { int i = 0; while(s[i] && s[++i]) { ; } return i; } /* string length */
char *st__(char *s, char (*fn)(char)) { int i = 0; char c; while((c = s[i])) s[i++] = fn(c); return s; }
char *stuc(char *s) { return st__(s, cuca); } /* string to uppercase */
char *stlc(char *s) { return st__(s, clca); } /* string to lowercase */
char *scpy(char *src, char *dst, int len) { int i = 0; while((dst[i] = src[i]) && i < len - 2) i++; dst[i + 1] = '\0'; return dst; } /* string copy */
int   scmp(char *a, char *b) { int i = 0; while(a[i] == b[i]) if(!a[i++]) return 1; return 0; } /* string compare */
char *scsw(char *s, char a, char b) { int i = 0; char c; while((c = s[i])) s[i++] = c == a ? b : c; return s; } /* string char swap */
char *scat(char *dst, const char *src) { char *ptr = dst + slen(dst); while(*src) *ptr++ = *src++; *ptr = '\0'; return dst; } /* string cat */
int   ssin(char *s, char *ss) { int a = 0, b = 0; while(s[a]) { if(s[a] == ss[b]) { if(!ss[b + 1]) return a - b; b++; } else b = 0; a++; } return -1; } /* string substring index */
char *ccat(char *dst, char c) { int len = slen(dst); dst[len] = c; dst[len + 1] = '\0'; return dst; }

/* clang-format on */

void fsread(Req* r) {
  static int i = 0;
  char numReads[16];
  i = i + 1;
  sprintf(numReads, "%d reads\n", i);
  readstr(r, "Hello from 9P!\n");
  readstr(r, numReads);
  respond(r, nil);
}

Srv fs = {
  .read = fsread,
};

void threadmain(int argc, char** argv) {
  Tree* tree;
  char* mtpt = argv[1];

  if (argc < 1)
    sysfatal("supply a mountpoint");

  tree = alloctree(nil, nil, DMDIR | 0555, nil);
  fs.tree = tree;
  fs.foreground = 1;
  createfile(tree->root, "hello", nil, 0555, nil);

  if (mtpt && access(mtpt, AEXIST) < 0 && access(mtpt, AEXIST) < 0)
    sysfatal("mountpoint %s does not exist", mtpt);

  threadpostmountsrv(&fs, nil, mtpt, MREPL | MCREATE);
  threadexits(0);
}