From edc0e119bc21c056bcc4ac62def9dda27274d7e8 Mon Sep 17 00:00:00 2001 From: Derek Stevens Date: Fri, 2 Jul 2021 15:59:40 -0600 Subject: [PATCH] self is always first in users list; implement logout --- hash.c | 16 ----- xrxs.c | 200 +++++++++++++++++++++++++++++++-------------------------- 2 files changed, 110 insertions(+), 106 deletions(-) delete mode 100644 hash.c diff --git a/hash.c b/hash.c deleted file mode 100644 index 61f1799..0000000 --- a/hash.c +++ /dev/null @@ -1,16 +0,0 @@ -#include - -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; -} \ No newline at end of file diff --git a/xrxs.c b/xrxs.c index 743e462..3db7da7 100644 --- a/xrxs.c +++ b/xrxs.c @@ -9,9 +9,6 @@ #include #include -#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 @@ Aux* create_aux(FileType t) { 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 @@ void xrxs_attach(Req* r) { } 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 @@ void xrxs_attach(Req* r) { 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; - } - - 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; +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); } - 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); +} + +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; + } + } + 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 xrxs_write(Req* r) { } 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 @@ void xrxs_read(Req* r) { } } -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 @@ String** listdir(char* path) { 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 @@ void threadmain(int argc, char* argv[]) { 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 @@ void threadmain(int argc, char* argv[]) { 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;