From 034b958eb7a6b4246942d99e0ef1bf4d10c56630 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Wed, 8 Feb 2023 16:57:59 -0500 Subject: [PATCH 01/33] Added boilerplate loch stuff and got it to commit --- pkg/c3/motes.h | 2 ++ pkg/vere/auto.c | 1 + pkg/vere/vere.h | 7 +++++++ 3 files changed, 10 insertions(+) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 0c1604d0d9..5d495802ae 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -660,6 +660,7 @@ # define c3__ktts c3_s4('k','t','t','s') # define c3__ktwt c3_s4('k','t','w','t') # define c3__ktzp c3_s4('k','t','z','p') +# define c3__l c3_s1('l') # define c3__lamb c3_s4('l','a','m','b') # define c3__lame c3_s4('l','a','m','e') # define c3__lang c3_s4('l','a','n','g') @@ -698,6 +699,7 @@ # define c3__live c3_s4('l','i','v','e') # define c3__load c3_s4('l','o','a','d') # define c3__loaf c3_s4('l','o','a','f') +# define c3__loch c3_s4('l','o','c','h') # define c3__log c3_s3('l','o','g') # define c3__logo c3_s4('l','o','g','o') # define c3__lome c3_s4('l','o','m','e') diff --git a/pkg/vere/auto.c b/pkg/vere/auto.c index 6eaa3360a5..acd20d2144 100644 --- a/pkg/vere/auto.c +++ b/pkg/vere/auto.c @@ -438,6 +438,7 @@ u3_auto_init(u3_pier* pir_u) car_u = _auto_link(u3_unix_io_init(pir_u), pir_u, car_u); car_u = _auto_link(u3_term_io_init(pir_u), pir_u, car_u); car_u = _auto_link(u3_fore_io_init(pir_u), pir_u, car_u); + car_u = _auto_link(u3_loch_io_init(pir_u), pir_u, car_u); return car_u; } diff --git a/pkg/vere/vere.h b/pkg/vere/vere.h index c714dc3a95..1f33d7f460 100644 --- a/pkg/vere/vere.h +++ b/pkg/vere/vere.h @@ -1178,6 +1178,13 @@ u3_auto* u3_behn_io_init(u3_pier* pir_u); + /** loch, hardware control. + **/ + /* u3_loch_io_init(): initialize loch vane. + */ + u3_auto* + u3_loch_io_init(u3_pier* pir_u); + /** HTTP server. **/ /* u3_http_io_init(): initialize http I/O. From 2df93cf2ca89191475a417264aa092e6b0ae602f Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Wed, 8 Feb 2023 17:03:21 -0500 Subject: [PATCH 02/33] forgot to add the damn main file --- pkg/vere/io/loch.c | 214 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 pkg/vere/io/loch.c diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c new file mode 100644 index 0000000000..c0b217c072 --- /dev/null +++ b/pkg/vere/io/loch.c @@ -0,0 +1,214 @@ +/// @file + +#include "vere.h" +#include +#include "noun.h" + +/* u3_device: description of a device + */ + typedef struct _u3_device { + c3_w nam_w; // %name of device + c3_c* fil_c; // file of device + c3_w fid_w; // file descriptor + c3_o opn_o; // is the file open + } u3_device; + +/* u3_loch: a list of devices +*/ + typedef struct _u3_loch { + u3_auto car_u; // driver + c3_w cnt_w; // count of devices + u3_device* dev_u; // list of devices + } u3_loch; + +// XX review, move +// +/* _behn_bail_dire(): c3y if fatal error. RETAIN +*/ +static c3_o +_behn_bail_dire(u3_noun lud) +{ + u3_noun mot = u3r_at(4, lud); + + if ( (c3__meme == mot) + || (c3__intr == mot) ) + { + return c3n; + } + + return c3y; +} + +/* _lock_read_bail(): figure out why loch failed to read and return error code +*/ +static void +_loch_read_bail(u3_ovum* egg_u, u3_noun lud) +{ + u3l_log("loch: read failed"); +} + +/* u3_loch_ef_read(): read from device +*/ +static void +_loch_ef_read(u3_loch* teh_u, u3_noun cmd) +{ + if ( c3n == teh_u->car_u.liv_o ) { + teh_u->car_u.liv_o = c3y; + } + + // extract read count and device from cmd noun + // preform read on device and store in c3_y* + // turn that c3_y* into some u3_noun + // send read event with u3_noun to arvo + // + { + u3_noun wir = u3nc(c3__behn, u3_nul); + u3_noun cad = u3nc(c3__wake, u3_nul); + + u3_auto_peer( + u3_auto_plan(&teh_u->car_u, u3_ovum_init(0, c3__b, wir, cad)), + 0, 0, _loch_read_bail); + } + + u3z(cmd); +} + +/* _loch_born_news(): initialization complete on %born. +*/ +static void +_loch_born_news(u3_ovum* egg_u, u3_ovum_news new_e) +{ + u3_auto* car_u = egg_u->car_u; + + if ( u3_ovum_done == new_e ) { + car_u->liv_o = c3y; + } +} + +/* _loch_born_bail(): %born is essential, retry failures. +*/ +static void +_loch_born_bail(u3_ovum* egg_u, u3_noun lud) +{ + u3_auto* car_u = egg_u->car_u; + + if ( (2 > egg_u->try_w) + && (c3n == _behn_bail_dire(lud)) ) + { + u3z(lud); + u3_auto_redo(car_u, egg_u); + } + else { + u3_auto_bail_slog(egg_u, lud); + u3_ovum_free(egg_u); + + u3l_log("loch: initialization failed"); + + // XX review, add flag to continue? + // + u3_pier_bail(car_u->pir_u); + } +} +/* _loch_io_talk(): notify %loch that we're live + * pass it a list of device names +*/ +static void +_loch_io_talk(u3_auto* car_u) +{ + u3_loch* teh_u = (u3_loch*)car_u; + + // the card should have a list of all devices + // one way is to ensure all devices are motes + u3_noun wir = u3nt(c3__loch, + u3_nul, + u3_nul); + u3_noun cad = u3nc(c3__born, u3_nul); + + u3_auto_peer( + u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, + _loch_born_news, + _loch_born_bail); +} + +/* _behn_io_kick(): apply effects. +*/ +static c3_o +_loch_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) +{ + u3_loch* teh_u = (u3_loch*)car_u; + + u3_noun tag, dat, i_wir; + c3_o ret_o; + + if ( (c3n == u3r_cell(wir, &i_wir, 0)) + || (c3n == u3r_cell(cad, &tag, &dat)) + || (c3__loch != i_wir) + || (c3__read != tag) ) + { + ret_o = c3n; + } + else { + ret_o = c3y; + _loch_ef_read(teh_u, u3k(dat)); // apply writ command + } + + u3z(wir); u3z(cad); + return ret_o; +} + + +/* _loch_io_exit(): close all open device files and exit +*/ +static void +_loch_io_exit(u3_auto* car_u) +{ + u3_loch* teh_u = (u3_loch*)car_u; + + for( c3_w i = 0; i< teh_u->cnt_w; i++ ) { + if( c3y == teh_u->dev_u[i].opn_o ) { + close(teh_u->dev_u[i].fid_w); + } + c3_free(&teh_u->dev_u[i]); + } + c3_free(teh_u); +} + +/* u3_loch(): initialize hardware control vane. +*/ +u3_auto* +u3_loch_io_init(u3_pier* pir_u) +{ + u3_loch* teh_u = c3_calloc(sizeof(*teh_u)); + + // TODO: Open all devices specified in pier. + // Right now this only opens /dev/random and will provide a random number + u3_device* random = c3_calloc(sizeof(teh_u)); + + random->nam_w = c3_s4('r','a','n','d'); + random->fil_c = "/dev/random"; + + teh_u->cnt_w = 1; + teh_u->dev_u = c3_calloc(teh_u->cnt_w*sizeof(teh_u)); + teh_u->dev_u[0] = *random; + + // Open all devices + for( c3_w i = 0; i< teh_u->cnt_w; i++ ) { + teh_u->dev_u[i].fid_w = open(teh_u->dev_u[i].fil_c, O_RDWR); + if ( teh_u->dev_u[i].fid_w < 0 ) { //If any error report it and keep device marked as close + fprintf(stderr, "Unable to open device file %s \n", teh_u->dev_u[i].fil_c); + } else { + teh_u->dev_u[i].opn_o = c3y; + } + } + + u3_auto* car_u = &teh_u->car_u; + car_u->nam_m = c3__loch; + + car_u->liv_o = c3n; + car_u->io.talk_f = _loch_io_talk; + car_u->io.kick_f = _loch_io_kick; + car_u->io.exit_f = _loch_io_exit; + + return car_u; +} From b30ac8f19d658b9e083a308e383dc1f11b163d23 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Fri, 10 Feb 2023 14:45:02 -0500 Subject: [PATCH 03/33] modified loch --- pkg/vere/io/loch.c | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index c0b217c072..0ecef31791 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -90,24 +90,10 @@ _loch_born_news(u3_ovum* egg_u, u3_ovum_news new_e) static void _loch_born_bail(u3_ovum* egg_u, u3_noun lud) { - u3_auto* car_u = egg_u->car_u; - if ( (2 > egg_u->try_w) - && (c3n == _behn_bail_dire(lud)) ) - { - u3z(lud); - u3_auto_redo(car_u, egg_u); - } - else { - u3_auto_bail_slog(egg_u, lud); - u3_ovum_free(egg_u); - - u3l_log("loch: initialization failed"); - - // XX review, add flag to continue? - // - u3_pier_bail(car_u->pir_u); - } + u3l_log("loch: %%born failure;"); + u3z(lud); + u3_ovum_free(egg_u); } /* _loch_io_talk(): notify %loch that we're live * pass it a list of device names @@ -122,7 +108,7 @@ _loch_io_talk(u3_auto* car_u) u3_noun wir = u3nt(c3__loch, u3_nul, u3_nul); - u3_noun cad = u3nc(c3__born, u3_nul); + u3_noun cad = u3nc(c3__born, teh_u->dev_u[0].nam_w); u3_auto_peer( u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), @@ -131,7 +117,7 @@ _loch_io_talk(u3_auto* car_u) _loch_born_bail); } -/* _behn_io_kick(): apply effects. +/* _loch_io_kick(): apply effects. */ static c3_o _loch_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) From 538f1047b4307b073b2060a6b4cb5538025c71c6 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Mon, 20 Feb 2023 14:42:24 -0500 Subject: [PATCH 04/33] added print out to kick --- pkg/c3/motes.h | 1 + pkg/vere/io/loch.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 5d495802ae..7b0f0cbe2d 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -309,6 +309,7 @@ # define c3__delc c3_s4('d','e','l','c') # define c3__delt c3_s4('d','e','l','t') # define c3__dept c3_s4('d','e','p','t') +# define c3__devs c3_s4('d','e','v','s') # define c3__dext c3_s4('d','e','x','t') # define c3__dgdp c3_s4('d','g','d','p') # define c3__dgkt c3_s4('d','g','k','t') diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index 0ecef31791..416e86d047 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -11,6 +11,7 @@ c3_c* fil_c; // file of device c3_w fid_w; // file descriptor c3_o opn_o; // is the file open + c3_w tus_w; // device status } u3_device; /* u3_loch: a list of devices @@ -78,6 +79,7 @@ _loch_ef_read(u3_loch* teh_u, u3_noun cmd) static void _loch_born_news(u3_ovum* egg_u, u3_ovum_news new_e) { + u3l_log("loch: %%born win;"); u3_auto* car_u = egg_u->car_u; if ( u3_ovum_done == new_e ) { @@ -101,20 +103,33 @@ _loch_born_bail(u3_ovum* egg_u, u3_noun lud) static void _loch_io_talk(u3_auto* car_u) { - u3_loch* teh_u = (u3_loch*)car_u; - - // the card should have a list of all devices - // one way is to ensure all devices are motes - u3_noun wir = u3nt(c3__loch, - u3_nul, - u3_nul); - u3_noun cad = u3nc(c3__born, teh_u->dev_u[0].nam_w); + u3_loch* loc_u = (u3_loch*)car_u; + u3_noun wir = u3nt(c3__loch, + u3dc("scot", c3__uv, 1), + u3_nul); + u3_noun cad = u3nc(c3__born, u3_nul); u3_auto_peer( u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), 0, _loch_born_news, _loch_born_bail); + // [1 %ovum [%l /test %devs [%i2c %.y]]]" + for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { + u3_noun wir = u3nt(c3__loch, + u3dc("scot", c3__uv, i+1), + u3_nul); + u3_noun cad = u3nc(c3__devs, + u3nc(loc_u->dev_u[i].nam_w, loc_u->dev_u[i].tus_w)); + u3_auto_peer( + u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, + _loch_born_news, + _loch_born_bail); + + } + + car_u->liv_o = c3y; } /* _loch_io_kick(): apply effects. @@ -135,6 +150,7 @@ _loch_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) ret_o = c3n; } else { + u3l_log("loch: %%kick win;~tiller-tolbus "); ret_o = c3y; _loch_ef_read(teh_u, u3k(dat)); // apply writ command } @@ -185,6 +201,7 @@ u3_loch_io_init(u3_pier* pir_u) fprintf(stderr, "Unable to open device file %s \n", teh_u->dev_u[i].fil_c); } else { teh_u->dev_u[i].opn_o = c3y; + teh_u->dev_u[i].tus_w = 0; } } From b1abe834a8f05dbbf997db81ffabdabf5340eb85 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Tue, 21 Feb 2023 16:44:33 -0500 Subject: [PATCH 05/33] modified workflow for read, red, and turn --- pkg/c3/motes.h | 5 +++ pkg/vere/io/loch.c | 79 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 7b0f0cbe2d..2167d653ed 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -220,6 +220,7 @@ # define c3__clsg c3_s4('c','l','s','g') # define c3__clsp c3_s4('c','l','s','p') # define c3__cltr c3_s4('c','l','t','r') +# define c3__cmd c3_s3('c','m','d') # define c3__cnbc c3_s4('c','n','b','c') # define c3__cnbr c3_s4('c','n','b','r') # define c3__cncb c3_s4('c','n','c','b') @@ -742,6 +743,7 @@ # define c3__meh c3_s3('m','e','h') # define c3__meld c3_s4('m','e','l','d') # define c3__melt c3_s4('m','e','l','t') +# define c3__mem c3_s3('m','e','m') # define c3__meme c3_s4('m','e','m','e') # define c3__memo c3_s4('m','e','m','o') # define c3__menu c3_s4('m','e','n','u') @@ -963,6 +965,7 @@ # define c3__ramp c3_s4('r','a','m','p') # define c3__rasp c3_s4('r','a','s','p') # define c3__raw c3_s3('r','a','w') +# define c3__red c3_s3('r','e','d') # define c3__read c3_s4('r','e','a','d') # define c3__reck c3_s4('r','e','c','k') # define c3__reef c3_s4('r','e','e','f') @@ -1289,6 +1292,8 @@ # define c3__work c3_s4('w','o','r','k') # define c3__wost c3_s4('w','o','s','t') # define c3__wrap c3_s4('w','r','a','p') +# define c3__writ c3_s4('w','r','i','t') +# define c3__wrot c3_s4('w','r','o','t') # define c3__wtbr c3_s4('w','t','b','r') # define c3__wtcb c3_s4('w','t','c','b') # define c3__wtcl c3_s4('w','t','c','l') diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index 416e86d047..72d150a8f3 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -51,27 +51,37 @@ _loch_read_bail(u3_ovum* egg_u, u3_noun lud) /* u3_loch_ef_read(): read from device */ static void -_loch_ef_read(u3_loch* teh_u, u3_noun cmd) +_loch_ef_read(u3_loch* teh_u, u3_noun wir_i, u3_device dev_d, u3_noun wut, u3_noun cmd) { if ( c3n == teh_u->car_u.liv_o ) { teh_u->car_u.liv_o = c3y; } + c3_y* buf_y = malloc(cmd*sizeof(c3_y)); + u3l_log("loch cmd: %d", cmd); + u3l_log("loch fid: %d", dev_d.fid_w); + + read(dev_d.fid_w, buf_y, cmd); + + u3_noun red = u3i_bytes(cmd, buf_y); + u3l_log("red: %llu", red); // extract read count and device from cmd noun // preform read on device and store in c3_y* // turn that c3_y* into some u3_noun // send read event with u3_noun to arvo - // + //[%turn =dev =act dat=@ud] + { - u3_noun wir = u3nc(c3__behn, u3_nul); - u3_noun cad = u3nc(c3__wake, u3_nul); + u3_noun wir = u3nc(c3__loch, u3_nul); + u3_noun dat = u3nt(dev_d.nam_w, c3__read, red); + u3_noun cad = u3nc(c3__turn, dat); u3_auto_peer( - u3_auto_plan(&teh_u->car_u, u3_ovum_init(0, c3__b, wir, cad)), + u3_auto_plan(&teh_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), 0, 0, _loch_read_bail); } - u3z(cmd); + //u3z(cmd); } /* _loch_born_news(): initialization complete on %born. @@ -104,9 +114,7 @@ static void _loch_io_talk(u3_auto* car_u) { u3_loch* loc_u = (u3_loch*)car_u; - u3_noun wir = u3nt(c3__loch, - u3dc("scot", c3__uv, 1), - u3_nul); + u3_noun wir = u3nc(c3__loch, u3_nul); u3_noun cad = u3nc(c3__born, u3_nul); u3_auto_peer( @@ -139,20 +147,50 @@ _loch_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) { u3_loch* teh_u = (u3_loch*)car_u; - u3_noun tag, dat, i_wir; - c3_o ret_o; + u3_noun tag, i_wir, par; + u3_noun wut, dev, cmd, dat, tmp; + u3_device* dev_d; + c3_o ret_o, dev_o; if ( (c3n == u3r_cell(wir, &i_wir, 0)) - || (c3n == u3r_cell(cad, &tag, &dat)) - || (c3__loch != i_wir) - || (c3__read != tag) ) + || (c3n == u3r_cell(cad, &tag, &par)) + || (c3__loch != i_wir) ) { ret_o = c3n; } else { - u3l_log("loch: %%kick win;~tiller-tolbus "); - ret_o = c3y; - _loch_ef_read(teh_u, u3k(dat)); // apply writ command + if ( (c3n == u3r_cell(par, &wut, &tmp)) + || (c3n == u3r_cell(tmp, &dev, &cmd))) + { + ret_o = c3n; + } + else { + //See if the device is present and open + dev_o = c3n; + for( c3_w i = 0; i< teh_u->cnt_w; i++ ) { + if( (dev == teh_u->dev_u[i].nam_w) + && (c3y == teh_u->dev_u[i].opn_o)) { + u3l_log("loch dev found"); + dev_o = c3y; + dev_d = &teh_u->dev_u[i]; + } + } + if (c3y == dev_o) { + if ( (c3__read == tag) ) + { + u3l_log("loch read"); + _loch_ef_read(teh_u, wir, *dev_d, wut, cmd); // execute read command + ret_o = c3y; + } + else if ( c3__writ == tag ) + { + u3l_log("loch: writ "); + } + } + else { + ret_o = c3n; + } + } } u3z(wir); u3z(cad); @@ -171,8 +209,9 @@ _loch_io_exit(u3_auto* car_u) if( c3y == teh_u->dev_u[i].opn_o ) { close(teh_u->dev_u[i].fid_w); } - c3_free(&teh_u->dev_u[i]); + //c3_free(&teh_u->dev_u[i]); } + //c3_free(&teh_u->dev_u); c3_free(teh_u); } @@ -188,7 +227,7 @@ u3_loch_io_init(u3_pier* pir_u) u3_device* random = c3_calloc(sizeof(teh_u)); random->nam_w = c3_s4('r','a','n','d'); - random->fil_c = "/dev/random"; + random->fil_c = "/dev/urandom"; teh_u->cnt_w = 1; teh_u->dev_u = c3_calloc(teh_u->cnt_w*sizeof(teh_u)); @@ -198,7 +237,7 @@ u3_loch_io_init(u3_pier* pir_u) for( c3_w i = 0; i< teh_u->cnt_w; i++ ) { teh_u->dev_u[i].fid_w = open(teh_u->dev_u[i].fil_c, O_RDWR); if ( teh_u->dev_u[i].fid_w < 0 ) { //If any error report it and keep device marked as close - fprintf(stderr, "Unable to open device file %s \n", teh_u->dev_u[i].fil_c); + u3l_log("Unable to open device file %s \n", teh_u->dev_u[i].fil_c); } else { teh_u->dev_u[i].opn_o = c3y; teh_u->dev_u[i].tus_w = 0; From 1440c20414b4fb94feec2ae4e9fddc0fe6fb181e Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 23 Feb 2023 17:17:38 -0500 Subject: [PATCH 06/33] cleaned up interface --- pkg/c3/motes.h | 4 +--- pkg/vere/io/loch.c | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 2167d653ed..66e542af92 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -965,7 +965,6 @@ # define c3__ramp c3_s4('r','a','m','p') # define c3__rasp c3_s4('r','a','s','p') # define c3__raw c3_s3('r','a','w') -# define c3__red c3_s3('r','e','d') # define c3__read c3_s4('r','e','a','d') # define c3__reck c3_s4('r','e','c','k') # define c3__reef c3_s4('r','e','e','f') @@ -1004,6 +1003,7 @@ # define c3__see c3_s3('s','e','e') # define c3__seed c3_s4('s','e','e','d') # define c3__seek c3_s4('s','e','e','k') +# define c3__seen c3_s4('s','e','e','n') # define c3__seft c3_s4('s','e','f','t') # define c3__sell c3_s4('s','e','l','l') # define c3__semp c3_s4('s','e','m','p') @@ -1215,7 +1215,6 @@ # define c3__tupl c3_s4('t','u','p','l') # define c3__turd c3_s4('t','u','r','d') # define c3__turf c3_s4('t','u','r','f') -# define c3__turn c3_s4('t','u','r','n') # define c3__twig c3_s4('t','w','i','g') # define c3__twix c3_s4('t','w','i','x') # define c3__txt c3_s3('t','x','t') @@ -1293,7 +1292,6 @@ # define c3__wost c3_s4('w','o','s','t') # define c3__wrap c3_s4('w','r','a','p') # define c3__writ c3_s4('w','r','i','t') -# define c3__wrot c3_s4('w','r','o','t') # define c3__wtbr c3_s4('w','t','b','r') # define c3__wtcb c3_s4('w','t','c','b') # define c3__wtcl c3_s4('w','t','c','l') diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index 72d150a8f3..d9840ab4b2 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -73,8 +73,8 @@ _loch_ef_read(u3_loch* teh_u, u3_noun wir_i, u3_device dev_d, u3_noun wut, u3_no { u3_noun wir = u3nc(c3__loch, u3_nul); - u3_noun dat = u3nt(dev_d.nam_w, c3__read, red); - u3_noun cad = u3nc(c3__turn, dat); + u3_noun dat = u3nc(dev_d.nam_w, red); + u3_noun cad = u3nc(c3__seen, dat); u3_auto_peer( u3_auto_plan(&teh_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), @@ -224,7 +224,7 @@ u3_loch_io_init(u3_pier* pir_u) // TODO: Open all devices specified in pier. // Right now this only opens /dev/random and will provide a random number - u3_device* random = c3_calloc(sizeof(teh_u)); + u3_device* random = c3_calloc(sizeof(random)); random->nam_w = c3_s4('r','a','n','d'); random->fil_c = "/dev/urandom"; From eccea2be2f21f759438cdc0ecb72a3b3cb3c1196 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Fri, 24 Feb 2023 15:27:48 -0500 Subject: [PATCH 07/33] got read rite working. expanded api --- pkg/c3/motes.h | 1 + pkg/vere/io/loch.c | 264 +++++++++++++++++++++++++++++---------------- 2 files changed, 172 insertions(+), 93 deletions(-) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 66e542af92..8c836ffe77 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -983,6 +983,7 @@ # define c3__rond c3_s4('r','o','n','d') # define c3__root c3_s4('r','o','o','t') # define c3__rose c3_s4('r','o','s','e') +# define c3__rote c3_s4('r','o','t','e') # define c3__rsh c3_s3('r','s','h') # define c3__rulf c3_s4('r','u','l','f') # define c3__run c3_s3('r','u','n') diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index d9840ab4b2..dc62354567 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -9,7 +9,7 @@ typedef struct _u3_device { c3_w nam_w; // %name of device c3_c* fil_c; // file of device - c3_w fid_w; // file descriptor + c3_ws fid_w; // file descriptor c3_o opn_o; // is the file open c3_w tus_w; // device status } u3_device; @@ -19,7 +19,7 @@ typedef struct _u3_loch { u3_auto car_u; // driver c3_w cnt_w; // count of devices - u3_device* dev_u; // list of devices + struct _u3_device* dev_u; // list of devices } u3_loch; // XX review, move @@ -40,6 +40,61 @@ _behn_bail_dire(u3_noun lud) return c3y; } +/* _lock_rite_bail(): figure out why loch failed to read and return error code +*/ +static void +_loch_rite_bail(u3_ovum* egg_u, u3_noun lud) +{ + u3l_log("loch: rite failed"); +} + +/* u3_loch_ef_rite(): read from device +*/ +static void +_loch_ef_rite(u3_loch* loc_u, u3_noun wir_i, + u3_device* dev_d, u3_noun wut, u3_noun cmd, u3_noun dat, u3_noun cnt) +{ + if ( c3n == loc_u->car_u.liv_o ) { + loc_u->car_u.liv_o = c3y; + } + c3_y* buf_y = malloc(cmd*sizeof(c3_y)); + u3r_bytes(0, cnt, buf_y, dat); + + c3_w wit; + u3l_log("loch cnt: %d", cnt); + u3l_log("loch dat: %d", dat); + u3l_log("loch fid from dev_d: %d", dev_d->fid_w); + + if( c3__mem == wut ) + { + wit = write(dev_d->fid_w, buf_y, cnt); + } else { + wit = ioctl(dev_d->fid_w, cmd, buf_y); + } + if(-1 == wit) { + wit = errno; + perror("Error printed by perror"); + } else { wit = 0; } + + u3_noun tus = u3i_word(wit); + u3l_log("tus: %d", wit); + // extract read count and device from cmd noun + // preform read on device and store in c3_y* + // turn that c3_y* into some u3_noun + // send read event with u3_noun to arvo + //[%turn =dev =act dat=@ud] + //[%rite =param dat=@] + { + u3_noun wir = u3nc(c3__loch, u3_nul); + u3_noun dat = u3nc(dev_d->nam_w, tus); + u3_noun cad = u3nc(c3__rote, dat); + + u3_auto_peer( + u3_auto_plan(&loc_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, 0, _loch_rite_bail); + } +} + /* _lock_read_bail(): figure out why loch failed to read and return error code */ static void @@ -51,37 +106,113 @@ _loch_read_bail(u3_ovum* egg_u, u3_noun lud) /* u3_loch_ef_read(): read from device */ static void -_loch_ef_read(u3_loch* teh_u, u3_noun wir_i, u3_device dev_d, u3_noun wut, u3_noun cmd) +_loch_ef_read(u3_loch* loc_u, u3_noun wir_i, + u3_device* dev_d, u3_noun wut, u3_noun cmd, u3_noun cnt) { - if ( c3n == teh_u->car_u.liv_o ) { - teh_u->car_u.liv_o = c3y; + if ( c3n == loc_u->car_u.liv_o ) { + loc_u->car_u.liv_o = c3y; } c3_y* buf_y = malloc(cmd*sizeof(c3_y)); - u3l_log("loch cmd: %d", cmd); - u3l_log("loch fid: %d", dev_d.fid_w); - - read(dev_d.fid_w, buf_y, cmd); + u3l_log("loch fid from dev_d: %d", dev_d->fid_w); + c3_w wit; + if( c3__mem == wut ) + { + wit = read(dev_d->fid_w, buf_y, cnt); + } else { + wit = ioctl(dev_d->fid_w, u3r_word(0, cmd) , buf_y); + } + if(-1 == wit) { + wit = errno; + perror("Error printed by perror"); + } else { wit = 0; } - u3_noun red = u3i_bytes(cmd, buf_y); - u3l_log("red: %llu", red); + + u3_noun tus = u3i_word(wit); + u3_noun red = u3i_bytes(cnt, buf_y); // extract read count and device from cmd noun // preform read on device and store in c3_y* // turn that c3_y* into some u3_noun // send read event with u3_noun to arvo - //[%turn =dev =act dat=@ud] + //[%turn =dev dat=@ud tus] { u3_noun wir = u3nc(c3__loch, u3_nul); - u3_noun dat = u3nc(dev_d.nam_w, red); + u3_noun dat = u3nt(dev_d->nam_w, red, tus); u3_noun cad = u3nc(c3__seen, dat); u3_auto_peer( - u3_auto_plan(&teh_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), + u3_auto_plan(&loc_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), 0, 0, _loch_read_bail); } - //u3z(cmd); + //u3z(cmd); u3z(wut); u3z(cnt); u3z(wir_i); +} + +/* _loch_io_kick(): apply effects. +*/ +static c3_o +_loch_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) +{ + u3_loch* loc_u = (u3_loch*)car_u; + + u3_noun tag, i_wir, par; + u3_noun wut, dev, cmd, dat, cnt, tmp; + u3_device* dev_d; + c3_o ret_o, dev_o; + + if ( (c3n == u3r_cell(wir, &i_wir, 0)) + || (c3n == u3r_cell(cad, &tag, &par)) + || (c3__loch != i_wir) ) + { + return c3n; + } + else { + if (c3n == u3r_cell(par, &dev, &tmp)) // if I cant split it up error + { + ret_o = c3n; + } + else { + //See if the device is present and open + dev_o = c3n; + for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { + if((dev == loc_u->dev_u[i].nam_w)){ + u3l_log("loch dev found"); + dev_o = c3y; + dev_d = &loc_u->dev_u[i]; + } + } + if (c3y == dev_o) { + if ( (c3__read == tag) ) + { + u3l_log("loch read"); + if( c3y == u3r_trel(tmp, &wut, &cmd, &cnt) ) + { + _loch_ef_read(loc_u, wir, dev_d, wut, cmd, cnt); // execute read command + ret_o = c3y; + } else { ret_o = c3n; } + } else if ( c3__rite == tag ) + { + u3l_log("loch: rite "); + if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) + { + _loch_ef_rite(loc_u, wir, dev_d, wut, cmd, dat, cnt); // execute write command + ret_o = c3y; + } else { ret_o = c3n; } + } + else { + ret_o = c3n; + } + } + else { + u3l_log("loch dev not found"); + ret_o = c3n; + } + } + } + + u3z(wir); u3z(cad); + return ret_o; } /* _loch_born_news(): initialization complete on %born. @@ -89,7 +220,6 @@ _loch_ef_read(u3_loch* teh_u, u3_noun wir_i, u3_device dev_d, u3_noun wut, u3_no static void _loch_born_news(u3_ovum* egg_u, u3_ovum_news new_e) { - u3l_log("loch: %%born win;"); u3_auto* car_u = egg_u->car_u; if ( u3_ovum_done == new_e ) { @@ -107,6 +237,7 @@ _loch_born_bail(u3_ovum* egg_u, u3_noun lud) u3z(lud); u3_ovum_free(egg_u); } + /* _loch_io_talk(): notify %loch that we're live * pass it a list of device names */ @@ -114,6 +245,7 @@ static void _loch_io_talk(u3_auto* car_u) { u3_loch* loc_u = (u3_loch*)car_u; + u3l_log("loch born loc: %d", loc_u->dev_u[0].fid_w); u3_noun wir = u3nc(c3__loch, u3_nul); u3_noun cad = u3nc(c3__born, u3_nul); @@ -124,6 +256,7 @@ _loch_io_talk(u3_auto* car_u) _loch_born_bail); // [1 %ovum [%l /test %devs [%i2c %.y]]]" for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { + u3l_log("loch: found %s as fid %d", loc_u->dev_u[i].fil_c, loc_u->dev_u[i].fid_w); u3_noun wir = u3nt(c3__loch, u3dc("scot", c3__uv, i+1), u3_nul); @@ -140,79 +273,21 @@ _loch_io_talk(u3_auto* car_u) car_u->liv_o = c3y; } -/* _loch_io_kick(): apply effects. -*/ -static c3_o -_loch_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) -{ - u3_loch* teh_u = (u3_loch*)car_u; - - u3_noun tag, i_wir, par; - u3_noun wut, dev, cmd, dat, tmp; - u3_device* dev_d; - c3_o ret_o, dev_o; - - if ( (c3n == u3r_cell(wir, &i_wir, 0)) - || (c3n == u3r_cell(cad, &tag, &par)) - || (c3__loch != i_wir) ) - { - ret_o = c3n; - } - else { - if ( (c3n == u3r_cell(par, &wut, &tmp)) - || (c3n == u3r_cell(tmp, &dev, &cmd))) - { - ret_o = c3n; - } - else { - //See if the device is present and open - dev_o = c3n; - for( c3_w i = 0; i< teh_u->cnt_w; i++ ) { - if( (dev == teh_u->dev_u[i].nam_w) - && (c3y == teh_u->dev_u[i].opn_o)) { - u3l_log("loch dev found"); - dev_o = c3y; - dev_d = &teh_u->dev_u[i]; - } - } - if (c3y == dev_o) { - if ( (c3__read == tag) ) - { - u3l_log("loch read"); - _loch_ef_read(teh_u, wir, *dev_d, wut, cmd); // execute read command - ret_o = c3y; - } - else if ( c3__writ == tag ) - { - u3l_log("loch: writ "); - } - } - else { - ret_o = c3n; - } - } - } - - u3z(wir); u3z(cad); - return ret_o; -} - - /* _loch_io_exit(): close all open device files and exit */ static void _loch_io_exit(u3_auto* car_u) { - u3_loch* teh_u = (u3_loch*)car_u; + u3_loch* loc_u = (u3_loch*)car_u; - for( c3_w i = 0; i< teh_u->cnt_w; i++ ) { - if( c3y == teh_u->dev_u[i].opn_o ) { - close(teh_u->dev_u[i].fid_w); + for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { + if( c3y == loc_u->dev_u[i].opn_o ) { + close(loc_u->dev_u[i].fid_w); } - //c3_free(&teh_u->dev_u[i]); + //c3_free(&loc_u->dev_u[i]); } - //c3_free(&teh_u->dev_u); - c3_free(teh_u); + //c3_free(&loc_u->dev_u); + c3_free(loc_u); } /* u3_loch(): initialize hardware control vane. @@ -220,31 +295,34 @@ _loch_io_exit(u3_auto* car_u) u3_auto* u3_loch_io_init(u3_pier* pir_u) { - u3_loch* teh_u = c3_calloc(sizeof(*teh_u)); + u3_loch* loc_u = c3_calloc(sizeof(*loc_u)); // TODO: Open all devices specified in pier. // Right now this only opens /dev/random and will provide a random number - u3_device* random = c3_calloc(sizeof(random)); + u3_device* random = c3_calloc(sizeof(*random)); random->nam_w = c3_s4('r','a','n','d'); random->fil_c = "/dev/urandom"; - teh_u->cnt_w = 1; - teh_u->dev_u = c3_calloc(teh_u->cnt_w*sizeof(teh_u)); - teh_u->dev_u[0] = *random; + loc_u->cnt_w = 1; + loc_u->dev_u = c3_calloc(loc_u->cnt_w*sizeof(loc_u)); + loc_u->dev_u[0] = *random; // Open all devices - for( c3_w i = 0; i< teh_u->cnt_w; i++ ) { - teh_u->dev_u[i].fid_w = open(teh_u->dev_u[i].fil_c, O_RDWR); - if ( teh_u->dev_u[i].fid_w < 0 ) { //If any error report it and keep device marked as close - u3l_log("Unable to open device file %s \n", teh_u->dev_u[i].fil_c); + for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { + loc_u->dev_u[i].fid_w = open(loc_u->dev_u[i].fil_c, O_RDWR); + if ( loc_u->dev_u[i].fid_w < 0 ) { //If any error report it and keep device marked as close + u3l_log("loch: unable to open %s", loc_u->dev_u[i].fil_c); + perror("open"); } else { - teh_u->dev_u[i].opn_o = c3y; - teh_u->dev_u[i].tus_w = 0; + u3l_log("loch: opened %s as fid %d", loc_u->dev_u[i].fil_c, loc_u->dev_u[i].fid_w); + loc_u->dev_u[i].opn_o = c3y; + loc_u->dev_u[i].tus_w = 0; } } - u3_auto* car_u = &teh_u->car_u; + u3l_log("init data loc %d:", &loc_u->car_u); + u3_auto* car_u = &loc_u->car_u; car_u->nam_m = c3__loch; car_u->liv_o = c3n; From 3755c7198e6307d44983e999661d6fc9c2774cad Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Tue, 21 Mar 2023 15:58:14 -0400 Subject: [PATCH 08/33] latest loch update --- pkg/vere/io/loch.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index dc62354567..345697db47 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -62,12 +62,13 @@ _loch_ef_rite(u3_loch* loc_u, u3_noun wir_i, c3_w wit; u3l_log("loch cnt: %d", cnt); - u3l_log("loch dat: %d", dat); + u3l_log("loch dat: %llu", dat); u3l_log("loch fid from dev_d: %d", dev_d->fid_w); if( c3__mem == wut ) { wit = write(dev_d->fid_w, buf_y, cnt); + u3l_log("loch wit: %d", wit); } else { wit = ioctl(dev_d->fid_w, cmd, buf_y); } @@ -112,7 +113,7 @@ _loch_ef_read(u3_loch* loc_u, u3_noun wir_i, if ( c3n == loc_u->car_u.liv_o ) { loc_u->car_u.liv_o = c3y; } - c3_y* buf_y = malloc(cmd*sizeof(c3_y)); + c3_y* buf_y = c3_malloc(cmd*sizeof(c3_y)); u3l_log("loch fid from dev_d: %d", dev_d->fid_w); c3_w wit; @@ -130,6 +131,7 @@ _loch_ef_read(u3_loch* loc_u, u3_noun wir_i, u3_noun tus = u3i_word(wit); u3_noun red = u3i_bytes(cnt, buf_y); + u3l_log("loch from bytes"); // extract read count and device from cmd noun // preform read on device and store in c3_y* // turn that c3_y* into some u3_noun @@ -146,6 +148,7 @@ _loch_ef_read(u3_loch* loc_u, u3_noun wir_i, 0, 0, _loch_read_bail); } + //u3z(tus); u3z(red); //u3z(cmd); u3z(wut); u3z(cnt); u3z(wir_i); } @@ -284,10 +287,7 @@ _loch_io_exit(u3_auto* car_u) if( c3y == loc_u->dev_u[i].opn_o ) { close(loc_u->dev_u[i].fid_w); } - //c3_free(&loc_u->dev_u[i]); } - //c3_free(&loc_u->dev_u); - c3_free(loc_u); } /* u3_loch(): initialize hardware control vane. @@ -300,17 +300,22 @@ u3_loch_io_init(u3_pier* pir_u) // TODO: Open all devices specified in pier. // Right now this only opens /dev/random and will provide a random number u3_device* random = c3_calloc(sizeof(*random)); + u3_device* serial = c3_calloc(sizeof(*serial)); random->nam_w = c3_s4('r','a','n','d'); random->fil_c = "/dev/urandom"; - loc_u->cnt_w = 1; + serial->nam_w = c3_s4('u','a','r','t'); + serial->fil_c = "/dev/ttyUSB0"; + + loc_u->cnt_w = 2; loc_u->dev_u = c3_calloc(loc_u->cnt_w*sizeof(loc_u)); loc_u->dev_u[0] = *random; + loc_u->dev_u[1] = *serial; // Open all devices for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { - loc_u->dev_u[i].fid_w = open(loc_u->dev_u[i].fil_c, O_RDWR); + loc_u->dev_u[i].fid_w = open(loc_u->dev_u[i].fil_c, O_RDWR|O_NOCTTY|O_NDELAY); if ( loc_u->dev_u[i].fid_w < 0 ) { //If any error report it and keep device marked as close u3l_log("loch: unable to open %s", loc_u->dev_u[i].fil_c); perror("open"); From 8aa83105a36fa425c8b8207661267c2a6ce72d62 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 23 Mar 2023 12:02:27 -0400 Subject: [PATCH 09/33] fixed allocation bug --- pkg/vere/io/loch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index 345697db47..0bdd1a2e99 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -57,7 +57,7 @@ _loch_ef_rite(u3_loch* loc_u, u3_noun wir_i, if ( c3n == loc_u->car_u.liv_o ) { loc_u->car_u.liv_o = c3y; } - c3_y* buf_y = malloc(cmd*sizeof(c3_y)); + c3_y* buf_y = c3_malloc(cnt*sizeof(c3_y)); u3r_bytes(0, cnt, buf_y, dat); c3_w wit; @@ -113,7 +113,7 @@ _loch_ef_read(u3_loch* loc_u, u3_noun wir_i, if ( c3n == loc_u->car_u.liv_o ) { loc_u->car_u.liv_o = c3y; } - c3_y* buf_y = c3_malloc(cmd*sizeof(c3_y)); + c3_y* buf_y = c3_malloc(cnt*sizeof(c3_y)); u3l_log("loch fid from dev_d: %d", dev_d->fid_w); c3_w wit; From 0a9d1bc2790fbaa4c3ebb42fb9ecec2aa6020f0c Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Fri, 24 Mar 2023 11:18:25 -0400 Subject: [PATCH 10/33] cleaned up some comments --- pkg/vere/io/loch.c | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c index 0bdd1a2e99..a3c2047138 100644 --- a/pkg/vere/io/loch.c +++ b/pkg/vere/io/loch.c @@ -22,24 +22,6 @@ struct _u3_device* dev_u; // list of devices } u3_loch; -// XX review, move -// -/* _behn_bail_dire(): c3y if fatal error. RETAIN -*/ -static c3_o -_behn_bail_dire(u3_noun lud) -{ - u3_noun mot = u3r_at(4, lud); - - if ( (c3__meme == mot) - || (c3__intr == mot) ) - { - return c3n; - } - - return c3y; -} - /* _lock_rite_bail(): figure out why loch failed to read and return error code */ static void @@ -79,12 +61,6 @@ _loch_ef_rite(u3_loch* loc_u, u3_noun wir_i, u3_noun tus = u3i_word(wit); u3l_log("tus: %d", wit); - // extract read count and device from cmd noun - // preform read on device and store in c3_y* - // turn that c3_y* into some u3_noun - // send read event with u3_noun to arvo - //[%turn =dev =act dat=@ud] - //[%rite =param dat=@] { u3_noun wir = u3nc(c3__loch, u3_nul); u3_noun dat = u3nc(dev_d->nam_w, tus); @@ -132,11 +108,6 @@ _loch_ef_read(u3_loch* loc_u, u3_noun wir_i, u3_noun tus = u3i_word(wit); u3_noun red = u3i_bytes(cnt, buf_y); u3l_log("loch from bytes"); - // extract read count and device from cmd noun - // preform read on device and store in c3_y* - // turn that c3_y* into some u3_noun - // send read event with u3_noun to arvo - //[%turn =dev dat=@ud tus] { u3_noun wir = u3nc(c3__loch, u3_nul); @@ -147,9 +118,6 @@ _loch_ef_read(u3_loch* loc_u, u3_noun wir_i, u3_auto_plan(&loc_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), 0, 0, _loch_read_bail); } - - //u3z(tus); u3z(red); - //u3z(cmd); u3z(wut); u3z(cnt); u3z(wir_i); } /* _loch_io_kick(): apply effects. @@ -257,7 +225,8 @@ _loch_io_talk(u3_auto* car_u) 0, _loch_born_news, _loch_born_bail); - // [1 %ovum [%l /test %devs [%i2c %.y]]]" + + //For every device send a %devs card for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { u3l_log("loch: found %s as fid %d", loc_u->dev_u[i].fil_c, loc_u->dev_u[i].fid_w); u3_noun wir = u3nt(c3__loch, From cb20f2fb2ba11aa11499a1a0b2c8d9bce8d8c5a0 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 13 Apr 2023 14:10:55 -0400 Subject: [PATCH 11/33] switch to lick --- pkg/c3/motes.h | 3 +- pkg/vere/auto.c | 2 +- pkg/vere/io/lick.c | 355 +++++++++++++++++++++++++++++++++++++++++++++ pkg/vere/io/loch.c | 308 --------------------------------------- pkg/vere/vere.h | 6 +- 5 files changed, 360 insertions(+), 314 deletions(-) create mode 100644 pkg/vere/io/lick.c delete mode 100644 pkg/vere/io/loch.c diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 6037789126..9caed0a84e 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -311,7 +311,6 @@ # define c3__delc c3_s4('d','e','l','c') # define c3__delt c3_s4('d','e','l','t') # define c3__dept c3_s4('d','e','p','t') -# define c3__devs c3_s4('d','e','v','s') # define c3__dext c3_s4('d','e','x','t') # define c3__dgdp c3_s4('d','g','d','p') # define c3__dgkt c3_s4('d','g','k','t') @@ -687,6 +686,7 @@ # define c3__lg c3_s2('l','g') # define c3__lib c3_s3('l','i','b') # define c3__libd c3_s4('l','i','b','d') +# define c3__lick c3_s4('l','i','c','k') # define c3__life c3_s4('l','i','f','e') # define c3__lift c3_s4('l','i','f','t') # define c3__like c3_s4('l','i','k','e') @@ -702,7 +702,6 @@ # define c3__live c3_s4('l','i','v','e') # define c3__load c3_s4('l','o','a','d') # define c3__loaf c3_s4('l','o','a','f') -# define c3__loch c3_s4('l','o','c','h') # define c3__log c3_s3('l','o','g') # define c3__logo c3_s4('l','o','g','o') # define c3__lome c3_s4('l','o','m','e') diff --git a/pkg/vere/auto.c b/pkg/vere/auto.c index acd20d2144..d29c73a87e 100644 --- a/pkg/vere/auto.c +++ b/pkg/vere/auto.c @@ -438,7 +438,7 @@ u3_auto_init(u3_pier* pir_u) car_u = _auto_link(u3_unix_io_init(pir_u), pir_u, car_u); car_u = _auto_link(u3_term_io_init(pir_u), pir_u, car_u); car_u = _auto_link(u3_fore_io_init(pir_u), pir_u, car_u); - car_u = _auto_link(u3_loch_io_init(pir_u), pir_u, car_u); + car_u = _auto_link(u3_lick_io_init(pir_u), pir_u, car_u); return car_u; } diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c new file mode 100644 index 0000000000..05c2e4fd73 --- /dev/null +++ b/pkg/vere/io/lick.c @@ -0,0 +1,355 @@ +/// @file + +#include "vere.h" +#include +#include +#include "noun.h" + +/* u3_device: description of a device + */ + typedef struct _u3_agent { + c3_c* nam_c; // name of device + c3_c* ver_c; // name of device + uv_pipe_t pyp_u; // stream handler + struct _u3_agent* nex_u; // next pointer + } u3_agent; + +/* u3_lick: a list of devices +*/ + typedef struct _u3_lick { + u3_auto car_u; // driver + c3_c* fod_c; // IPC folder location + u3_cue_xeno* sil_u; // cue handle + u3_agent* gen_u; // agent list + } u3_lick; + +static const c3_c URB_DEV_PATH[] = "/.urb/dev/"; + +/* _lick_close_cb(): socket close callback. +*/ +static void +_lick_close_cb(uv_handle_t* had_u) +{ + c3_free(had_u); +} + + +/* _lick_sock_cb(): socket connection callback. +*/ +static void +_lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) +{ +/* u3_shan* san_u = (u3_shan*)sem_u; + u3_lick* con_u = san_u->con_u; + u3_chan* can_u; + c3_i err_i; + + can_u = c3_calloc(sizeof(u3_chan)); + can_u->mor_u.ptr_v = can_u; + can_u->mor_u.pok_f = _lick_moor_poke; + can_u->mor_u.bal_f = _lick_moor_bail; + can_u->coq_l = san_u->nex_l++; + can_u->san_u = san_u; + err_i = uv_timer_init(u3L, &can_u->mor_u.tim_u); + c3_assert(!err_i); + err_i = uv_pipe_init(u3L, &can_u->mor_u.pyp_u, 0); + c3_assert(!err_i); + err_i = uv_accept(sem_u, (uv_stream_t*)&can_u->mor_u.pyp_u); + c3_assert(!err_i); + u3_newt_read((u3_moat*)&can_u->mor_u); + can_u->mor_u.nex_u = (u3_moor*)san_u->can_u; + san_u->can_u = can_u; + */ +} + +/* _lick_close_sock(): close an agent's socket +*/ +static void +_lick_close_sock(u3_agent* gen_u) +{ + c3_c* pax_c = u3_Host.dir_c; + c3_w len_w = strlen(pax_c) + 2 + sizeof(URB_DEV_PATH) + strlen(gen_u->nam_c); + c3_c* paf_c = c3_malloc(len_w); + c3_i wit_i; + wit_i = snprintf(paf_c, len_w, "%s/%s/%s", pax_c, URB_DEV_PATH, gen_u->nam_c); + + u3l_log("lick: closing %s/%s/%s",pax_c, URB_DEV_PATH, gen_u->nam_c); + + c3_assert(wit_i > 0); + c3_assert(len_w == (c3_w)wit_i + 1); + + if ( 0 != unlink(paf_c) ) { + if ( ENOENT != errno ) { + u3l_log("lick: failed to unlink socket: %s", uv_strerror(errno)); + } + } + else { + // u3l_log("lick: unlinked %s", paf_c); + } + uv_close((uv_handle_t*)&gen_u->pyp_u, _lick_close_cb); + c3_free(paf_c); +} + + +/* _lick_init_sock(): initialize socket device. +*/ +static void +_lick_init_sock(u3_agent* gen_u) +{ + + // the full socket path is limited to about 108 characters, + // and we want it to be relative to the pier. save our current + // path, chdir to the pier, open the socket at the desired + // path, then chdir back. hopefully there aren't any threads. + // + c3_c pax_c[2048]; + c3_i err_i; + c3_c por_c[2048] = "."; + + if ( NULL == getcwd(pax_c, sizeof(pax_c)) ) { + u3l_log("lick: getcwd: %s", uv_strerror(errno)); + u3_king_bail(); + } + if ( 0 != chdir(u3_Host.dir_c) ) { + u3l_log("lick: chdir: %s", uv_strerror(errno)); + u3_king_bail(); + } + + strcat(por_c, URB_DEV_PATH); + strcat(por_c, gen_u->nam_c); + + if ( 0 != unlink(gen_u->nam_c) && errno != ENOENT ) { + u3l_log("lick: unlink: %s", uv_strerror(errno)); + goto _lick_sock_err_chdir; + } + if ( 0 != (err_i = uv_pipe_init(u3L, &gen_u->pyp_u, 0)) ) { + u3l_log("lick: uv_pipe_init: %s", uv_strerror(err_i)); + goto _lick_sock_err_chdir; + } + + if ( 0 != (err_i = uv_pipe_bind(&gen_u->pyp_u, por_c)) ) { + u3l_log("lick: uv_pipe_bind: %s", uv_strerror(err_i)); + u3l_log("lick: uv_pipe_bind: %s", por_c); + goto _lick_sock_err_chdir; + } + if ( 0 != (err_i = uv_listen((uv_stream_t*)&gen_u->pyp_u, 0, + _lick_sock_cb)) ) { + u3l_log("lick: uv_listen: %s", uv_strerror(err_i)); + goto _lick_sock_err_unlink; + } + if ( 0 != chdir(pax_c) ) { + u3l_log("lick: chdir: %s", uv_strerror(errno)); + goto _lick_sock_err_close; + } + u3l_log("lick: listening on %s/%s", u3_Host.dir_c, por_c); + return; + +_lick_sock_err_close: + uv_close((uv_handle_t*)&gen_u->pyp_u, _lick_close_cb); +_lick_sock_err_unlink: + if ( 0 != unlink(gen_u->nam_c) ) { + u3l_log("lick: unlink: %s", uv_strerror(errno)); + } +_lick_sock_err_chdir: + if ( 0 != chdir(pax_c) ) { + u3l_log("lick: chdir: %s", uv_strerror(errno)); + } + u3_king_bail(); +} + + +/* u3_lick_ef_book(): Open an IPC port +*/ +static void +_lick_ef_book(u3_lick* lic_u, u3_noun wir_i, + u3_noun nam, u3_noun ver) +{ + + u3l_log("lick book: %s %s", u3r_string(nam), u3r_string(ver)); + + u3_agent* gen_u = c3_calloc(sizeof(*gen_u)); + gen_u->nam_c = u3r_string(nam); + gen_u->ver_c = u3r_string(ver); + + u3_agent* hed_u = lic_u->gen_u; + + if( NULL == lic_u->gen_u ) + { + _lick_init_sock(gen_u); + lic_u->gen_u = gen_u; + } + else + { + u3_agent* las_u = lic_u->gen_u; + + while ( NULL != las_u->nex_u ) + { + if( 0 == strcmp(las_u->nam_c, gen_u->nam_c) ) + { + las_u->ver_c = gen_u->ver_c; + return; + } + las_u = las_u->nex_u; + } + + if( 0 == strcmp(las_u->nam_c, gen_u->nam_c) ) + las_u->ver_c = gen_u->ver_c; + else + { + _lick_init_sock(gen_u); + las_u->nex_u = gen_u; + } + } + +} + +/* _lick_io_kick(): apply effects. +*/ +static c3_o +_lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) +{ + u3_lick* lic_u = (u3_lick*)car_u; + + u3_noun tag, i_wir, par; + u3_noun nam, ver, tmp; + c3_o ret_o, dev_o; + + if ( (c3n == u3r_cell(wir, &i_wir, 0)) + || (c3n == u3r_cell(cad, &tag, &tmp)) + || (c3__lick != i_wir) ) + { + return c3n; + } + else { + if ( (c3__book == tag) ){ + if( c3y == u3r_cell(tmp, &nam, &ver) ) + { + _lick_ef_book(lic_u, wir, nam, ver); // execute read command + ret_o = c3y; + } else { ret_o = c3n; } + + } else if ( (c3__read == tag) ) + { + u3l_log("lick read"); + ret_o=c3y; + /*if( c3y == u3r_trel(tmp, &wut, &cmd, &cnt) ) + { + _lick_ef_read(loc_u, wir, dev_d, wut, cmd, cnt); // execute read command + ret_o = c3y; + } else { ret_o = c3n; }*/ + } else if ( c3__rite == tag ) + { + u3l_log("lick: rite "); + ret_o=c3y; + /*if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) + { + _lick_ef_rite(loc_u, wir, dev_d, wut, cmd, dat, cnt); // execute write command + ret_o = c3y; + } else { ret_o = c3n; }*/ + } + else { + ret_o = c3n; + } + } + + return ret_o; +} + +/* _lick_born_news(): initialization complete on %born. +*/ +static void +_lick_born_news(u3_ovum* egg_u, u3_ovum_news new_e) +{ + u3_auto* car_u = egg_u->car_u; + + if ( u3_ovum_done == new_e ) { + car_u->liv_o = c3y; + } +} + +/* _lick_born_bail(): %born is essential, retry failures. +*/ +static void +_lick_born_bail(u3_ovum* egg_u, u3_noun lud) +{ + + u3l_log("lick: %%born failure;"); + u3z(lud); + u3_ovum_free(egg_u); +} + +/* _lick_io_talk(): notify %lick that we're live + * pass it a list of device names +*/ +static void +_lick_io_talk(u3_auto* car_u) +{ + u3_lick* lic_u = (u3_lick*)car_u; + u3l_log("lick born"); + u3_noun wir = u3nc(c3__lick, u3_nul); + u3_noun cad = u3nc(c3__born, u3_nul); + + u3_auto_peer( + u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, + _lick_born_news, + _lick_born_bail); + + car_u->liv_o = c3y; +} + +/* _lick_io_exit(): close all open device files and exit +*/ +static void +_lick_io_exit(u3_auto* car_u) +{ + + u3_lick* lic_u = (u3_lick*)car_u; + c3_c* pax_c = u3_Host.dir_c; + + u3_agent* cur_u=lic_u->gen_u; + u3_agent* nex_u; + while( NULL != cur_u ) + { + _lick_close_sock(cur_u); + nex_u = cur_u->nex_u; + c3_free(cur_u); + cur_u = nex_u; + } + + //u3s_cue_xeno_done(lic_u->sil_u); + c3_free(lic_u); +} + + +/* u3_lick(): initialize hardware control vane. +*/ +u3_auto* +u3_lick_io_init(u3_pier* pir_u) +{ + u3_lick* lic_u = c3_calloc(sizeof(*lic_u)); + + c3_c pax_c[2048]; + struct stat st = {0}; + strcat(pax_c, u3_Host.dir_c); + strcat(pax_c, URB_DEV_PATH); + + if( -1 == stat(pax_c, &st) ) { + u3l_log("lick init %s", lic_u->fod_c); + mkdir(pax_c, 0700); + } + + lic_u->fod_c = c3_calloc(strlen(pax_c)); + strcpy(lic_u->fod_c, pax_c); + + + u3_auto* car_u = &lic_u->car_u; + car_u->nam_m = c3__lick; + + car_u->liv_o = c3n; + car_u->io.talk_f = _lick_io_talk; + car_u->io.kick_f = _lick_io_kick; + car_u->io.exit_f = _lick_io_exit; + + return car_u; +} diff --git a/pkg/vere/io/loch.c b/pkg/vere/io/loch.c deleted file mode 100644 index a3c2047138..0000000000 --- a/pkg/vere/io/loch.c +++ /dev/null @@ -1,308 +0,0 @@ -/// @file - -#include "vere.h" -#include -#include "noun.h" - -/* u3_device: description of a device - */ - typedef struct _u3_device { - c3_w nam_w; // %name of device - c3_c* fil_c; // file of device - c3_ws fid_w; // file descriptor - c3_o opn_o; // is the file open - c3_w tus_w; // device status - } u3_device; - -/* u3_loch: a list of devices -*/ - typedef struct _u3_loch { - u3_auto car_u; // driver - c3_w cnt_w; // count of devices - struct _u3_device* dev_u; // list of devices - } u3_loch; - -/* _lock_rite_bail(): figure out why loch failed to read and return error code -*/ -static void -_loch_rite_bail(u3_ovum* egg_u, u3_noun lud) -{ - u3l_log("loch: rite failed"); -} - -/* u3_loch_ef_rite(): read from device -*/ -static void -_loch_ef_rite(u3_loch* loc_u, u3_noun wir_i, - u3_device* dev_d, u3_noun wut, u3_noun cmd, u3_noun dat, u3_noun cnt) -{ - if ( c3n == loc_u->car_u.liv_o ) { - loc_u->car_u.liv_o = c3y; - } - c3_y* buf_y = c3_malloc(cnt*sizeof(c3_y)); - u3r_bytes(0, cnt, buf_y, dat); - - c3_w wit; - u3l_log("loch cnt: %d", cnt); - u3l_log("loch dat: %llu", dat); - u3l_log("loch fid from dev_d: %d", dev_d->fid_w); - - if( c3__mem == wut ) - { - wit = write(dev_d->fid_w, buf_y, cnt); - u3l_log("loch wit: %d", wit); - } else { - wit = ioctl(dev_d->fid_w, cmd, buf_y); - } - if(-1 == wit) { - wit = errno; - perror("Error printed by perror"); - } else { wit = 0; } - - u3_noun tus = u3i_word(wit); - u3l_log("tus: %d", wit); - { - u3_noun wir = u3nc(c3__loch, u3_nul); - u3_noun dat = u3nc(dev_d->nam_w, tus); - u3_noun cad = u3nc(c3__rote, dat); - - u3_auto_peer( - u3_auto_plan(&loc_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, 0, _loch_rite_bail); - } -} - -/* _lock_read_bail(): figure out why loch failed to read and return error code -*/ -static void -_loch_read_bail(u3_ovum* egg_u, u3_noun lud) -{ - u3l_log("loch: read failed"); -} - -/* u3_loch_ef_read(): read from device -*/ -static void -_loch_ef_read(u3_loch* loc_u, u3_noun wir_i, - u3_device* dev_d, u3_noun wut, u3_noun cmd, u3_noun cnt) -{ - if ( c3n == loc_u->car_u.liv_o ) { - loc_u->car_u.liv_o = c3y; - } - c3_y* buf_y = c3_malloc(cnt*sizeof(c3_y)); - u3l_log("loch fid from dev_d: %d", dev_d->fid_w); - - c3_w wit; - if( c3__mem == wut ) - { - wit = read(dev_d->fid_w, buf_y, cnt); - } else { - wit = ioctl(dev_d->fid_w, u3r_word(0, cmd) , buf_y); - } - if(-1 == wit) { - wit = errno; - perror("Error printed by perror"); - } else { wit = 0; } - - - u3_noun tus = u3i_word(wit); - u3_noun red = u3i_bytes(cnt, buf_y); - u3l_log("loch from bytes"); - - { - u3_noun wir = u3nc(c3__loch, u3_nul); - u3_noun dat = u3nt(dev_d->nam_w, red, tus); - u3_noun cad = u3nc(c3__seen, dat); - - u3_auto_peer( - u3_auto_plan(&loc_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, 0, _loch_read_bail); - } -} - -/* _loch_io_kick(): apply effects. -*/ -static c3_o -_loch_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) -{ - u3_loch* loc_u = (u3_loch*)car_u; - - u3_noun tag, i_wir, par; - u3_noun wut, dev, cmd, dat, cnt, tmp; - u3_device* dev_d; - c3_o ret_o, dev_o; - - if ( (c3n == u3r_cell(wir, &i_wir, 0)) - || (c3n == u3r_cell(cad, &tag, &par)) - || (c3__loch != i_wir) ) - { - return c3n; - } - else { - if (c3n == u3r_cell(par, &dev, &tmp)) // if I cant split it up error - { - ret_o = c3n; - } - else { - //See if the device is present and open - dev_o = c3n; - for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { - if((dev == loc_u->dev_u[i].nam_w)){ - u3l_log("loch dev found"); - dev_o = c3y; - dev_d = &loc_u->dev_u[i]; - } - } - if (c3y == dev_o) { - if ( (c3__read == tag) ) - { - u3l_log("loch read"); - if( c3y == u3r_trel(tmp, &wut, &cmd, &cnt) ) - { - _loch_ef_read(loc_u, wir, dev_d, wut, cmd, cnt); // execute read command - ret_o = c3y; - } else { ret_o = c3n; } - } else if ( c3__rite == tag ) - { - u3l_log("loch: rite "); - if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) - { - _loch_ef_rite(loc_u, wir, dev_d, wut, cmd, dat, cnt); // execute write command - ret_o = c3y; - } else { ret_o = c3n; } - } - else { - ret_o = c3n; - } - } - else { - u3l_log("loch dev not found"); - ret_o = c3n; - } - } - } - - u3z(wir); u3z(cad); - return ret_o; -} - -/* _loch_born_news(): initialization complete on %born. -*/ -static void -_loch_born_news(u3_ovum* egg_u, u3_ovum_news new_e) -{ - u3_auto* car_u = egg_u->car_u; - - if ( u3_ovum_done == new_e ) { - car_u->liv_o = c3y; - } -} - -/* _loch_born_bail(): %born is essential, retry failures. -*/ -static void -_loch_born_bail(u3_ovum* egg_u, u3_noun lud) -{ - - u3l_log("loch: %%born failure;"); - u3z(lud); - u3_ovum_free(egg_u); -} - -/* _loch_io_talk(): notify %loch that we're live - * pass it a list of device names -*/ -static void -_loch_io_talk(u3_auto* car_u) -{ - u3_loch* loc_u = (u3_loch*)car_u; - u3l_log("loch born loc: %d", loc_u->dev_u[0].fid_w); - u3_noun wir = u3nc(c3__loch, u3_nul); - u3_noun cad = u3nc(c3__born, u3_nul); - - u3_auto_peer( - u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, - _loch_born_news, - _loch_born_bail); - - //For every device send a %devs card - for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { - u3l_log("loch: found %s as fid %d", loc_u->dev_u[i].fil_c, loc_u->dev_u[i].fid_w); - u3_noun wir = u3nt(c3__loch, - u3dc("scot", c3__uv, i+1), - u3_nul); - u3_noun cad = u3nc(c3__devs, - u3nc(loc_u->dev_u[i].nam_w, loc_u->dev_u[i].tus_w)); - u3_auto_peer( - u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, - _loch_born_news, - _loch_born_bail); - - } - - car_u->liv_o = c3y; -} - -/* _loch_io_exit(): close all open device files and exit -*/ -static void -_loch_io_exit(u3_auto* car_u) -{ - u3_loch* loc_u = (u3_loch*)car_u; - - for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { - if( c3y == loc_u->dev_u[i].opn_o ) { - close(loc_u->dev_u[i].fid_w); - } - } -} - -/* u3_loch(): initialize hardware control vane. -*/ -u3_auto* -u3_loch_io_init(u3_pier* pir_u) -{ - u3_loch* loc_u = c3_calloc(sizeof(*loc_u)); - - // TODO: Open all devices specified in pier. - // Right now this only opens /dev/random and will provide a random number - u3_device* random = c3_calloc(sizeof(*random)); - u3_device* serial = c3_calloc(sizeof(*serial)); - - random->nam_w = c3_s4('r','a','n','d'); - random->fil_c = "/dev/urandom"; - - serial->nam_w = c3_s4('u','a','r','t'); - serial->fil_c = "/dev/ttyUSB0"; - - loc_u->cnt_w = 2; - loc_u->dev_u = c3_calloc(loc_u->cnt_w*sizeof(loc_u)); - loc_u->dev_u[0] = *random; - loc_u->dev_u[1] = *serial; - - // Open all devices - for( c3_w i = 0; i< loc_u->cnt_w; i++ ) { - loc_u->dev_u[i].fid_w = open(loc_u->dev_u[i].fil_c, O_RDWR|O_NOCTTY|O_NDELAY); - if ( loc_u->dev_u[i].fid_w < 0 ) { //If any error report it and keep device marked as close - u3l_log("loch: unable to open %s", loc_u->dev_u[i].fil_c); - perror("open"); - } else { - u3l_log("loch: opened %s as fid %d", loc_u->dev_u[i].fil_c, loc_u->dev_u[i].fid_w); - loc_u->dev_u[i].opn_o = c3y; - loc_u->dev_u[i].tus_w = 0; - } - } - - u3l_log("init data loc %d:", &loc_u->car_u); - u3_auto* car_u = &loc_u->car_u; - car_u->nam_m = c3__loch; - - car_u->liv_o = c3n; - car_u->io.talk_f = _loch_io_talk; - car_u->io.kick_f = _loch_io_kick; - car_u->io.exit_f = _loch_io_exit; - - return car_u; -} diff --git a/pkg/vere/vere.h b/pkg/vere/vere.h index 6b7fd969c2..94d1e43877 100644 --- a/pkg/vere/vere.h +++ b/pkg/vere/vere.h @@ -1181,12 +1181,12 @@ u3_auto* u3_behn_io_init(u3_pier* pir_u); - /** loch, hardware control. + /** lick, IPC communication. **/ - /* u3_loch_io_init(): initialize loch vane. + /* u3_lick_io_init(): initialize loch vane. */ u3_auto* - u3_loch_io_init(u3_pier* pir_u); + u3_lick_io_init(u3_pier* pir_u); /** HTTP server. **/ From c97d77c70cb3bddd9ec2d41c7ec60565cf722019 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 13 Apr 2023 16:26:52 -0400 Subject: [PATCH 12/33] fixed the weird allocaiton crash on exit --- pkg/vere/io/lick.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 05c2e4fd73..4666a02a77 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -30,7 +30,8 @@ static const c3_c URB_DEV_PATH[] = "/.urb/dev/"; static void _lick_close_cb(uv_handle_t* had_u) { - c3_free(had_u); + //Freeing had_u gives an out of loom error. no idea why + //c3_free(had_u); } @@ -303,7 +304,6 @@ _lick_io_talk(u3_auto* car_u) static void _lick_io_exit(u3_auto* car_u) { - u3_lick* lic_u = (u3_lick*)car_u; c3_c* pax_c = u3_Host.dir_c; From 327be05691746496327d907b1eb4815c616fb77f Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 13 Apr 2023 16:59:49 -0400 Subject: [PATCH 13/33] modified api --- pkg/c3/motes.h | 3 ++- pkg/vere/io/lick.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 9caed0a84e..4cf631e04d 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -113,7 +113,6 @@ # define c3__bond c3_s4('b','o','n','d') # define c3__bone c3_s4('b','o','n','e') # define c3__bong c3_s4('b','o','n','g') -# define c3__book c3_s4('b','o','o','k') # define c3__bool c3_s4('b','o','o','l') # define c3__boot c3_s4('b','o','o','t') # define c3__born c3_s4('b','o','r','n') @@ -1082,6 +1081,7 @@ # define c3__smts c3_s4('s','m','t','s') # define c3__snap c3_s4('s','n','a','p') # define c3__so c3_s2('s','o') +# define c3__soak c3_s4('s','o','a','k') # define c3__sock c3_s4('s','o','c','k') # define c3__soft c3_s4('s','o','f','t') # define c3__sole c3_s4('s','o','l','e') @@ -1089,6 +1089,7 @@ # define c3__sort c3_s4('s','o','r','t') # define c3__spal c3_s4('s','p','a','l') # define c3__spar c3_s4('s','p','a','r') +# define c3__spew c3_s4('s','p','e','w') # define c3__spig c3_s4('s','p','i','g') # define c3__spil c3_s4('s','p','i','l') # define c3__spin c3_s4('s','p','i','n') diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 4666a02a77..3c3c6bd0f9 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -159,14 +159,14 @@ _lick_sock_err_chdir: } -/* u3_lick_ef_book(): Open an IPC port +/* u3_lick_ef_sync(): Open an IPC port */ static void -_lick_ef_book(u3_lick* lic_u, u3_noun wir_i, +_lick_ef_sync(u3_lick* lic_u, u3_noun wir_i, u3_noun nam, u3_noun ver) { - u3l_log("lick book: %s %s", u3r_string(nam), u3r_string(ver)); + u3l_log("lick sync: %s %s", u3r_string(nam), u3r_string(ver)); u3_agent* gen_u = c3_calloc(sizeof(*gen_u)); gen_u->nam_c = u3r_string(nam); @@ -222,25 +222,25 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) return c3n; } else { - if ( (c3__book == tag) ){ + if ( (c3__sync == tag) ){ if( c3y == u3r_cell(tmp, &nam, &ver) ) { - _lick_ef_book(lic_u, wir, nam, ver); // execute read command + _lick_ef_sync(lic_u, wir, nam, ver); // execute sync command ret_o = c3y; } else { ret_o = c3n; } - } else if ( (c3__read == tag) ) + } else if ( (c3__soak == tag) ) { - u3l_log("lick read"); + u3l_log("lick soak"); ret_o=c3y; /*if( c3y == u3r_trel(tmp, &wut, &cmd, &cnt) ) { _lick_ef_read(loc_u, wir, dev_d, wut, cmd, cnt); // execute read command ret_o = c3y; } else { ret_o = c3n; }*/ - } else if ( c3__rite == tag ) + } else if ( c3__spew == tag ) { - u3l_log("lick: rite "); + u3l_log("lick: spew "); ret_o=c3y; /*if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) { From 71b54a86890a346b75431652ae847692eae57b6d Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Fri, 14 Apr 2023 08:44:46 -0400 Subject: [PATCH 14/33] changed spew to spit --- pkg/vere/io/lick.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 3c3c6bd0f9..42c1954499 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -238,9 +238,9 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) _lick_ef_read(loc_u, wir, dev_d, wut, cmd, cnt); // execute read command ret_o = c3y; } else { ret_o = c3n; }*/ - } else if ( c3__spew == tag ) + } else if ( c3__spit == tag ) { - u3l_log("lick: spew "); + u3l_log("lick: spit "); ret_o=c3y; /*if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) { From cf180e869262ba5f066cb51cde0e8742c8e2f8e1 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 20 Apr 2023 12:26:39 -0400 Subject: [PATCH 15/33] copied a bunch of conn.c stuff for connections --- pkg/vere/io/lick.c | 261 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 217 insertions(+), 44 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 42c1954499..33c26ab1b5 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -5,12 +5,32 @@ #include #include "noun.h" +/* u3_chan: incoming control plane connection. +*/ + typedef struct _u3_chan { + struct _u3_moor mor_u; // message handler + c3_l coq_l; // connection number + c3_o liv_o; // connection live + struct _u3_shan* san_u; // server backpointer + struct _u3_cran* ran_u; // request list + } u3_chan; + +/* u3_shan: control plane server. +*/ + typedef struct _u3_shan { + uv_pipe_t pyp_u; // server stream handler + c3_l nex_l; // next connection number + struct _u3_agent* gen_u; // agent backpointer + struct _u3_chan* can_u; // connection list + } u3_shan; + + /* u3_device: description of a device */ typedef struct _u3_agent { c3_c* nam_c; // name of device - c3_c* ver_c; // name of device - uv_pipe_t pyp_u; // stream handler + struct _u3_shan* san_u; // server reference + struct _u3_lick* lic_u; // device backpointer struct _u3_agent* nex_u; // next pointer } u3_agent; @@ -20,11 +40,33 @@ u3_auto car_u; // driver c3_c* fod_c; // IPC folder location u3_cue_xeno* sil_u; // cue handle - u3_agent* gen_u; // agent list + struct _u3_agent* gen_u; // agent list } u3_lick; static const c3_c URB_DEV_PATH[] = "/.urb/dev/"; +/* _lick_send_noun(): jam and send noun over chan. +*/ +static void +_lick_send_noun(u3_chan* can_u, u3_noun nun) +{ + c3_y* byt_y; + c3_d len_d; + + u3s_jam_xeno(nun, &len_d, &byt_y); + u3z(nun); + u3_newt_send((u3_mojo*)&can_u->mor_u, len_d, byt_y); +} + + +/* _lick_mote_free(): u3_moat-shaped close callback. +*/ +static void +_lick_moat_free(void* ptr_v, ssize_t err_i, const c3_c* err_c) +{ + //c3_free(ptr_v); +} + /* _lick_close_cb(): socket close callback. */ static void @@ -35,13 +77,128 @@ _lick_close_cb(uv_handle_t* had_u) } +/* _lick_poke_bail(): error function on failed poke +*/ +static void +_lick_poke_bail(u3_ovum* egg_u, u3_noun lud) +{ + u3_lick* lic_u = (u3_lick*)egg_u->car_u; + u3_chan* can_u; + u3_noun wir = egg_u->wir; + u3_ovum_free(egg_u); +} + + +/* _lick_moor_poke(): called on message read from u3_moor. +*/ +static void +_lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) +{ + u3_weak put; + u3_noun dev, nam, dat, wir, cad; + + u3_chan* can_u = (u3_chan*)ptr_v; + u3_agent* gen_u = can_u->san_u->gen_u; + u3_lick* lic_u = gen_u->lic_u; + c3_i err_i = 0; + c3_c* err_c; + c3_c* tag_c; + c3_c* rid_c; + + put = u3s_cue_xeno_with(lic_u->sil_u, len_d, byt_y); + if ( u3_none == put ) { + can_u->mor_u.bal_f(can_u, -1, "cue-none"); + return; + } + if ( (c3n == u3r_cell(put, &nam, &dat)) ) + { + err_i = -2; err_c = "put-bad"; + goto _moor_poke_out; + } + + wir = u3nc(c3__lick, u3_nul); + dev = u3i_string(gen_u->nam_c); + cad = u3nt(c3__soak, dev, put); + u3_auto_peer( + u3_auto_plan(&lic_u->car_u, + u3_ovum_init(0, c3__l, wir, cad)), + 0, 0, _lick_poke_bail); + return; +_moor_poke_out: + if ( 0 != err_i ) { + can_u->mor_u.bal_f(can_u, err_i, err_c); + } +} + +/* _lick_close_chan(): close given channel, freeing. +*/ +static void +_lick_close_chan(u3_shan* san_u, u3_chan* can_u) +{ + u3_lick* lic_u = san_u->gen_u->lic_u; + u3_chan* inn_u; + // TODO Write close channel command it should give a disconnect mark to %lick + // remove chan from server's connection list. + // + if ( san_u->can_u == can_u ) { + san_u->can_u = (u3_chan*)can_u->mor_u.nex_u; + } + else { + for ( inn_u = san_u->can_u; inn_u; inn_u = (u3_chan*)inn_u->mor_u.nex_u ) { + if ( (u3_chan*)inn_u->mor_u.nex_u == can_u ) { + inn_u->mor_u.nex_u = can_u->mor_u.nex_u; + break; + } + } + } + can_u->mor_u.nex_u = NULL; + + { + // send a close event to arvo and stop reading. + // + u3_noun wir, cad, dev, dat, mar; + + wir = u3nc(c3__lick, u3_nul); + dev = u3i_string(san_u->gen_u->nam_c); + mar = u3i_string("disconnect"); + + cad = u3nq(c3__soak, dev, mar, u3_nul); + + u3_auto_peer( + u3_auto_plan(&lic_u->car_u, + u3_ovum_init(0, c3__k, wir, cad)), + 0, 0, _lick_poke_bail); + } + + u3_newt_moat_stop((u3_moat*)&can_u->mor_u, _lick_moat_free); +} + + +/* _lick_moor_bail(): error callback for u3_moor. +*/ +static void +_lick_moor_bail(void* ptr_v, ssize_t err_i, const c3_c* err_c) +{ + u3_chan* can_u = (u3_chan*)ptr_v; + u3_shan* san_u = can_u->san_u; + + if ( err_i != UV_EOF ) { + u3l_log("lick: moor bail %zd %s", err_i, err_c); + if ( _(can_u->liv_o) ) { + _lick_send_noun(can_u, u3nq(0, c3__bail, u3i_word(err_i), + u3i_string(err_c))); + can_u->liv_o = c3n; + } + } + _lick_close_chan(san_u, can_u); +} + /* _lick_sock_cb(): socket connection callback. */ static void _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) { -/* u3_shan* san_u = (u3_shan*)sem_u; - u3_lick* con_u = san_u->con_u; + u3_shan* san_u = (u3_shan*)sem_u; u3_chan* can_u; c3_i err_i; @@ -60,21 +217,21 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) u3_newt_read((u3_moat*)&can_u->mor_u); can_u->mor_u.nex_u = (u3_moor*)san_u->can_u; san_u->can_u = can_u; - */ } + /* _lick_close_sock(): close an agent's socket */ static void -_lick_close_sock(u3_agent* gen_u) +_lick_close_sock(u3_shan* san_u) { c3_c* pax_c = u3_Host.dir_c; - c3_w len_w = strlen(pax_c) + 2 + sizeof(URB_DEV_PATH) + strlen(gen_u->nam_c); + c3_w len_w = strlen(pax_c) + 2 + sizeof(URB_DEV_PATH) + strlen(san_u->gen_u->nam_c); c3_c* paf_c = c3_malloc(len_w); c3_i wit_i; - wit_i = snprintf(paf_c, len_w, "%s/%s/%s", pax_c, URB_DEV_PATH, gen_u->nam_c); + wit_i = snprintf(paf_c, len_w, "%s/%s/%s", pax_c, URB_DEV_PATH, san_u->gen_u->nam_c); - u3l_log("lick: closing %s/%s/%s",pax_c, URB_DEV_PATH, gen_u->nam_c); + u3l_log("lick: closing %s/%s/%s",pax_c, URB_DEV_PATH, san_u->gen_u->nam_c); c3_assert(wit_i > 0); c3_assert(len_w == (c3_w)wit_i + 1); @@ -87,7 +244,7 @@ _lick_close_sock(u3_agent* gen_u) else { // u3l_log("lick: unlinked %s", paf_c); } - uv_close((uv_handle_t*)&gen_u->pyp_u, _lick_close_cb); + uv_close((uv_handle_t*)&san_u->pyp_u, _lick_close_cb); c3_free(paf_c); } @@ -95,7 +252,7 @@ _lick_close_sock(u3_agent* gen_u) /* _lick_init_sock(): initialize socket device. */ static void -_lick_init_sock(u3_agent* gen_u) +_lick_init_sock(u3_shan* san_u) { // the full socket path is limited to about 108 characters, @@ -106,6 +263,7 @@ _lick_init_sock(u3_agent* gen_u) c3_c pax_c[2048]; c3_i err_i; c3_c por_c[2048] = "."; + u3_agent* gen_u = san_u->gen_u; if ( NULL == getcwd(pax_c, sizeof(pax_c)) ) { u3l_log("lick: getcwd: %s", uv_strerror(errno)); @@ -123,17 +281,17 @@ _lick_init_sock(u3_agent* gen_u) u3l_log("lick: unlink: %s", uv_strerror(errno)); goto _lick_sock_err_chdir; } - if ( 0 != (err_i = uv_pipe_init(u3L, &gen_u->pyp_u, 0)) ) { + if ( 0 != (err_i = uv_pipe_init(u3L, &san_u->pyp_u, 0)) ) { u3l_log("lick: uv_pipe_init: %s", uv_strerror(err_i)); goto _lick_sock_err_chdir; } - if ( 0 != (err_i = uv_pipe_bind(&gen_u->pyp_u, por_c)) ) { + if ( 0 != (err_i = uv_pipe_bind(&san_u->pyp_u, por_c)) ) { u3l_log("lick: uv_pipe_bind: %s", uv_strerror(err_i)); u3l_log("lick: uv_pipe_bind: %s", por_c); goto _lick_sock_err_chdir; } - if ( 0 != (err_i = uv_listen((uv_stream_t*)&gen_u->pyp_u, 0, + if ( 0 != (err_i = uv_listen((uv_stream_t*)&san_u->pyp_u, 0, _lick_sock_cb)) ) { u3l_log("lick: uv_listen: %s", uv_strerror(err_i)); goto _lick_sock_err_unlink; @@ -146,7 +304,7 @@ _lick_init_sock(u3_agent* gen_u) return; _lick_sock_err_close: - uv_close((uv_handle_t*)&gen_u->pyp_u, _lick_close_cb); + uv_close((uv_handle_t*)&san_u->pyp_u, _lick_close_cb); _lick_sock_err_unlink: if ( 0 != unlink(gen_u->nam_c) ) { u3l_log("lick: unlink: %s", uv_strerror(errno)); @@ -159,24 +317,26 @@ _lick_sock_err_chdir: } -/* u3_lick_ef_sync(): Open an IPC port +/* u3_lick_ef_spin(): Open an IPC port */ static void -_lick_ef_sync(u3_lick* lic_u, u3_noun wir_i, - u3_noun nam, u3_noun ver) +_lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) { - u3l_log("lick sync: %s %s", u3r_string(nam), u3r_string(ver)); + u3l_log("lick spin: %s", u3r_string(nam)); u3_agent* gen_u = c3_calloc(sizeof(*gen_u)); + gen_u->san_u = c3_calloc(sizeof(*gen_u->san_u)); + gen_u->san_u->can_u = c3_calloc(sizeof(*gen_u->san_u->can_u)); gen_u->nam_c = u3r_string(nam); - gen_u->ver_c = u3r_string(ver); + gen_u->lic_u = lic_u; + gen_u->san_u->gen_u = gen_u; u3_agent* hed_u = lic_u->gen_u; if( NULL == lic_u->gen_u ) { - _lick_init_sock(gen_u); + _lick_init_sock(gen_u->san_u); lic_u->gen_u = gen_u; } else @@ -187,17 +347,15 @@ _lick_ef_sync(u3_lick* lic_u, u3_noun wir_i, { if( 0 == strcmp(las_u->nam_c, gen_u->nam_c) ) { - las_u->ver_c = gen_u->ver_c; return; } las_u = las_u->nex_u; } - if( 0 == strcmp(las_u->nam_c, gen_u->nam_c) ) - las_u->ver_c = gen_u->ver_c; - else + if( 0 != strcmp(las_u->nam_c, gen_u->nam_c) ) { - _lick_init_sock(gen_u); + u3l_log("lick last"); + _lick_init_sock(gen_u->san_u); las_u->nex_u = gen_u; } } @@ -212,7 +370,7 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) u3_lick* lic_u = (u3_lick*)car_u; u3_noun tag, i_wir, par; - u3_noun nam, ver, tmp; + u3_noun nam, dat, tmp; c3_o ret_o, dev_o; if ( (c3n == u3r_cell(wir, &i_wir, 0)) @@ -222,26 +380,40 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) return c3n; } else { - if ( (c3__sync == tag) ){ - if( c3y == u3r_cell(tmp, &nam, &ver) ) - { - _lick_ef_sync(lic_u, wir, nam, ver); // execute sync command - ret_o = c3y; - } else { ret_o = c3n; } + if ( (c3__spin == tag) ){ + nam = u3k(tmp); + _lick_ef_spin(lic_u, wir, nam); // execute spin command + ret_o = c3y; - } else if ( (c3__soak == tag) ) + } else if ( (c3__shut == tag) ) { - u3l_log("lick soak"); - ret_o=c3y; - /*if( c3y == u3r_trel(tmp, &wut, &cmd, &cnt) ) - { - _lick_ef_read(loc_u, wir, dev_d, wut, cmd, cnt); // execute read command - ret_o = c3y; - } else { ret_o = c3n; }*/ + u3l_log("lick shut"); + ret_o=c3y; } else if ( c3__spit == tag ) { u3l_log("lick: spit "); - ret_o=c3y; + ret_o=c3y; + + if ( c3n == u3r_cell(tmp, &nam, &dat) ){ + return c3n; + } + + c3_c* nam_c = u3r_string(nam); + u3_agent* gen_u = NULL; + u3_agent* cur_u = lic_u->gen_u; + while (cur_u != NULL){ + if( 0 == strcmp(cur_u->nam_c, nam_c) ) { + gen_u = cur_u; + break; + } + cur_u = cur_u->nex_u; + } + if ( NULL == gen_u ){ + u3l_log("lick: spit: gen %s not found", nam_c); + return c3n; + } + + _lick_send_noun(gen_u->san_u->can_u, dat); /*if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) { _lick_ef_rite(loc_u, wir, dev_d, wut, cmd, dat, cnt); // execute write command @@ -253,6 +425,7 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) } } + u3l_log("lick kick done"); return ret_o; } @@ -311,7 +484,7 @@ _lick_io_exit(u3_auto* car_u) u3_agent* nex_u; while( NULL != cur_u ) { - _lick_close_sock(cur_u); + _lick_close_sock(cur_u->san_u); nex_u = cur_u->nex_u; c3_free(cur_u); cur_u = nex_u; From 21e3dd6464688a191504ebc7aa1b9df5c82c731d Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Tue, 25 Apr 2023 16:46:04 -0400 Subject: [PATCH 16/33] fixed spin and shut --- pkg/vere/io/lick.c | 50 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 33c26ab1b5..35c35574f9 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -277,7 +277,7 @@ _lick_init_sock(u3_shan* san_u) strcat(por_c, URB_DEV_PATH); strcat(por_c, gen_u->nam_c); - if ( 0 != unlink(gen_u->nam_c) && errno != ENOENT ) { + if ( 0 != unlink(por_c) && errno != ENOENT ) { u3l_log("lick: unlink: %s", uv_strerror(errno)); goto _lick_sock_err_chdir; } @@ -316,6 +316,46 @@ _lick_sock_err_chdir: u3_king_bail(); } +/* u3_lick_ef_shut(): Close an IPC port +*/ +static void +_lick_ef_shut(u3_lick* lic_u, u3_noun nam) +{ + + u3l_log("lick shut: %s", u3r_string(nam)); + + c3_c* nam_c = u3r_string(nam); + + u3_agent* cur_u = lic_u->gen_u; + u3_agent* las_u; + + if ( (NULL != cur_u) && (NULL != cur_u->nam_c) && + ( 0 == strcmp(cur_u->nam_c, nam_c) ) ) + { + lic_u->gen_u = cur_u->nex_u; + _lick_close_sock(cur_u->san_u); + //free(cur_u); + return; + } + + while ( (NULL != cur_u) && (NULL != cur_u->nam_c) && + ( 0 != strcmp(cur_u->nam_c, nam_c) ) ) + { + las_u = cur_u; + cur_u = cur_u->nex_u; + } + + if ( NULL == cur_u ) + { + return; + } + + las_u->nex_u = cur_u->nex_u; + _lick_close_sock(cur_u->san_u); + //free(cur_u); + +} + /* u3_lick_ef_spin(): Open an IPC port */ @@ -354,12 +394,10 @@ _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) if( 0 != strcmp(las_u->nam_c, gen_u->nam_c) ) { - u3l_log("lick last"); _lick_init_sock(gen_u->san_u); las_u->nex_u = gen_u; } } - } /* _lick_io_kick(): apply effects. @@ -387,7 +425,8 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) } else if ( (c3__shut == tag) ) { - u3l_log("lick shut"); + nam = u3k(tmp); + _lick_ef_shut(lic_u, nam); // execute shut command ret_o=c3y; } else if ( c3__spit == tag ) { @@ -502,13 +541,14 @@ u3_lick_io_init(u3_pier* pir_u) { u3_lick* lic_u = c3_calloc(sizeof(*lic_u)); - c3_c pax_c[2048]; + c3_c pax_c[2048] = ""; struct stat st = {0}; strcat(pax_c, u3_Host.dir_c); strcat(pax_c, URB_DEV_PATH); if( -1 == stat(pax_c, &st) ) { u3l_log("lick init %s", lic_u->fod_c); + u3l_log("lick init mkdir %s",pax_c ); mkdir(pax_c, 0700); } From eb9b2a6a90a4e0086347ebf5d20d6da8afe743d1 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Wed, 26 Apr 2023 22:10:07 -0400 Subject: [PATCH 17/33] sends connect and error cards --- pkg/vere/io/lick.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 35c35574f9..e61bd68ee4 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -29,6 +29,7 @@ */ typedef struct _u3_agent { c3_c* nam_c; // name of device + c3_o con_o; struct _u3_shan* san_u; // server reference struct _u3_lick* lic_u; // device backpointer struct _u3_agent* nex_u; // next pointer @@ -94,6 +95,7 @@ _lick_poke_bail(u3_ovum* egg_u, u3_noun lud) static void _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) { + u3l_log("lick poke"); u3_weak put; u3_noun dev, nam, dat, wir, cad; @@ -120,14 +122,14 @@ _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) dev = u3i_string(gen_u->nam_c); cad = u3nt(c3__soak, dev, put); u3_auto_peer( - u3_auto_plan(&lic_u->car_u, - u3_ovum_init(0, c3__l, wir, cad)), + u3_auto_plan(&lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), 0, 0, _lick_poke_bail); return; _moor_poke_out: if ( 0 != err_i ) { can_u->mor_u.bal_f(can_u, err_i, err_c); } + } /* _lick_close_chan(): close given channel, freeing. @@ -199,6 +201,8 @@ static void _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) { u3_shan* san_u = (u3_shan*)sem_u; + u3_agent* gen_u = san_u->gen_u; + u3_noun dev, dat, wir, cad, mar; u3_chan* can_u; c3_i err_i; @@ -217,6 +221,17 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) u3_newt_read((u3_moat*)&can_u->mor_u); can_u->mor_u.nex_u = (u3_moor*)san_u->can_u; san_u->can_u = can_u; + gen_u->con_o = c3y; + u3l_log("lick: sock cb"); + + wir = u3nc(c3__lick, u3_nul); + dev = u3i_string(gen_u->nam_c); + mar = u3i_string("connected"); + dat = u3i_string(""); + cad = u3nq(c3__soak, dev, mar, dat); + u3_auto_peer( + u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, 0, _lick_poke_bail); } @@ -334,7 +349,7 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) { lic_u->gen_u = cur_u->nex_u; _lick_close_sock(cur_u->san_u); - //free(cur_u); + c3_free(cur_u); return; } @@ -352,8 +367,7 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) las_u->nex_u = cur_u->nex_u; _lick_close_sock(cur_u->san_u); - //free(cur_u); - + c3_free(cur_u); } @@ -371,6 +385,7 @@ _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) gen_u->nam_c = u3r_string(nam); gen_u->lic_u = lic_u; gen_u->san_u->gen_u = gen_u; + gen_u->con_o = c3n; u3_agent* hed_u = lic_u->gen_u; @@ -452,7 +467,21 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) return c3n; } - _lick_send_noun(gen_u->san_u->can_u, dat); + if( c3y == gen_u->con_o){ + _lick_send_noun(gen_u->san_u->can_u, dat); + } else + { + u3_noun dev, dat, wir, cad, mar; + wir = u3nc(c3__lick, u3_nul); + dev = u3i_string(gen_u->nam_c); + mar = u3i_string("error"); + dat = u3i_string("not connected"); + cad = u3nq(c3__soak, dev, mar, dat); + u3_auto_peer( + u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, 0, _lick_poke_bail); + + } /*if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) { _lick_ef_rite(loc_u, wir, dev_d, wut, cmd, dat, cnt); // execute write command @@ -553,6 +582,7 @@ u3_lick_io_init(u3_pier* pir_u) } lic_u->fod_c = c3_calloc(strlen(pax_c)); + lic_u->sil_u = u3s_cue_xeno_init(); strcpy(lic_u->fod_c, pax_c); From 3d249a712bc69e5020383b22e386b17bcbc33a42 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Wed, 26 Apr 2023 22:21:52 -0400 Subject: [PATCH 18/33] fixed disconnect --- pkg/vere/io/lick.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index e61bd68ee4..6bf2c7adb9 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -138,8 +138,9 @@ static void _lick_close_chan(u3_shan* san_u, u3_chan* can_u) { u3_lick* lic_u = san_u->gen_u->lic_u; + u3_agent* gen_u = san_u->gen_u; + gen_u->con_o = c3n; u3_chan* inn_u; - // TODO Write close channel command it should give a disconnect mark to %lick // remove chan from server's connection list. // if ( san_u->can_u == can_u ) { @@ -161,14 +162,15 @@ _lick_close_chan(u3_shan* san_u, u3_chan* can_u) u3_noun wir, cad, dev, dat, mar; wir = u3nc(c3__lick, u3_nul); - dev = u3i_string(san_u->gen_u->nam_c); + dev = u3i_string(gen_u->nam_c); mar = u3i_string("disconnect"); + dat = u3i_string(""); - cad = u3nq(c3__soak, dev, mar, u3_nul); + cad = u3nq(c3__soak, dev, mar, dat); u3_auto_peer( u3_auto_plan(&lic_u->car_u, - u3_ovum_init(0, c3__k, wir, cad)), + u3_ovum_init(0, c3__l, wir, cad)), 0, 0, _lick_poke_bail); } From ea9d448f1bfe8a008c001661a4850a160397f9b9 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 27 Apr 2023 15:30:39 -0400 Subject: [PATCH 19/33] changed name from term to path --- pkg/vere/io/lick.c | 105 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 6bf2c7adb9..c67bf7c8b3 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -46,6 +46,50 @@ static const c3_c URB_DEV_PATH[] = "/.urb/dev/"; +/* _lick_it_path(): path for ipc files +*/ +static c3_c* +_lick_it_path(u3_noun pax) +{ + c3_w len_w = 0; + c3_c *pas_c; + + // measure + // + { + u3_noun wiz = pax; + + while ( u3_nul != wiz ) { + len_w += (1 + u3r_met(3, u3h(wiz))); + wiz = u3t(wiz); + } + } + + // cut + // + pas_c = c3_malloc(len_w + 1); + pas_c[len_w] = '\0'; + { + u3_noun wiz = pax; + c3_c* waq_c = pas_c; + + while ( u3_nul != wiz ) { + c3_w tis_w = u3r_met(3, u3h(wiz)); + + if ( (u3_nul == u3t(wiz)) ) { + *waq_c++ = '/'; + } else *waq_c++ = '/'; + + u3r_bytes(0, tis_w, (c3_y*)waq_c, u3h(wiz)); + waq_c += tis_w; + + wiz = u3t(wiz); + } + *waq_c = 0; + } + u3z(pax); + return pas_c; +} /* _lick_send_noun(): jam and send noun over chan. */ static void @@ -215,11 +259,11 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) can_u->coq_l = san_u->nex_l++; can_u->san_u = san_u; err_i = uv_timer_init(u3L, &can_u->mor_u.tim_u); - c3_assert(!err_i); + u3_assert(!err_i); err_i = uv_pipe_init(u3L, &can_u->mor_u.pyp_u, 0); - c3_assert(!err_i); + u3_assert(!err_i); err_i = uv_accept(sem_u, (uv_stream_t*)&can_u->mor_u.pyp_u); - c3_assert(!err_i); + u3_assert(!err_i); u3_newt_read((u3_moat*)&can_u->mor_u); can_u->mor_u.nex_u = (u3_moor*)san_u->can_u; san_u->can_u = can_u; @@ -228,7 +272,7 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) wir = u3nc(c3__lick, u3_nul); dev = u3i_string(gen_u->nam_c); - mar = u3i_string("connected"); + mar = u3i_string("connect"); dat = u3i_string(""); cad = u3nq(c3__soak, dev, mar, dat); u3_auto_peer( @@ -250,8 +294,8 @@ _lick_close_sock(u3_shan* san_u) u3l_log("lick: closing %s/%s/%s",pax_c, URB_DEV_PATH, san_u->gen_u->nam_c); - c3_assert(wit_i > 0); - c3_assert(len_w == (c3_w)wit_i + 1); + u3_assert(wit_i > 0); + u3_assert(len_w == (c3_w)wit_i + 1); if ( 0 != unlink(paf_c) ) { if ( ENOENT != errno ) { @@ -265,6 +309,39 @@ _lick_close_sock(u3_shan* san_u) c3_free(paf_c); } +/* _lick_mkdirp(): recursive mkdir of dirname of pax_c. +*/ +static void +_lick_mkdirp(c3_c* por_c) +{ + c3_c pax_c[2048]; + + strncpy(pax_c, por_c, sizeof(pax_c)); + + + + c3_c* sas_c = strrchr(pax_c, '/'); + if ( sas_c != NULL ) { + *sas_c = '\0'; + } else + { + u3l_log("lick: bad path %s", pax_c); + u3_king_bail(); + } + + c3_c* fas_c = strchr(pax_c + 1, '/'); + + while ( fas_c ) { + *fas_c = 0; + if ( 0 != mkdir(pax_c, 0777) && EEXIST != errno ) { + u3l_log("unix: mkdir %s: %s", pax_c, strerror(errno)); + u3m_bail(c3__fail); + } + *fas_c++ = '/'; + fas_c = strchr(fas_c, '/'); + } +} + /* _lick_init_sock(): initialize socket device. */ @@ -294,6 +371,9 @@ _lick_init_sock(u3_shan* san_u) strcat(por_c, URB_DEV_PATH); strcat(por_c, gen_u->nam_c); + _lick_mkdirp(por_c); + u3l_log("lick por_c: %s", por_c); + if ( 0 != unlink(por_c) && errno != ENOENT ) { u3l_log("lick: unlink: %s", uv_strerror(errno)); goto _lick_sock_err_chdir; @@ -339,9 +419,9 @@ static void _lick_ef_shut(u3_lick* lic_u, u3_noun nam) { - u3l_log("lick shut: %s", u3r_string(nam)); - c3_c* nam_c = u3r_string(nam); + c3_c* nam_c = _lick_it_path(nam); + u3l_log("lick shut: %s", nam_c); u3_agent* cur_u = lic_u->gen_u; u3_agent* las_u; @@ -379,12 +459,13 @@ static void _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) { - u3l_log("lick spin: %s", u3r_string(nam)); - u3_agent* gen_u = c3_calloc(sizeof(*gen_u)); gen_u->san_u = c3_calloc(sizeof(*gen_u->san_u)); gen_u->san_u->can_u = c3_calloc(sizeof(*gen_u->san_u->can_u)); - gen_u->nam_c = u3r_string(nam); + gen_u->nam_c = _lick_it_path(nam); + + u3l_log("lick spin: %s", gen_u->nam_c); + gen_u->lic_u = lic_u; gen_u->san_u->gen_u = gen_u; gen_u->con_o = c3n; @@ -560,7 +641,7 @@ _lick_io_exit(u3_auto* car_u) cur_u = nex_u; } - //u3s_cue_xeno_done(lic_u->sil_u); + u3s_cue_xeno_done(lic_u->sil_u); c3_free(lic_u); } From 4413d2063db5ef914bac42960dedd0e820aa0d01 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 27 Apr 2023 16:09:37 -0400 Subject: [PATCH 20/33] cleaned up motes.h --- pkg/c3/motes.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 2870091534..992727cae5 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -113,6 +113,7 @@ # define c3__bond c3_s4('b','o','n','d') # define c3__bone c3_s4('b','o','n','e') # define c3__bong c3_s4('b','o','n','g') +# define c3__book c3_s4('b','o','o','k') # define c3__bool c3_s4('b','o','o','l') # define c3__boot c3_s4('b','o','o','t') # define c3__born c3_s4('b','o','r','n') @@ -220,7 +221,6 @@ # define c3__clsg c3_s4('c','l','s','g') # define c3__clsp c3_s4('c','l','s','p') # define c3__cltr c3_s4('c','l','t','r') -# define c3__cmd c3_s3('c','m','d') # define c3__cnbc c3_s4('c','n','b','c') # define c3__cnbr c3_s4('c','n','b','r') # define c3__cncb c3_s4('c','n','c','b') @@ -744,7 +744,6 @@ # define c3__meh c3_s3('m','e','h') # define c3__meld c3_s4('m','e','l','d') # define c3__melt c3_s4('m','e','l','t') -# define c3__mem c3_s3('m','e','m') # define c3__meme c3_s4('m','e','m','e') # define c3__memo c3_s4('m','e','m','o') # define c3__menu c3_s4('m','e','n','u') @@ -986,7 +985,6 @@ # define c3__rond c3_s4('r','o','n','d') # define c3__root c3_s4('r','o','o','t') # define c3__rose c3_s4('r','o','s','e') -# define c3__rote c3_s4('r','o','t','e') # define c3__rsh c3_s3('r','s','h') # define c3__rulf c3_s4('r','u','l','f') # define c3__run c3_s3('r','u','n') @@ -1008,7 +1006,6 @@ # define c3__see c3_s3('s','e','e') # define c3__seed c3_s4('s','e','e','d') # define c3__seek c3_s4('s','e','e','k') -# define c3__seen c3_s4('s','e','e','n') # define c3__seft c3_s4('s','e','f','t') # define c3__sell c3_s4('s','e','l','l') # define c3__semp c3_s4('s','e','m','p') @@ -1094,7 +1091,6 @@ # define c3__sort c3_s4('s','o','r','t') # define c3__spal c3_s4('s','p','a','l') # define c3__spar c3_s4('s','p','a','r') -# define c3__spew c3_s4('s','p','e','w') # define c3__spig c3_s4('s','p','i','g') # define c3__spil c3_s4('s','p','i','l') # define c3__spin c3_s4('s','p','i','n') @@ -1221,6 +1217,7 @@ # define c3__tung c3_s4('t','u','n','g') # define c3__tupl c3_s4('t','u','p','l') # define c3__turd c3_s4('t','u','r','d') +# define c3__turn c3_s4('t','u','r','n') # define c3__turf c3_s4('t','u','r','f') # define c3__twig c3_s4('t','w','i','g') # define c3__twix c3_s4('t','w','i','x') @@ -1298,7 +1295,6 @@ # define c3__work c3_s4('w','o','r','k') # define c3__wost c3_s4('w','o','s','t') # define c3__wrap c3_s4('w','r','a','p') -# define c3__writ c3_s4('w','r','i','t') # define c3__wtbr c3_s4('w','t','b','r') # define c3__wtcb c3_s4('w','t','c','b') # define c3__wtcl c3_s4('w','t','c','l') From fcc72c4da830236b4682337ba4e566e83325c55c Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 27 Apr 2023 16:23:16 -0400 Subject: [PATCH 21/33] clean up some files made connect and disconenct info wotk with path --- pkg/vere/io/lick.c | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index c67bf7c8b3..79bf3d7a5a 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -29,6 +29,7 @@ */ typedef struct _u3_agent { c3_c* nam_c; // name of device + u3_noun nam; c3_o con_o; struct _u3_shan* san_u; // server reference struct _u3_lick* lic_u; // device backpointer @@ -90,6 +91,7 @@ _lick_it_path(u3_noun pax) u3z(pax); return pas_c; } + /* _lick_send_noun(): jam and send noun over chan. */ static void @@ -163,7 +165,7 @@ _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) } wir = u3nc(c3__lick, u3_nul); - dev = u3i_string(gen_u->nam_c); + dev = gen_u->nam; cad = u3nt(c3__soak, dev, put); u3_auto_peer( u3_auto_plan(&lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), @@ -206,9 +208,9 @@ _lick_close_chan(u3_shan* san_u, u3_chan* can_u) u3_noun wir, cad, dev, dat, mar; wir = u3nc(c3__lick, u3_nul); - dev = u3i_string(gen_u->nam_c); + dev = gen_u->nam; mar = u3i_string("disconnect"); - dat = u3i_string(""); + dat = u3_nul; cad = u3nq(c3__soak, dev, mar, dat); @@ -271,9 +273,10 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) u3l_log("lick: sock cb"); wir = u3nc(c3__lick, u3_nul); - dev = u3i_string(gen_u->nam_c); + dev = gen_u->nam; mar = u3i_string("connect"); - dat = u3i_string(""); + dat = u3_nul; + cad = u3nq(c3__soak, dev, mar, dat); u3_auto_peer( u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), @@ -348,7 +351,6 @@ _lick_mkdirp(c3_c* por_c) static void _lick_init_sock(u3_shan* san_u) { - // the full socket path is limited to about 108 characters, // and we want it to be relative to the pier. save our current // path, chdir to the pier, open the socket at the desired @@ -418,8 +420,6 @@ _lick_sock_err_chdir: static void _lick_ef_shut(u3_lick* lic_u, u3_noun nam) { - - c3_c* nam_c = _lick_it_path(nam); u3l_log("lick shut: %s", nam_c); @@ -450,6 +450,8 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) las_u->nex_u = cur_u->nex_u; _lick_close_sock(cur_u->san_u); c3_free(cur_u); + + // XX We should delete empty folders in the pier/.urb/dev path } @@ -458,13 +460,11 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) static void _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) { - u3_agent* gen_u = c3_calloc(sizeof(*gen_u)); gen_u->san_u = c3_calloc(sizeof(*gen_u->san_u)); gen_u->san_u->can_u = c3_calloc(sizeof(*gen_u->san_u->can_u)); gen_u->nam_c = _lick_it_path(nam); - - u3l_log("lick spin: %s", gen_u->nam_c); + gen_u->nam = nam; gen_u->lic_u = lic_u; gen_u->san_u->gen_u = gen_u; @@ -528,7 +528,6 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) ret_o=c3y; } else if ( c3__spit == tag ) { - u3l_log("lick: spit "); ret_o=c3y; if ( c3n == u3r_cell(tmp, &nam, &dat) ){ @@ -550,26 +549,19 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) return c3n; } - if( c3y == gen_u->con_o){ + if( c3y == gen_u->con_o ) { _lick_send_noun(gen_u->san_u->can_u, dat); - } else - { + } else { u3_noun dev, dat, wir, cad, mar; wir = u3nc(c3__lick, u3_nul); - dev = u3i_string(gen_u->nam_c); + dev = gen_u->nam; mar = u3i_string("error"); dat = u3i_string("not connected"); cad = u3nq(c3__soak, dev, mar, dat); u3_auto_peer( u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), 0, 0, _lick_poke_bail); - } - /*if( c3y == u3r_qual(tmp, &wut, &cmd, &dat, &cnt) ) - { - _lick_ef_rite(loc_u, wir, dev_d, wut, cmd, dat, cnt); // execute write command - ret_o = c3y; - } else { ret_o = c3n; }*/ } else { ret_o = c3n; @@ -610,7 +602,6 @@ static void _lick_io_talk(u3_auto* car_u) { u3_lick* lic_u = (u3_lick*)car_u; - u3l_log("lick born"); u3_noun wir = u3nc(c3__lick, u3_nul); u3_noun cad = u3nc(c3__born, u3_nul); @@ -629,7 +620,6 @@ static void _lick_io_exit(u3_auto* car_u) { u3_lick* lic_u = (u3_lick*)car_u; - c3_c* pax_c = u3_Host.dir_c; u3_agent* cur_u=lic_u->gen_u; u3_agent* nex_u; @@ -668,10 +658,8 @@ u3_lick_io_init(u3_pier* pir_u) lic_u->sil_u = u3s_cue_xeno_init(); strcpy(lic_u->fod_c, pax_c); - u3_auto* car_u = &lic_u->car_u; car_u->nam_m = c3__lick; - car_u->liv_o = c3n; car_u->io.talk_f = _lick_io_talk; car_u->io.kick_f = _lick_io_kick; From dff69fbde6860ca41a032ae1508f1abab8b831be Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 27 Apr 2023 16:33:23 -0400 Subject: [PATCH 22/33] motes are in alphebitcal order now --- pkg/c3/motes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/c3/motes.h b/pkg/c3/motes.h index 992727cae5..f4449c00e4 100644 --- a/pkg/c3/motes.h +++ b/pkg/c3/motes.h @@ -1217,8 +1217,8 @@ # define c3__tung c3_s4('t','u','n','g') # define c3__tupl c3_s4('t','u','p','l') # define c3__turd c3_s4('t','u','r','d') -# define c3__turn c3_s4('t','u','r','n') # define c3__turf c3_s4('t','u','r','f') +# define c3__turn c3_s4('t','u','r','n') # define c3__twig c3_s4('t','w','i','g') # define c3__twix c3_s4('t','w','i','x') # define c3__txt c3_s3('t','x','t') From 15f01b6cb152b70a5e18c3e5c0bfcf45478f5d22 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Mon, 1 May 2023 20:49:48 -0400 Subject: [PATCH 23/33] fixed more path bugs --- pkg/vere/io/lick.c | 75 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 79bf3d7a5a..864ac9c575 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -29,7 +29,6 @@ */ typedef struct _u3_agent { c3_c* nam_c; // name of device - u3_noun nam; c3_o con_o; struct _u3_shan* san_u; // server reference struct _u3_lick* lic_u; // device backpointer @@ -45,7 +44,50 @@ struct _u3_agent* gen_u; // agent list } u3_lick; -static const c3_c URB_DEV_PATH[] = "/.urb/dev/"; +static const c3_c URB_DEV_PATH[] = "/.urb/dev"; + +/* _unix_string_to_knot(): convert c unix path component to $knot +*/ +static u3_atom +_lick_string_to_knot(c3_c* pax_c) +{ + u3_assert(pax_c); + // XX this can happen if we encounter a file without an extension. + // + // u3_assert(*pax_c); + u3_assert(!strchr(pax_c, '/')); + // XX horrible + // + if ( '!' == *pax_c ) { + pax_c++; + } + return u3i_string(pax_c); +} + + +/* _lick_string_to_path(): convert c string to u3_noun $path +** +** c string must begin with the pier path plus mountpoint +*/ +static u3_noun +_lick_string_to_path(c3_c* pax_c) +{ + u3_noun not; + + //u3_assert(pax_c[-1] == '/'); + c3_c* end_c = strchr(pax_c, '/'); + if ( !end_c ) { + return u3nc(_lick_string_to_knot(pax_c), u3_nul); + } + else { + *end_c = 0; + not = _lick_string_to_knot(pax_c); + *end_c = '/'; + return u3nc(not, _lick_string_to_path(end_c + 1)); + } +} + + /* _lick_it_path(): path for ipc files */ @@ -165,7 +207,7 @@ _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) } wir = u3nc(c3__lick, u3_nul); - dev = gen_u->nam; + dev = _lick_string_to_path(gen_u->nam_c+1); cad = u3nt(c3__soak, dev, put); u3_auto_peer( u3_auto_plan(&lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), @@ -208,7 +250,7 @@ _lick_close_chan(u3_shan* san_u, u3_chan* can_u) u3_noun wir, cad, dev, dat, mar; wir = u3nc(c3__lick, u3_nul); - dev = gen_u->nam; + dev = _lick_string_to_path(gen_u->nam_c+1); mar = u3i_string("disconnect"); dat = u3_nul; @@ -273,7 +315,7 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) u3l_log("lick: sock cb"); wir = u3nc(c3__lick, u3_nul); - dev = gen_u->nam; + dev = _lick_string_to_path(gen_u->nam_c+1); mar = u3i_string("connect"); dat = u3_nul; @@ -320,24 +362,14 @@ _lick_mkdirp(c3_c* por_c) c3_c pax_c[2048]; strncpy(pax_c, por_c, sizeof(pax_c)); - - - c3_c* sas_c = strrchr(pax_c, '/'); - if ( sas_c != NULL ) { - *sas_c = '\0'; - } else - { - u3l_log("lick: bad path %s", pax_c); - u3_king_bail(); - } - c3_c* fas_c = strchr(pax_c + 1, '/'); + u3l_log("lick fas_c: %s", fas_c); while ( fas_c ) { *fas_c = 0; if ( 0 != mkdir(pax_c, 0777) && EEXIST != errno ) { - u3l_log("unix: mkdir %s: %s", pax_c, strerror(errno)); + u3l_log("lick: mkdir %s: %s", pax_c, strerror(errno)); u3m_bail(c3__fail); } *fas_c++ = '/'; @@ -373,8 +405,8 @@ _lick_init_sock(u3_shan* san_u) strcat(por_c, URB_DEV_PATH); strcat(por_c, gen_u->nam_c); - _lick_mkdirp(por_c); u3l_log("lick por_c: %s", por_c); + _lick_mkdirp(por_c); if ( 0 != unlink(por_c) && errno != ENOENT ) { u3l_log("lick: unlink: %s", uv_strerror(errno)); @@ -464,7 +496,6 @@ _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) gen_u->san_u = c3_calloc(sizeof(*gen_u->san_u)); gen_u->san_u->can_u = c3_calloc(sizeof(*gen_u->san_u->can_u)); gen_u->nam_c = _lick_it_path(nam); - gen_u->nam = nam; gen_u->lic_u = lic_u; gen_u->san_u->gen_u = gen_u; @@ -518,7 +549,7 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) else { if ( (c3__spin == tag) ){ nam = u3k(tmp); - _lick_ef_spin(lic_u, wir, nam); // execute spin command + _lick_ef_spin(lic_u, wir, tmp); // execute spin command ret_o = c3y; } else if ( (c3__shut == tag) ) @@ -534,7 +565,7 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) return c3n; } - c3_c* nam_c = u3r_string(nam); + c3_c* nam_c = _lick_it_path(nam); u3_agent* gen_u = NULL; u3_agent* cur_u = lic_u->gen_u; while (cur_u != NULL){ @@ -554,7 +585,7 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) } else { u3_noun dev, dat, wir, cad, mar; wir = u3nc(c3__lick, u3_nul); - dev = gen_u->nam; + dev = _lick_string_to_path(gen_u->nam_c+1); mar = u3i_string("error"); dat = u3i_string("not connected"); cad = u3nq(c3__soak, dev, mar, dat); From c3e5cd881aab328d22922798e6b0b331d9ccea01 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 4 May 2023 09:39:46 -0400 Subject: [PATCH 24/33] code cleanup --- pkg/vere/io/lick.c | 78 +++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 864ac9c575..3fb96b8160 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -5,7 +5,7 @@ #include #include "noun.h" -/* u3_chan: incoming control plane connection. +/* u3_chan: incoming ipc port connection. */ typedef struct _u3_chan { struct _u3_moor mor_u; // message handler @@ -15,56 +15,50 @@ struct _u3_cran* ran_u; // request list } u3_chan; -/* u3_shan: control plane server. +/* u3_shan: ipc port server. */ typedef struct _u3_shan { - uv_pipe_t pyp_u; // server stream handler - c3_l nex_l; // next connection number - struct _u3_agent* gen_u; // agent backpointer - struct _u3_chan* can_u; // connection list + uv_pipe_t pyp_u; // server stream handler + c3_l nex_l; // next connection number + struct _u3_port* gen_u; // port backpointer + struct _u3_chan* can_u; // connection list } u3_shan; -/* u3_device: description of a device +/* u3_port: description of an IPC port */ - typedef struct _u3_agent { - c3_c* nam_c; // name of device + typedef struct _u3_port { + c3_c* nam_c; // name of port c3_o con_o; - struct _u3_shan* san_u; // server reference - struct _u3_lick* lic_u; // device backpointer - struct _u3_agent* nex_u; // next pointer - } u3_agent; + struct _u3_shan* san_u; // server reference + struct _u3_lick* lic_u; // device backpointer + struct _u3_port* nex_u; // next pointer + } u3_port; /* u3_lick: a list of devices */ typedef struct _u3_lick { - u3_auto car_u; // driver - c3_c* fod_c; // IPC folder location - u3_cue_xeno* sil_u; // cue handle - struct _u3_agent* gen_u; // agent list + u3_auto car_u; // driver + c3_c* fod_c; // IPC folder location + u3_cue_xeno* sil_u; // cue handle + struct _u3_port* gen_u; // port list } u3_lick; static const c3_c URB_DEV_PATH[] = "/.urb/dev"; -/* _unix_string_to_knot(): convert c unix path component to $knot +/* _lick_string_to_knot(): convert c unix path component to $knot */ static u3_atom _lick_string_to_knot(c3_c* pax_c) { u3_assert(pax_c); - // XX this can happen if we encounter a file without an extension. - // - // u3_assert(*pax_c); u3_assert(!strchr(pax_c, '/')); - // XX horrible - // if ( '!' == *pax_c ) { pax_c++; } return u3i_string(pax_c); } - /* _lick_string_to_path(): convert c string to u3_noun $path ** ** c string must begin with the pier path plus mountpoint @@ -87,8 +81,6 @@ _lick_string_to_path(c3_c* pax_c) } } - - /* _lick_it_path(): path for ipc files */ static c3_c* @@ -147,7 +139,6 @@ _lick_send_noun(u3_chan* can_u, u3_noun nun) u3_newt_send((u3_mojo*)&can_u->mor_u, len_d, byt_y); } - /* _lick_mote_free(): u3_moat-shaped close callback. */ static void @@ -165,7 +156,6 @@ _lick_close_cb(uv_handle_t* had_u) //c3_free(had_u); } - /* _lick_poke_bail(): error function on failed poke */ static void @@ -177,7 +167,6 @@ _lick_poke_bail(u3_ovum* egg_u, u3_noun lud) u3_ovum_free(egg_u); } - /* _lick_moor_poke(): called on message read from u3_moor. */ static void @@ -188,7 +177,7 @@ _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) u3_noun dev, nam, dat, wir, cad; u3_chan* can_u = (u3_chan*)ptr_v; - u3_agent* gen_u = can_u->san_u->gen_u; + u3_port* gen_u = can_u->san_u->gen_u; u3_lick* lic_u = gen_u->lic_u; c3_i err_i = 0; c3_c* err_c; @@ -226,7 +215,7 @@ static void _lick_close_chan(u3_shan* san_u, u3_chan* can_u) { u3_lick* lic_u = san_u->gen_u->lic_u; - u3_agent* gen_u = san_u->gen_u; + u3_port* gen_u = san_u->gen_u; gen_u->con_o = c3n; u3_chan* inn_u; // remove chan from server's connection list. @@ -265,7 +254,6 @@ _lick_close_chan(u3_shan* san_u, u3_chan* can_u) u3_newt_moat_stop((u3_moat*)&can_u->mor_u, _lick_moat_free); } - /* _lick_moor_bail(): error callback for u3_moor. */ static void @@ -291,7 +279,7 @@ static void _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) { u3_shan* san_u = (u3_shan*)sem_u; - u3_agent* gen_u = san_u->gen_u; + u3_port* gen_u = san_u->gen_u; u3_noun dev, dat, wir, cad, mar; u3_chan* can_u; c3_i err_i; @@ -325,8 +313,7 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) 0, 0, _lick_poke_bail); } - -/* _lick_close_sock(): close an agent's socket +/* _lick_close_sock(): close an port's socket */ static void _lick_close_sock(u3_shan* san_u) @@ -377,7 +364,6 @@ _lick_mkdirp(c3_c* por_c) } } - /* _lick_init_sock(): initialize socket device. */ static void @@ -391,7 +377,7 @@ _lick_init_sock(u3_shan* san_u) c3_c pax_c[2048]; c3_i err_i; c3_c por_c[2048] = "."; - u3_agent* gen_u = san_u->gen_u; + u3_port* gen_u = san_u->gen_u; if ( NULL == getcwd(pax_c, sizeof(pax_c)) ) { u3l_log("lick: getcwd: %s", uv_strerror(errno)); @@ -455,8 +441,8 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) c3_c* nam_c = _lick_it_path(nam); u3l_log("lick shut: %s", nam_c); - u3_agent* cur_u = lic_u->gen_u; - u3_agent* las_u; + u3_port* cur_u = lic_u->gen_u; + u3_port* las_u; if ( (NULL != cur_u) && (NULL != cur_u->nam_c) && ( 0 == strcmp(cur_u->nam_c, nam_c) ) ) @@ -492,7 +478,7 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) static void _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) { - u3_agent* gen_u = c3_calloc(sizeof(*gen_u)); + u3_port* gen_u = c3_calloc(sizeof(*gen_u)); gen_u->san_u = c3_calloc(sizeof(*gen_u->san_u)); gen_u->san_u->can_u = c3_calloc(sizeof(*gen_u->san_u->can_u)); gen_u->nam_c = _lick_it_path(nam); @@ -501,7 +487,7 @@ _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) gen_u->san_u->gen_u = gen_u; gen_u->con_o = c3n; - u3_agent* hed_u = lic_u->gen_u; + u3_port* hed_u = lic_u->gen_u; if( NULL == lic_u->gen_u ) { @@ -510,7 +496,7 @@ _lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) } else { - u3_agent* las_u = lic_u->gen_u; + u3_port* las_u = lic_u->gen_u; while ( NULL != las_u->nex_u ) { @@ -566,8 +552,8 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) } c3_c* nam_c = _lick_it_path(nam); - u3_agent* gen_u = NULL; - u3_agent* cur_u = lic_u->gen_u; + u3_port* gen_u = NULL; + u3_port* cur_u = lic_u->gen_u; while (cur_u != NULL){ if( 0 == strcmp(cur_u->nam_c, nam_c) ) { gen_u = cur_u; @@ -652,8 +638,8 @@ _lick_io_exit(u3_auto* car_u) { u3_lick* lic_u = (u3_lick*)car_u; - u3_agent* cur_u=lic_u->gen_u; - u3_agent* nex_u; + u3_port* cur_u=lic_u->gen_u; + u3_port* nex_u; while( NULL != cur_u ) { _lick_close_sock(cur_u->san_u); From ee4659fee15bf2b5f5155722c7ce2a09667d1aaf Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 16 May 2023 16:18:24 -0400 Subject: [PATCH 25/33] vere: decrement zuse to %412 --- pkg/vere/pier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/vere/pier.c b/pkg/vere/pier.c index d4220fb7c8..e0f44235d7 100644 --- a/pkg/vere/pier.c +++ b/pkg/vere/pier.c @@ -676,7 +676,7 @@ _pier_wyrd_fail(u3_pier* pir_u, u3_ovum* egg_u, u3_noun lud) // XX organizing version constants // #define VERE_NAME "vere" -#define VERE_ZUSE 413 +#define VERE_ZUSE 412 #define VERE_LULL 324 /* _pier_wyrd_aver(): check for %wend effect and version downgrade. RETAIN From b7ec50e8faa463f5e5f9ab6dde0683bea6bba38e Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Tue, 6 Jun 2023 08:37:31 -0400 Subject: [PATCH 26/33] cleaned up u3l_logs --- pkg/vere/io/lick.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 3fb96b8160..8b2cf58a77 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -324,8 +324,6 @@ _lick_close_sock(u3_shan* san_u) c3_i wit_i; wit_i = snprintf(paf_c, len_w, "%s/%s/%s", pax_c, URB_DEV_PATH, san_u->gen_u->nam_c); - u3l_log("lick: closing %s/%s/%s",pax_c, URB_DEV_PATH, san_u->gen_u->nam_c); - u3_assert(wit_i > 0); u3_assert(len_w == (c3_w)wit_i + 1); @@ -351,7 +349,6 @@ _lick_mkdirp(c3_c* por_c) strncpy(pax_c, por_c, sizeof(pax_c)); c3_c* fas_c = strchr(pax_c + 1, '/'); - u3l_log("lick fas_c: %s", fas_c); while ( fas_c ) { *fas_c = 0; @@ -391,7 +388,6 @@ _lick_init_sock(u3_shan* san_u) strcat(por_c, URB_DEV_PATH); strcat(por_c, gen_u->nam_c); - u3l_log("lick por_c: %s", por_c); _lick_mkdirp(por_c); if ( 0 != unlink(por_c) && errno != ENOENT ) { @@ -417,7 +413,6 @@ _lick_init_sock(u3_shan* san_u) u3l_log("lick: chdir: %s", uv_strerror(errno)); goto _lick_sock_err_close; } - u3l_log("lick: listening on %s/%s", u3_Host.dir_c, por_c); return; _lick_sock_err_close: @@ -585,7 +580,6 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) } } - u3l_log("lick kick done"); return ret_o; } From 3640040fea76d8d90dcf475346f3c66801cbb3cd Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 8 Jun 2023 20:43:44 -0400 Subject: [PATCH 27/33] changed to kelvin 412 --- pkg/vere/pier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/vere/pier.c b/pkg/vere/pier.c index d4220fb7c8..e0f44235d7 100644 --- a/pkg/vere/pier.c +++ b/pkg/vere/pier.c @@ -676,7 +676,7 @@ _pier_wyrd_fail(u3_pier* pir_u, u3_ovum* egg_u, u3_noun lud) // XX organizing version constants // #define VERE_NAME "vere" -#define VERE_ZUSE 413 +#define VERE_ZUSE 412 #define VERE_LULL 324 /* _pier_wyrd_aver(): check for %wend effect and version downgrade. RETAIN From 75c2de5a438521d0b28a2cc95ffa689efa7168a9 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Thu, 25 May 2023 13:56:02 -0400 Subject: [PATCH 28/33] cleaned up some print out --- pkg/vere/io/lick.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 8b2cf58a77..02f3487818 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -172,7 +172,6 @@ _lick_poke_bail(u3_ovum* egg_u, u3_noun lud) static void _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) { - u3l_log("lick poke"); u3_weak put; u3_noun dev, nam, dat, wir, cad; @@ -300,7 +299,6 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) can_u->mor_u.nex_u = (u3_moor*)san_u->can_u; san_u->can_u = can_u; gen_u->con_o = c3y; - u3l_log("lick: sock cb"); wir = u3nc(c3__lick, u3_nul); dev = _lick_string_to_path(gen_u->nam_c+1); @@ -332,9 +330,7 @@ _lick_close_sock(u3_shan* san_u) u3l_log("lick: failed to unlink socket: %s", uv_strerror(errno)); } } - else { - // u3l_log("lick: unlinked %s", paf_c); - } + uv_close((uv_handle_t*)&san_u->pyp_u, _lick_close_cb); c3_free(paf_c); } @@ -434,7 +430,6 @@ static void _lick_ef_shut(u3_lick* lic_u, u3_noun nam) { c3_c* nam_c = _lick_it_path(nam); - u3l_log("lick shut: %s", nam_c); u3_port* cur_u = lic_u->gen_u; u3_port* las_u; From abb9d7301430fcd3a2047e6e372ee350360bf9c2 Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Fri, 16 Jun 2023 12:45:15 -0400 Subject: [PATCH 29/33] modified lick.c during review with @joemf --- pkg/vere/io/lick.c | 320 ++++++++++++++++++++------------------------- 1 file changed, 145 insertions(+), 175 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 02f3487818..e80bdca476 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -7,42 +7,41 @@ /* u3_chan: incoming ipc port connection. */ - typedef struct _u3_chan { - struct _u3_moor mor_u; // message handler - c3_l coq_l; // connection number - c3_o liv_o; // connection live - struct _u3_shan* san_u; // server backpointer - struct _u3_cran* ran_u; // request list - } u3_chan; +typedef struct _u3_chan { + struct _u3_moor mor_u; // message handler + c3_l coq_l; // connection number + c3_o liv_o; // connection live + struct _u3_shan* san_u; // server backpointer +} u3_chan; /* u3_shan: ipc port server. */ - typedef struct _u3_shan { - uv_pipe_t pyp_u; // server stream handler - c3_l nex_l; // next connection number - struct _u3_port* gen_u; // port backpointer - struct _u3_chan* can_u; // connection list - } u3_shan; +typedef struct _u3_shan { + uv_pipe_t pyp_u; // server stream handler + c3_l nex_l; // next connection number + struct _u3_port* gen_u; // port backpointer + struct _u3_chan* can_u; // connection list +} u3_shan; /* u3_port: description of an IPC port - */ - typedef struct _u3_port { - c3_c* nam_c; // name of port - c3_o con_o; - struct _u3_shan* san_u; // server reference - struct _u3_lick* lic_u; // device backpointer - struct _u3_port* nex_u; // next pointer - } u3_port; +*/ +typedef struct _u3_port { + c3_c* nam_c; // name of port + c3_o con_o; + struct _u3_shan* san_u; // server reference + struct _u3_lick* lic_u; // device backpointer + struct _u3_port* nex_u; // next pointer +} u3_port; /* u3_lick: a list of devices */ - typedef struct _u3_lick { - u3_auto car_u; // driver - c3_c* fod_c; // IPC folder location - u3_cue_xeno* sil_u; // cue handle - struct _u3_port* gen_u; // port list - } u3_lick; +typedef struct _u3_lick { + u3_auto car_u; // driver + c3_c* fod_c; // IPC folder location + u3_cue_xeno* sil_u; // cue handle + struct _u3_port* gen_u; // port list +} u3_lick; static const c3_c URB_DEV_PATH[] = "/.urb/dev"; @@ -144,7 +143,7 @@ _lick_send_noun(u3_chan* can_u, u3_noun nun) static void _lick_moat_free(void* ptr_v, ssize_t err_i, const c3_c* err_c) { - //c3_free(ptr_v); + c3_free((u3_chan*)ptr_v); } /* _lick_close_cb(): socket close callback. @@ -152,19 +151,7 @@ _lick_moat_free(void* ptr_v, ssize_t err_i, const c3_c* err_c) static void _lick_close_cb(uv_handle_t* had_u) { - //Freeing had_u gives an out of loom error. no idea why - //c3_free(had_u); -} - -/* _lick_poke_bail(): error function on failed poke -*/ -static void -_lick_poke_bail(u3_ovum* egg_u, u3_noun lud) -{ - u3_lick* lic_u = (u3_lick*)egg_u->car_u; - u3_chan* can_u; - u3_noun wir = egg_u->wir; - u3_ovum_free(egg_u); + c3_free((u3_shan*)had_u); } /* _lick_moor_poke(): called on message read from u3_moor. @@ -176,7 +163,7 @@ _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) u3_noun dev, nam, dat, wir, cad; u3_chan* can_u = (u3_chan*)ptr_v; - u3_port* gen_u = can_u->san_u->gen_u; + u3_port* gen_u = can_u->san_u->gen_u; u3_lick* lic_u = gen_u->lic_u; c3_i err_i = 0; c3_c* err_c; @@ -188,10 +175,10 @@ _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) can_u->mor_u.bal_f(can_u, -1, "cue-none"); return; } - if ( (c3n == u3r_cell(put, &nam, &dat)) ) - { - err_i = -2; err_c = "put-bad"; - goto _moor_poke_out; + if ( c3n == u3r_cell(put, &nam, &dat) ) { + can_u->mor_u.bal_f(can_u, -2, "put-bad"); + u3z(put); + return; } wir = u3nc(c3__lick, u3_nul); @@ -199,21 +186,16 @@ _lick_moor_poke(void* ptr_v, c3_d len_d, c3_y* byt_y) cad = u3nt(c3__soak, dev, put); u3_auto_peer( u3_auto_plan(&lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, 0, _lick_poke_bail); - return; -_moor_poke_out: - if ( 0 != err_i ) { - can_u->mor_u.bal_f(can_u, err_i, err_c); - } - + 0, 0, 0); } /* _lick_close_chan(): close given channel, freeing. */ static void -_lick_close_chan(u3_shan* san_u, u3_chan* can_u) +_lick_close_chan(u3_chan* can_u) { - u3_lick* lic_u = san_u->gen_u->lic_u; + u3_shan* san_u = can_u->san_u; + u3_lick* lic_u = san_u->gen_u->lic_u; u3_port* gen_u = san_u->gen_u; gen_u->con_o = c3n; u3_chan* inn_u; @@ -232,7 +214,7 @@ _lick_close_chan(u3_shan* san_u, u3_chan* can_u) } can_u->mor_u.nex_u = NULL; - { + if ( NULL == san_u->can_u ) { // send a close event to arvo and stop reading. // u3_noun wir, cad, dev, dat, mar; @@ -247,7 +229,7 @@ _lick_close_chan(u3_shan* san_u, u3_chan* can_u) u3_auto_peer( u3_auto_plan(&lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, 0, _lick_poke_bail); + 0, 0, 0); } u3_newt_moat_stop((u3_moat*)&can_u->mor_u, _lick_moat_free); @@ -259,7 +241,6 @@ static void _lick_moor_bail(void* ptr_v, ssize_t err_i, const c3_c* err_c) { u3_chan* can_u = (u3_chan*)ptr_v; - u3_shan* san_u = can_u->san_u; if ( err_i != UV_EOF ) { u3l_log("lick: moor bail %zd %s", err_i, err_c); @@ -269,7 +250,7 @@ _lick_moor_bail(void* ptr_v, ssize_t err_i, const c3_c* err_c) can_u->liv_o = c3n; } } - _lick_close_chan(san_u, can_u); + _lick_close_chan(can_u); } /* _lick_sock_cb(): socket connection callback. @@ -278,8 +259,7 @@ static void _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) { u3_shan* san_u = (u3_shan*)sem_u; - u3_port* gen_u = san_u->gen_u; - u3_noun dev, dat, wir, cad, mar; + u3_port* gen_u = san_u->gen_u; u3_chan* can_u; c3_i err_i; @@ -300,15 +280,19 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) san_u->can_u = can_u; gen_u->con_o = c3y; - wir = u3nc(c3__lick, u3_nul); - dev = _lick_string_to_path(gen_u->nam_c+1); - mar = u3i_string("connect"); - dat = u3_nul; + // only send on first connection + if ( NULL == can_u->mor_u.nex_u ) { + u3_noun dev, dat, wir, cad, mar; + wir = u3nc(c3__lick, u3_nul); + dev = _lick_string_to_path(gen_u->nam_c+1); + mar = u3i_string("connect"); + dat = u3_nul; - cad = u3nq(c3__soak, dev, mar, dat); - u3_auto_peer( - u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, 0, _lick_poke_bail); + cad = u3nq(c3__soak, dev, mar, dat); + u3_auto_peer( + u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, 0, 0); + } } /* _lick_close_sock(): close an port's socket @@ -432,33 +416,23 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) c3_c* nam_c = _lick_it_path(nam); u3_port* cur_u = lic_u->gen_u; - u3_port* las_u; + u3_port* las_u = NULL; - if ( (NULL != cur_u) && (NULL != cur_u->nam_c) && - ( 0 == strcmp(cur_u->nam_c, nam_c) ) ) - { - lic_u->gen_u = cur_u->nex_u; - _lick_close_sock(cur_u->san_u); - c3_free(cur_u); - return; - } - - while ( (NULL != cur_u) && (NULL != cur_u->nam_c) && - ( 0 != strcmp(cur_u->nam_c, nam_c) ) ) - { + while ( NULL != cur_u ) { + if ( 0 == strcmp(cur_u->nam_c, nam_c) ) { + _lick_close_sock(cur_u->san_u); + if( las_u == NULL ) { + lic_u->gen_u = cur_u->nex_u; + } + else { + las_u->nex_u = cur_u->nex_u; + } + c3_free(cur_u); + return; + } las_u = cur_u; cur_u = cur_u->nex_u; } - - if ( NULL == cur_u ) - { - return; - } - - las_u->nex_u = cur_u->nex_u; - _lick_close_sock(cur_u->san_u); - c3_free(cur_u); - // XX We should delete empty folders in the pier/.urb/dev path } @@ -466,45 +440,72 @@ _lick_ef_shut(u3_lick* lic_u, u3_noun nam) /* u3_lick_ef_spin(): Open an IPC port */ static void -_lick_ef_spin(u3_lick* lic_u, u3_noun wir_i, u3_noun nam) +_lick_ef_spin(u3_lick* lic_u, u3_noun nam) { - u3_port* gen_u = c3_calloc(sizeof(*gen_u)); - gen_u->san_u = c3_calloc(sizeof(*gen_u->san_u)); - gen_u->san_u->can_u = c3_calloc(sizeof(*gen_u->san_u->can_u)); - gen_u->nam_c = _lick_it_path(nam); + c3_c* nam_c = _lick_it_path(nam); + u3_port* las_u = lic_u->gen_u; - gen_u->lic_u = lic_u; + while ( NULL != las_u ) { + if( 0 == strcmp(las_u->nam_c, nam_c) ) { + c3_free(nam_c); + return; + } + las_u = las_u->nex_u; + } + u3_port* gen_u = c3_calloc(sizeof(*gen_u)); + gen_u->san_u = c3_calloc(sizeof(*gen_u->san_u)); + + gen_u->lic_u = lic_u; gen_u->san_u->gen_u = gen_u; - gen_u->con_o = c3n; + gen_u->nam_c = nam_c; + gen_u->con_o = c3n; - u3_port* hed_u = lic_u->gen_u; - - if( NULL == lic_u->gen_u ) - { - _lick_init_sock(gen_u->san_u); + _lick_init_sock(gen_u->san_u); + if ( NULL == las_u) { lic_u->gen_u = gen_u; } - else - { - u3_port* las_u = lic_u->gen_u; + else las_u->nex_u = gen_u; +} - while ( NULL != las_u->nex_u ) - { - if( 0 == strcmp(las_u->nam_c, gen_u->nam_c) ) - { - return; - } - las_u = las_u->nex_u; +/* _lick_ef_spit(): spit effects to port +*/ +static void +_lick_ef_spit(u3_lick* lic_u, u3_noun nam, u3_noun dat) +{ + c3_c* nam_c = _lick_it_path(nam); + u3_port* gen_u = NULL; + u3_port* cur_u = lic_u->gen_u; + while (cur_u != NULL){ + if( 0 == strcmp(cur_u->nam_c, nam_c) ) { + gen_u = cur_u; + break; } + cur_u = cur_u->nex_u; + } + if ( NULL == gen_u ) { + u3l_log("lick: spit: gen %s not found", nam_c); + u3z(dat); + return; + } - if( 0 != strcmp(las_u->nam_c, gen_u->nam_c) ) - { - _lick_init_sock(gen_u->san_u); - las_u->nex_u = gen_u; - } + if( c3y == gen_u->con_o ) { + _lick_send_noun(gen_u->san_u->can_u, dat); + } + else { + u3_noun dev, wir, cad, mar; + u3z(dat); + wir = u3nc(c3__lick, u3_nul); + dev = _lick_string_to_path(gen_u->nam_c+1); + mar = u3i_string("error"); + dat = u3i_string("not connected"); + cad = u3nq(c3__soak, dev, mar, dat); + u3_auto_peer( + u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), + 0, 0, 0); } } + /* _lick_io_kick(): apply effects. */ static c3_o @@ -520,61 +521,30 @@ _lick_io_kick(u3_auto* car_u, u3_noun wir, u3_noun cad) || (c3n == u3r_cell(cad, &tag, &tmp)) || (c3__lick != i_wir) ) { - return c3n; + ret_o = c3n; } else { - if ( (c3__spin == tag) ){ - nam = u3k(tmp); - _lick_ef_spin(lic_u, wir, tmp); // execute spin command + if ( (c3__spin == tag) ) { + _lick_ef_spin(lic_u, u3k(tmp)); // execute spin command ret_o = c3y; - - } else if ( (c3__shut == tag) ) - { - nam = u3k(tmp); - _lick_ef_shut(lic_u, nam); // execute shut command - ret_o=c3y; - } else if ( c3__spit == tag ) - { - ret_o=c3y; - - if ( c3n == u3r_cell(tmp, &nam, &dat) ){ - return c3n; - } - - c3_c* nam_c = _lick_it_path(nam); - u3_port* gen_u = NULL; - u3_port* cur_u = lic_u->gen_u; - while (cur_u != NULL){ - if( 0 == strcmp(cur_u->nam_c, nam_c) ) { - gen_u = cur_u; - break; - } - cur_u = cur_u->nex_u; - } - if ( NULL == gen_u ){ - u3l_log("lick: spit: gen %s not found", nam_c); - return c3n; - } - - if( c3y == gen_u->con_o ) { - _lick_send_noun(gen_u->san_u->can_u, dat); - } else { - u3_noun dev, dat, wir, cad, mar; - wir = u3nc(c3__lick, u3_nul); - dev = _lick_string_to_path(gen_u->nam_c+1); - mar = u3i_string("error"); - dat = u3i_string("not connected"); - cad = u3nq(c3__soak, dev, mar, dat); - u3_auto_peer( - u3_auto_plan(&gen_u->lic_u->car_u, u3_ovum_init(0, c3__l, wir, cad)), - 0, 0, _lick_poke_bail); + } + else if ( (c3__shut == tag) ) { + _lick_ef_shut(lic_u, u3k(tmp)); // execute shut command + ret_o = c3y; + } + else if ( c3__spit == tag ) { + if ( c3y == u3r_cell(tmp, &nam, &dat) ) { + _lick_ef_spit(lic_u, u3k(nam), u3k(dat)); } + ret_o = c3y; } else { ret_o = c3n; } } + u3z(wir); + u3z(cad); return ret_o; } @@ -595,7 +565,6 @@ _lick_born_news(u3_ovum* egg_u, u3_ovum_news new_e) static void _lick_born_bail(u3_ovum* egg_u, u3_noun lud) { - u3l_log("lick: %%born failure;"); u3z(lud); u3_ovum_free(egg_u); @@ -608,8 +577,8 @@ static void _lick_io_talk(u3_auto* car_u) { u3_lick* lic_u = (u3_lick*)car_u; - u3_noun wir = u3nc(c3__lick, u3_nul); - u3_noun cad = u3nc(c3__born, u3_nul); + u3_noun wir = u3nc(c3__lick, u3_nul); + u3_noun cad = u3nc(c3__born, u3_nul); u3_auto_peer( u3_auto_plan(car_u, u3_ovum_init(0, c3__l, wir, cad)), @@ -625,12 +594,10 @@ _lick_io_talk(u3_auto* car_u) static void _lick_io_exit(u3_auto* car_u) { - u3_lick* lic_u = (u3_lick*)car_u; - - u3_port* cur_u=lic_u->gen_u; - u3_port* nex_u; - while( NULL != cur_u ) - { + u3_lick* lic_u = (u3_lick*)car_u; + u3_port* cur_u = lic_u->gen_u; + u3_port* nex_u; + while ( NULL != cur_u ) { _lick_close_sock(cur_u->san_u); nex_u = cur_u->nex_u; c3_free(cur_u); @@ -654,10 +621,13 @@ u3_lick_io_init(u3_pier* pir_u) strcat(pax_c, u3_Host.dir_c); strcat(pax_c, URB_DEV_PATH); - if( -1 == stat(pax_c, &st) ) { + if ( -1 == stat(pax_c, &st) ) { u3l_log("lick init %s", lic_u->fod_c); u3l_log("lick init mkdir %s",pax_c ); - mkdir(pax_c, 0700); + if ( mkdir(pax_c, 0700) && (errno != EEXIST) ) { + u3l_log("lick cannot make directory"); + u3_king_bail(); + } } lic_u->fod_c = c3_calloc(strlen(pax_c)); From db19588d165476c66bb2be405e8dceea7220728b Mon Sep 17 00:00:00 2001 From: Amadeo Bellotti Date: Mon, 19 Jun 2023 15:54:10 -0400 Subject: [PATCH 30/33] made changes @joemfb requested --- pkg/vere/io/lick.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index e80bdca476..e420057246 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -300,11 +300,11 @@ _lick_sock_cb(uv_stream_t* sem_u, c3_i tas_i) static void _lick_close_sock(u3_shan* san_u) { - c3_c* pax_c = u3_Host.dir_c; - c3_w len_w = strlen(pax_c) + 2 + sizeof(URB_DEV_PATH) + strlen(san_u->gen_u->nam_c); + u3_lick* lic_u = san_u->gen_u->lic_u; + c3_w len_w = strlen(lic_u->fod_c) + strlen(san_u->gen_u->nam_c) + 2; c3_c* paf_c = c3_malloc(len_w); c3_i wit_i; - wit_i = snprintf(paf_c, len_w, "%s/%s/%s", pax_c, URB_DEV_PATH, san_u->gen_u->nam_c); + wit_i = snprintf(paf_c, len_w, "%s/%s", lic_u->fod_c, san_u->gen_u->nam_c); u3_assert(wit_i > 0); u3_assert(len_w == (c3_w)wit_i + 1); @@ -321,7 +321,7 @@ _lick_close_sock(u3_shan* san_u) /* _lick_mkdirp(): recursive mkdir of dirname of pax_c. */ -static void +static c3_o _lick_mkdirp(c3_c* por_c) { c3_c pax_c[2048]; @@ -333,12 +333,12 @@ _lick_mkdirp(c3_c* por_c) while ( fas_c ) { *fas_c = 0; if ( 0 != mkdir(pax_c, 0777) && EEXIST != errno ) { - u3l_log("lick: mkdir %s: %s", pax_c, strerror(errno)); - u3m_bail(c3__fail); + return c3n; } *fas_c++ = '/'; fas_c = strchr(fas_c, '/'); } + return c3y; } /* _lick_init_sock(): initialize socket device. @@ -368,7 +368,10 @@ _lick_init_sock(u3_shan* san_u) strcat(por_c, URB_DEV_PATH); strcat(por_c, gen_u->nam_c); - _lick_mkdirp(por_c); + if ( c3y != _lick_mkdirp(por_c) ) { + u3l_log("lick: mkdir %s: %s", por_c, strerror(errno)); + goto _lick_sock_err_chdir; + } if ( 0 != unlink(por_c) && errno != ENOENT ) { u3l_log("lick: unlink: %s", uv_strerror(errno)); @@ -622,7 +625,6 @@ u3_lick_io_init(u3_pier* pir_u) strcat(pax_c, URB_DEV_PATH); if ( -1 == stat(pax_c, &st) ) { - u3l_log("lick init %s", lic_u->fod_c); u3l_log("lick init mkdir %s",pax_c ); if ( mkdir(pax_c, 0700) && (errno != EEXIST) ) { u3l_log("lick cannot make directory"); @@ -630,9 +632,8 @@ u3_lick_io_init(u3_pier* pir_u) } } - lic_u->fod_c = c3_calloc(strlen(pax_c)); lic_u->sil_u = u3s_cue_xeno_init(); - strcpy(lic_u->fod_c, pax_c); + lic_u->fod_c = strdup(pax_c); u3_auto* car_u = &lic_u->car_u; car_u->nam_m = c3__lick; From dcfb38f681b88408d9cc57db7955bda7ff6eefe3 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 20 Jun 2023 10:53:13 -0400 Subject: [PATCH 31/33] vere: decrement arvo to %237 --- pkg/vere/pier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/vere/pier.c b/pkg/vere/pier.c index e0f44235d7..dc92669ab7 100644 --- a/pkg/vere/pier.c +++ b/pkg/vere/pier.c @@ -814,7 +814,7 @@ _pier_wyrd_card(u3_pier* pir_u) u3_nul); u3_noun kel = u3nl(u3nc(c3__zuse, VERE_ZUSE), // XX from both king and serf? u3nc(c3__lull, VERE_LULL), // XX from both king and serf? - u3nc(c3__arvo, 238), // XX from both king and serf? + u3nc(c3__arvo, 237), // XX from both king and serf? u3nc(c3__hoon, 139), // god_u->hon_y u3nc(c3__nock, 4), // god_u->noc_y u3_none); From ed86accd3ce2ff35298ff4a8c9ec13fab4b9b2ed Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 20 Jun 2023 19:00:22 -0400 Subject: [PATCH 32/33] vere: bump %lull kelvin to %323 --- pkg/vere/pier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/vere/pier.c b/pkg/vere/pier.c index 6f21269063..f3b1879290 100644 --- a/pkg/vere/pier.c +++ b/pkg/vere/pier.c @@ -675,7 +675,7 @@ _pier_wyrd_fail(u3_pier* pir_u, u3_ovum* egg_u, u3_noun lud) // #define VERE_NAME "vere" #define VERE_ZUSE 412 -#define VERE_LULL 324 +#define VERE_LULL 323 /* _pier_wyrd_aver(): check for %wend effect and version downgrade. RETAIN */ From 40006ec4c335b80e50ab96c247c002ba908733c3 Mon Sep 17 00:00:00 2001 From: pkova Date: Tue, 27 Jun 2023 17:36:49 +0300 Subject: [PATCH 33/33] pier: propagate pace to mars --- pkg/vere/pier.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/vere/pier.c b/pkg/vere/pier.c index f3b1879290..1e39d14ef4 100644 --- a/pkg/vere/pier.c +++ b/pkg/vere/pier.c @@ -3,6 +3,7 @@ #include "db/lmdb.h" #include "ent.h" #include "noun.h" +#include "pace.h" #include "vere.h" #include "version.h" @@ -807,7 +808,8 @@ _pier_wyrd_card(u3_pier* pir_u) // XX god_u not necessarily available yet, refactor call sites // - u3_noun ver = u3nt(u3i_string(VERE_NAME), + u3_noun ver = u3nq(u3i_string(VERE_NAME), + u3i_string(U3_VERE_PACE), u3dc("scot", c3__ta, u3i_string(URBIT_VERSION)), u3_nul); u3_noun kel = u3nl(u3nc(c3__zuse, VERE_ZUSE), // XX from both king and serf?