self is always first in users list; implement logout
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmDfjEwACgkQO3+8IhRO Y5iHsxAAgd9yMGoxXEgaUTJVtmb1HqADqCbUkBUUp6D8mvnvI8bAxDU8h7ZUSdWx n29gFZLwrMjB1fFaPdjbxn0ysLTc8YT4R8bdOZQAWX8dBY8IZ8Dk7S99rX8Dwfc2 8aFXckf2+EKKoWn+Zysj1mC15d4/OMLsK9Mq/4K0HgXw9gY6Qx/mhKY4TlG6sWfH 4ZrexQynNZn8FXGluBa+IX/wYOBRXOuXtb84iU9Zd1JkQKrjvVlIhtZz45MW1EqT F5ceOOKE63ZOYp8wW/QDCauZTDQ3KAmT1W2hkDiWEjUbci0ARdRLZX9QTNDwe/wA LSXFRrmKY7a5s4XNc3pikLqcF5UPyftllZuuT+WDg0RihwA6qM5g85U1XW9jglGL taxnEijc0BbCcldzhbnhFkDeS+wTK2YDf4DbRczI8TgPcEhS6b2IDzGV6yX0WeMf sqb7jcyYSJznTnEg1JM4iWpBGdiv3nnpJweJr8yRrHXXsvcztvg9XBiCBFgnXzBk APEPpCaBB2NP9abD/13KmUq4+woRz2pjD5ghMZGW7yw4ZwLPwb84uDnyMgZ7J+T7 zE2bClfjEdH5XlEne2dZ1LPkBlWcechMG7f+zd3ng09TDXSewZdUcJJZkKzoJJO9 uIKauTXh4A4BEItrGIDKxopPhB0P2uQMLxe/UQIQKcjxah+WbfQ= =mpSp -----END PGP SIGNATURE-----
2 files changed,
106 insertions(+),
102 deletions(-)
D
hash.c
@@ -1,16 +0,0 @@
-#include <stdio.h> - -unsigned long long hash(char* str) { - unsigned long long h; - unsigned char* p; - - h = 0; - for (p = (unsigned char*)str; *p != '\0'; p++) - h = 37 * h + *p; - return h; // or, h % ARRAY_SIZE; -} - -int main(int argc, char** argv) { - printf("%llu\n", hash(argv[1])); - return 0; -}
M
xrxs.c
→
xrxs.c
@@ -9,9 +9,6 @@ #include <libString.h>
#include <mp.h> #include <libsec.h> -#define CARTSLOC "./carts/" -#define CTL_HASHV 139931 -#define SHUTDOWN_HASHV 11192337284248 /* clang-format off */ char clca(char c) { return c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c; } /* char to lowercase */@@ -36,6 +33,19 @@ static char Euname[] = "username is already taken";
static Tree* tree; +typedef enum { + LOGIN = 208176873, + LOAD = 5626172, + CREATE = 7083959236, + PROTECT = 295480618573, + ENTER = 195024746, + LEAVE = 207662601, + LOGOUT = 7702552890, + SAVE = 5962355, + RESET = 218931595, + UNLOAD = 8325026851 +} Command; + typedef enum { CTL = 1, USERS, CARTS, SLOT, DATA, REALMS, UNIVERSE } FileType; typedef struct Aux Aux;@@ -57,11 +67,22 @@
typedef struct UserInfo UserInfo; struct UserInfo { char name[32]; + uvlong password; ushort id; }; static UserInfo users_table[64]; +uvlong hash(char* str) { + uvlong h; + uchar* p; + + h = 0; + for (p = (unsigned char*)str; *p != '\0'; p++) + h = 37 * h + *p; + return h; // or, h % ARRAY_SIZE; +} + void xrxs_attach(Req* r) { /* As it is, once the user detaches, they will stay in the table * until the server restarts. We have to figure out some way@@ -80,12 +101,12 @@ usr++;
} for (i = 0; i < 64; i++) { usr = users_table[i].name; - if (scmp(usr, username)){ + if (scmp(usr, username)) { respond(r, Euname); return; - } + } if (*usr == 0) { - scpy(username, usr, l+1); + scpy(username, usr, l + 1); users_table[i].id = id++; break; }@@ -93,81 +114,71 @@ }
respond(r, nil); } -void fsread(Req* r) { - Aux* a; - vlong offset; - long count; - - a = r->fid->file->aux; - offset = r->ifcall.offset; - count = r->ifcall.count; - - /*print("read %ld %lld\n", *count, offset); */ - if (offset >= a->count) { - r->ofcall.count = 0; - respond(r, nil); - return; +void login(char* uname, char* password) { + int i; + for (i = 0; i < 64; i++) { + if (scmp(uname, users_table[i].name)) { + users_table[i].password = hash(password); + } } - - if (offset + count >= a->count) - count = a->count - offset; - - memmove(r->ofcall.data, a->data + offset, count); - r->ofcall.count = count; - respond(r, nil); } -unsigned long long hash(char* str) { - unsigned long long h; - unsigned char* p; - - h = 0; - for (p = (unsigned char*)str; *p != '\0'; p++) - h = 37 * h + *p; - return h; // or, h % ARRAY_SIZE; -} - -void fswrite(Req* r) { - void* v; - Aux* a; - vlong offset; - long count; - - a = r->fid->file->aux; - offset = r->ifcall.offset; - count = r->ifcall.count; - - if (offset + count >= a->count) { - v = realloc(a->data, offset + count); - if (v == nil) { - respond(r, Enomem); - return; +int logout(char* uname) { + int i; + fprintf(stderr, uname); + for (i = 0; i < 64; i++) { + if (scmp(uname, users_table[i].name)) { + *(users_table[i].name) = 0; + users_table[i].id = 0; + users_table[i].password = 0; + return 1; } - a->data = v; - a->count = offset + count; - r->fid->file->dir.length = a->count; } - memmove(a->data + offset, r->ifcall.data, count); - r->ofcall.count = count; - respond(r, nil); + return 0; } void write_ctl(Req* r) { - char cmd[16]; + char cmd[16] = {0}; char* c = r->ifcall.data; int i; - /*for (i = 0; i < r->ifcall.count; i++) { + for (i = 0; i < r->ifcall.count && *c != ' ' && *c != '\n'; i++) { ccat(cmd, *c++); } - - unsigned long long const cmd_hashv = hash(cmd); - + fprintf(stderr, cmd); + uvlong const cmd_hashv = hash(cmd); switch (cmd_hashv) { - default:*/ - createfile(tree->root, "success", nil, 0777, nil); - /*break; - }*/ + case LOGIN: + login(r->fid->uid, c); + break; + case LOAD: + // load(c); + break; + case CREATE: + // create(c); + break; + case PROTECT: + // protect(c); + break; + case ENTER: + // enter(c); + break; + case LEAVE: + // leave(c); + break; + case LOGOUT: + logout(r->fid->uid); + break; + case SAVE: + // save(); + break; + case RESET: + // reset(); + break; + case UNLOAD: + // unload(); + break; + } r->ofcall.count = r->ifcall.count; r->fid->file->dir.length = r->ifcall.count; respond(r, nil);@@ -189,19 +200,25 @@ }
} void read_users(Req* r) { - char buf[2112] = {0}; + char buf[2113] = {0}; int i; for (i = 0; i < 64; i++) { - if (scmp(users_table[i].name, "\0")) { + if (scmp(users_table[i].name, r->fid->uid)) { + scat(buf, users_table[i].name); + ccat(buf, '\n'); break; } - scat(buf, users_table[i].name); - if (i == 63) { - ccat(buf, 0); - } else { - ccat(buf, '\n'); + } + for (i = 0; i < 64; i++) { + if ( + scmp(users_table[i].name, "\0") || + scmp(users_table[i].name, r->fid->uid)) { + continue; } + scat(buf, users_table[i].name); + ccat(buf, '\n'); } + ccat(buf, 0); readstr(r, buf); respond(r, nil); }@@ -233,10 +250,6 @@ break;
} } -void fsopen(Req* r) { respond(r, nil); } - -void wstat(Req* r) { respond(r, nil); } - void fs_destroy_file(File* f) { Aux* a = f->aux; if (a && a->data) {@@ -272,12 +285,7 @@ self[i] = nil;
return self; } -Srv fs = { - .attach = xrxs_attach, - .open = fsopen, - .read = xrxs_read, - .write = xrxs_write, - .wstat = wstat}; +Srv fs = {.attach = xrxs_attach, .read = xrxs_read, .write = xrxs_write}; int threadmaybackground(void) { return 1; }@@ -287,6 +295,12 @@ char* usocket = nil;
int i; String** cart; + /* if -h CMD is given, print the hash value of CMD */ + if (argc == 3 && scmp(argv[1], "-h")) { + printf("%llu\n", hash(argv[2])); + return; + } + /* if -m PATH is supplied, mount on PATH */ /* if -s NAME is supplied, create a socket for the namespace */ /* otherwise, just use srv() (for wrapping with socat or inetd) */@@ -306,10 +320,16 @@
fs.foreground = 1; fs.tree = alloctree(nil, nil, DMDIR | 0777, fs_destroy_file); tree = fs.tree; - closefile(createfile(tree->root, "carts", nil, 0444, create_aux(CARTS))); + closefile( createfile(tree->root, "ctl", nil, DMAPPEND | 0300, create_aux(CTL))); - closefile(createfile(tree->root, "users", nil, 0444, create_aux(USERS))); + closefile(createfile(tree->root, "carts", nil, 0400, create_aux(CARTS))); + closefile(createfile(tree->root, "users", nil, 0400, create_aux(USERS))); + closefile(createfile(tree->root, "slot", nil, 0400, create_aux(SLOT))); + closefile(createfile(tree->root, "data", nil, DMDIR | 0500, nil)); + closefile(createfile(tree->root, "realms", nil, 0400, create_aux(REALMS))); + closefile( + createfile(tree->root, "universe", nil, 0600, create_aux(UNIVERSE))); /*String** carts = listdir("carts/"); cart = carts;