mirror of
https://github.com/urbit/shrub.git
synced 2024-12-22 18:31:44 +03:00
Factor clay
This commit is contained in:
parent
3751e9212d
commit
63438c4b72
@ -451,7 +451,6 @@
|
||||
uv_check_t syn_u; // fs sync check
|
||||
uv_timer_t tim_u; // timer
|
||||
u3_umon* mon_u; // mount points
|
||||
u3_usig* sig_u; // signal list
|
||||
c3_o alm; // timer set
|
||||
c3_o dyr; // ready to update
|
||||
#ifdef SYNCLOG
|
||||
@ -652,13 +651,13 @@
|
||||
c3_c* dir_c; // pier path (no trailing /)
|
||||
c3_d now_d; // event tick
|
||||
uv_loop_t* lup_u; // libuv event loop
|
||||
u3_usig* sig_u; // signal list
|
||||
u3_http* htp_u; // http servers
|
||||
u3_cttp ctp_u; // http clients
|
||||
u3_utel tel_u; // telnet listener
|
||||
u3_utty* uty_u; // linked terminal list
|
||||
u3_save sav_u; // autosave
|
||||
u3_opts ops_u; // commandline options
|
||||
u3_unix unx_u; // sync and clay
|
||||
c3_o liv; // if u3_no, shut down
|
||||
c3_i xit_i; // exit code for shutdown
|
||||
void* ssl_u; // struct SSL_CTX*
|
||||
@ -727,7 +726,8 @@
|
||||
*/
|
||||
typedef struct _u3_pier {
|
||||
c3_c* pax_c; // pier directory
|
||||
c3_c* sys_c; // pill directory
|
||||
c3_c* sys_c; // pill file
|
||||
c3_c* arv_c; // arvo directory
|
||||
c3_d gen_d; // last event discovered
|
||||
c3_d but_d; // boot barrier
|
||||
c3_d key_d[4]; // save and passkey
|
||||
@ -735,6 +735,7 @@
|
||||
u3_lord* god_u; // computer
|
||||
u3_ames* sam_u; // packet interface
|
||||
u3_behn* teh_u; // behn timer
|
||||
u3_unix* unx_u; // sync and clay
|
||||
u3_writ* ent_u; // entry of queue
|
||||
u3_writ* ext_u; // exit of queue
|
||||
} u3_pier;
|
||||
@ -1180,67 +1181,67 @@
|
||||
/* u3_unix_ef_hold():
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_hold();
|
||||
u3_unix_ef_hold(void);
|
||||
|
||||
/* u3_unix_ef_boot(): boot actions
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_boot(void);
|
||||
u3_unix_ef_boot(u3_pier *pir_u);
|
||||
|
||||
/* u3_unix_ef_bake(): initial effects for new process.
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_bake(void);
|
||||
u3_unix_ef_bake(u3_pier *pir_u);
|
||||
|
||||
/* u3_unix_ef_move():
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_move();
|
||||
u3_unix_ef_move(void);
|
||||
|
||||
/* u3_unix_initial_into(): intialize filesystem from urb/zod
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_initial_into();
|
||||
u3_unix_ef_initial_into(u3_pier *pir_u);
|
||||
|
||||
/* u3_unix_ef_look(): update filesystem from unix
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_look(u3_noun all);
|
||||
u3_unix_ef_look(u3_pier *pir_u, u3_noun all);
|
||||
|
||||
/* u3_unix_ef_ergo(): update filesystem from urbit
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_ergo(u3_noun mon, u3_noun can);
|
||||
u3_unix_ef_ergo(u3_pier *pir_u, u3_noun mon, u3_noun can);
|
||||
|
||||
/* u3_unix_ef_ogre(): delete mount point
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_ogre(u3_noun mon);
|
||||
u3_unix_ef_ogre(u3_pier *pir_u, u3_noun mon);
|
||||
|
||||
/* u3_unix_ef_hill(): enumerate mount points
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_hill(u3_noun hil);
|
||||
u3_unix_ef_hill(u3_pier *pir_u, u3_noun hil);
|
||||
|
||||
/* u3_unix_io_init(): initialize storage.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_init(void);
|
||||
u3_unix_io_init(u3_pier *pir_u);
|
||||
|
||||
/* u3_unix_io_talk(): start listening for fs events.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_talk(void);
|
||||
u3_unix_io_talk(u3_pier *pir_u);
|
||||
|
||||
/* u3_unix_io_exit(): terminate storage.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_exit(void);
|
||||
u3_unix_io_exit(u3_pier *pir_u);
|
||||
|
||||
/* u3_unix_io_poll(): update storage state.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_poll(void);
|
||||
u3_unix_io_poll(u3_pier *pir_u);
|
||||
|
||||
|
||||
/** behn, just a timer.
|
||||
|
33
vere/king.c
33
vere/king.c
@ -256,6 +256,37 @@ void _king_socket_connect(uv_stream_t *sock, int status)
|
||||
|
||||
void _king_loop_init()
|
||||
{
|
||||
/* move signals out of unix.c */
|
||||
{
|
||||
u3_usig* sig_u;
|
||||
|
||||
sig_u = c3_malloc(sizeof(u3_usig));
|
||||
uv_signal_init(u3L, &sig_u->sil_u);
|
||||
|
||||
sig_u->num_i = SIGTERM;
|
||||
sig_u->nex_u = u3_Host.sig_u;
|
||||
u3_Host.sig_u = sig_u;
|
||||
}
|
||||
{
|
||||
u3_usig* sig_u;
|
||||
|
||||
sig_u = c3_malloc(sizeof(u3_usig));
|
||||
uv_signal_init(u3L, &sig_u->sil_u);
|
||||
|
||||
sig_u->num_i = SIGINT;
|
||||
sig_u->nex_u = u3_Host.sig_u;
|
||||
u3_Host.sig_u = sig_u;
|
||||
}
|
||||
{
|
||||
u3_usig* sig_u;
|
||||
|
||||
sig_u = c3_malloc(sizeof(u3_usig));
|
||||
uv_signal_init(u3L, &sig_u->sil_u);
|
||||
|
||||
sig_u->num_i = SIGWINCH;
|
||||
sig_u->nex_u = u3_Host.sig_u;
|
||||
u3_Host.sig_u = sig_u;
|
||||
}
|
||||
}
|
||||
|
||||
void _king_loop_exit()
|
||||
@ -264,7 +295,7 @@ void _king_loop_exit()
|
||||
c3_l cod_l;
|
||||
|
||||
cod_l = u3a_lush(c3__unix);
|
||||
u3_unix_io_exit();
|
||||
u3_unix_io_exit(u3_pier_stub());
|
||||
u3a_lop(cod_l);
|
||||
|
||||
cod_l = u3a_lush(c3__ames);
|
||||
|
23
vere/pier.c
23
vere/pier.c
@ -1262,6 +1262,9 @@ u3_pier_create(c3_c* pax_c, c3_c* sys_c)
|
||||
pir_u->sys_c = c3_malloc(1 + strlen(sys_c));
|
||||
strcpy(pir_u->sys_c, sys_c);
|
||||
|
||||
pir_u->arv_c = c3_malloc(1 + strlen(u3_Host.ops_u.arv_c)); /* parametrize */
|
||||
strcpy(pir_u->arv_c, u3_Host.ops_u.arv_c);
|
||||
|
||||
pir_u->gen_d = 0;
|
||||
pir_u->key_d[0] = pir_u->key_d[1] = pir_u->key_d[2] = pir_u->key_d[3] = 0;
|
||||
|
||||
@ -1273,6 +1276,8 @@ u3_pier_create(c3_c* pax_c, c3_c* sys_c)
|
||||
memset(pir_u->sam_u, 0, sizeof(u3_ames));
|
||||
pir_u->teh_u = c3_malloc(sizeof(u3_behn));
|
||||
memset(pir_u->teh_u, 0, sizeof(u3_behn));
|
||||
pir_u->unx_u = c3_malloc(sizeof(u3_unix));
|
||||
memset(pir_u->unx_u, 0, sizeof(u3_unix));
|
||||
}
|
||||
|
||||
/* start process
|
||||
@ -1399,10 +1404,6 @@ _pier_loop_init(void)
|
||||
{
|
||||
c3_l cod_l;
|
||||
|
||||
cod_l = u3a_lush(c3__unix);
|
||||
u3_unix_io_init();
|
||||
u3a_lop(cod_l);
|
||||
|
||||
cod_l = u3a_lush(c3__term);
|
||||
u3_term_io_init();
|
||||
u3a_lop(cod_l);
|
||||
@ -1434,6 +1435,10 @@ _pier_loop_init_pier(u3_pier* pir_u)
|
||||
cod_l = u3a_lush(c3__behn);
|
||||
u3_behn_io_init(pir_u);
|
||||
u3a_lop(cod_l);
|
||||
|
||||
cod_l = u3a_lush(c3__unix);
|
||||
u3_unix_io_init(pir_u);
|
||||
u3a_lop(cod_l);
|
||||
}
|
||||
|
||||
/* _pier_loop_wake(): initialize listeners and send initial events.
|
||||
@ -1444,8 +1449,8 @@ _pier_loop_wake(u3_pier* pir_u)
|
||||
c3_l cod_l;
|
||||
|
||||
cod_l = u3a_lush(c3__unix);
|
||||
u3_unix_io_talk();
|
||||
u3_unix_ef_bake();
|
||||
u3_unix_io_talk(pir_u);
|
||||
u3_unix_ef_bake(pir_u);
|
||||
u3a_lop(cod_l);
|
||||
|
||||
cod_l = u3a_lush(c3__ames);
|
||||
@ -1472,7 +1477,7 @@ _pier_loop_exit(void)
|
||||
c3_l cod_l;
|
||||
|
||||
cod_l = u3a_lush(c3__unix);
|
||||
u3_unix_io_exit();
|
||||
u3_unix_io_exit(u3_pier_stub());
|
||||
u3a_lop(cod_l);
|
||||
|
||||
cod_l = u3a_lush(c3__ames);
|
||||
@ -1524,7 +1529,7 @@ _pier_loop_poll(u3_pier* pir_u)
|
||||
u3a_lop(cod_l);
|
||||
|
||||
cod_l = u3a_lush(c3__unix);
|
||||
u3_unix_io_poll();
|
||||
u3_unix_io_poll(pir_u);
|
||||
u3a_lop(cod_l);
|
||||
|
||||
cod_l = u3a_lush(c3__behn);
|
||||
@ -1652,7 +1657,7 @@ _pier_boot_complete(u3_pier* pir_u,
|
||||
|
||||
/* another anomaly
|
||||
*/
|
||||
u3_unix_ef_boot();
|
||||
u3_unix_ef_boot(pir_u);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -166,15 +166,15 @@ _reck_kick_sync(u3_pier* pir_u, u3_noun pox, u3_noun fav)
|
||||
u3_noun mon = u3k(u3h(u3t(fav)));
|
||||
u3_noun can = u3k(u3t(u3t(fav)));
|
||||
|
||||
u3_unix_ef_ergo(mon, can);
|
||||
u3_unix_ef_ergo(pir_u, mon, can);
|
||||
u3z(pox); u3z(fav); return c3y;
|
||||
} break;
|
||||
case c3__ogre: {
|
||||
u3_unix_ef_ogre(u3k(u3t(fav)));
|
||||
u3_unix_ef_ogre(pir_u, u3k(u3t(fav)));
|
||||
u3z(pox); u3z(fav); return c3y;
|
||||
}
|
||||
case c3__hill: {
|
||||
u3_unix_ef_hill(u3k(u3t(fav)));
|
||||
u3_unix_ef_hill(pir_u, u3k(u3t(fav)));
|
||||
u3z(pox); u3z(fav); return c3y;
|
||||
}
|
||||
}
|
||||
|
222
vere/unix.c
222
vere/unix.c
@ -66,8 +66,8 @@ _unix_string_to_path_helper(c3_c* pax_c) {
|
||||
}
|
||||
}
|
||||
static u3_noun
|
||||
_unix_string_to_path(c3_c* pax_c) {
|
||||
pax_c += strlen(u3_Host.dir_c) + 1;
|
||||
_unix_string_to_path(u3_pier *pir_u, c3_c* pax_c) {
|
||||
pax_c += strlen(pir_u->pax_c) + 1;
|
||||
c3_c* pox_c = strchr(pax_c, '/');
|
||||
if ( !pox_c ) {
|
||||
pox_c = strchr(pax_c, '.');
|
||||
@ -258,12 +258,12 @@ _unix_write_file_soft_go:
|
||||
static void
|
||||
_unix_watch_dir(u3_udir* dir_u, u3_udir* par_u, c3_c* pax_c);
|
||||
static void
|
||||
_unix_watch_file(u3_ufil* fil_u, u3_udir* par_u, c3_c* pax_c);
|
||||
_unix_watch_file(u3_pier *pir_u, u3_ufil* fil_u, u3_udir* par_u, c3_c* pax_c);
|
||||
|
||||
/* _unix_get_mount_point(): retrieve or create mount point
|
||||
*/
|
||||
static u3_umon*
|
||||
_unix_get_mount_point(u3_noun mon)
|
||||
_unix_get_mount_point(u3_pier *pir_u, u3_noun mon)
|
||||
{
|
||||
if ( c3n == u3ud(mon) ) {
|
||||
c3_assert(!"mount point must be an atom");
|
||||
@ -274,7 +274,7 @@ _unix_get_mount_point(u3_noun mon)
|
||||
c3_c* nam_c = u3r_string(mon);
|
||||
u3_umon* mon_u;
|
||||
|
||||
for ( mon_u = u3_Host.unx_u.mon_u;
|
||||
for ( mon_u = pir_u->unx_u->mon_u;
|
||||
mon_u && 0 != strcmp(nam_c, mon_u->nam_c);
|
||||
mon_u = mon_u->nex_u )
|
||||
{
|
||||
@ -285,12 +285,12 @@ _unix_get_mount_point(u3_noun mon)
|
||||
mon_u->nam_c = nam_c;
|
||||
mon_u->dir_u.dir = c3y;
|
||||
mon_u->dir_u.dry = c3n;
|
||||
mon_u->dir_u.pax_c = strdup(u3_Host.dir_c);
|
||||
mon_u->dir_u.pax_c = strdup(pir_u->pax_c);
|
||||
mon_u->dir_u.par_u = NULL;
|
||||
mon_u->dir_u.nex_u = NULL;
|
||||
mon_u->dir_u.kid_u = NULL;
|
||||
mon_u->nex_u = u3_Host.unx_u.mon_u;
|
||||
u3_Host.unx_u.mon_u = mon_u;
|
||||
mon_u->nex_u = pir_u->unx_u->mon_u;
|
||||
pir_u->unx_u->mon_u = mon_u;
|
||||
|
||||
}
|
||||
else {
|
||||
@ -305,7 +305,7 @@ _unix_get_mount_point(u3_noun mon)
|
||||
/* _unix_scan_mount_point(): scan unix for already-existing mount point
|
||||
*/
|
||||
static void
|
||||
_unix_scan_mount_point(u3_umon* mon_u)
|
||||
_unix_scan_mount_point(u3_pier *pir_u, u3_umon* mon_u)
|
||||
{
|
||||
DIR* rid_u = opendir(mon_u->dir_u.pax_c);
|
||||
if ( !rid_u ) {
|
||||
@ -368,14 +368,14 @@ _unix_scan_mount_point(u3_umon* mon_u)
|
||||
}
|
||||
else {
|
||||
u3_ufil* fil_u = c3_malloc(sizeof(u3_ufil));
|
||||
_unix_watch_file(fil_u, &mon_u->dir_u, pax_c);
|
||||
_unix_watch_file(pir_u, fil_u, &mon_u->dir_u, pax_c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u3_noun _unix_free_node(u3_unod* nod_u);
|
||||
static u3_noun _unix_free_node(u3_pier *pir_u, u3_unod* nod_u);
|
||||
|
||||
/* _unix_free_file(): free file, unlinking it
|
||||
*/
|
||||
@ -420,7 +420,7 @@ _unix_free_dir(uv_handle_t* was_u)
|
||||
* also deletes from parent list if in it
|
||||
*/
|
||||
static u3_noun
|
||||
_unix_free_node(u3_unod* nod_u)
|
||||
_unix_free_node(u3_pier *pir_u, u3_unod* nod_u)
|
||||
{
|
||||
u3_noun can;
|
||||
if ( nod_u->par_u ) {
|
||||
@ -445,14 +445,14 @@ _unix_free_node(u3_unod* nod_u)
|
||||
u3_unod* nud_u = ((u3_udir*) nod_u)->kid_u;
|
||||
while ( nud_u ) {
|
||||
u3_unod* nex_u = nud_u->nex_u;
|
||||
can = u3kb_weld(_unix_free_node(nud_u), can);
|
||||
can = u3kb_weld(_unix_free_node(pir_u, nud_u), can);
|
||||
nud_u = nex_u;
|
||||
}
|
||||
|
||||
uv_close((uv_handle_t*)&nod_u->was_u, _unix_free_dir);
|
||||
}
|
||||
else {
|
||||
can = u3nc(u3nc(_unix_string_to_path(nod_u->pax_c), u3_nul),
|
||||
can = u3nc(u3nc(_unix_string_to_path(pir_u, nod_u->pax_c), u3_nul),
|
||||
u3_nul);
|
||||
uv_close((uv_handle_t*)&nod_u->was_u, _unix_free_file);
|
||||
}
|
||||
@ -469,12 +469,12 @@ _unix_free_node(u3_unod* nod_u)
|
||||
* tread carefully
|
||||
*/
|
||||
static void
|
||||
_unix_free_mount_point(u3_umon* mon_u)
|
||||
_unix_free_mount_point(u3_pier *pir_u, u3_umon* mon_u)
|
||||
{
|
||||
u3_unod* nod_u;
|
||||
for ( nod_u = mon_u->dir_u.kid_u; nod_u; ) {
|
||||
u3_unod* nex_u = nod_u->nex_u;
|
||||
u3z(_unix_free_node(nod_u));
|
||||
u3z(_unix_free_node(pir_u, nod_u));
|
||||
nod_u = nex_u;
|
||||
}
|
||||
|
||||
@ -486,7 +486,7 @@ _unix_free_mount_point(u3_umon* mon_u)
|
||||
/* _unix_delete_mount_point(): remove mount point from list and free
|
||||
*/
|
||||
static void
|
||||
_unix_delete_mount_point(u3_noun mon)
|
||||
_unix_delete_mount_point(u3_pier *pir_u, u3_noun mon)
|
||||
{
|
||||
if ( c3n == u3ud(mon) ) {
|
||||
c3_assert(!"mount point must be an atom");
|
||||
@ -498,14 +498,14 @@ _unix_delete_mount_point(u3_noun mon)
|
||||
u3_umon* mon_u;
|
||||
u3_umon* tem_u;
|
||||
|
||||
mon_u = u3_Host.unx_u.mon_u;
|
||||
mon_u = pir_u->unx_u->mon_u;
|
||||
if ( !mon_u ) {
|
||||
uL(fprintf(uH, "mount point already gone: %s\r\n", nam_c));
|
||||
goto _delete_mount_point_out;
|
||||
}
|
||||
if ( 0 == strcmp(nam_c, mon_u->nam_c) ) {
|
||||
u3_Host.unx_u.mon_u = mon_u->nex_u;
|
||||
_unix_free_mount_point(mon_u);
|
||||
pir_u->unx_u->mon_u = mon_u->nex_u;
|
||||
_unix_free_mount_point(pir_u, mon_u);
|
||||
goto _delete_mount_point_out;
|
||||
}
|
||||
|
||||
@ -522,7 +522,7 @@ _unix_delete_mount_point(u3_noun mon)
|
||||
|
||||
tem_u = mon_u->nex_u;
|
||||
mon_u->nex_u = mon_u->nex_u->nex_u;
|
||||
_unix_free_mount_point(tem_u);
|
||||
_unix_free_mount_point(pir_u, tem_u);
|
||||
|
||||
_delete_mount_point_out:
|
||||
free(nam_c);
|
||||
@ -535,8 +535,9 @@ static void
|
||||
_unix_time_cb(uv_timer_t* tim_u)
|
||||
{
|
||||
{
|
||||
u3_Host.unx_u.alm = c3n;
|
||||
u3_Host.unx_u.dyr = c3y;
|
||||
u3_pier *pir_u = tim_u->data;
|
||||
pir_u->unx_u->alm = c3n;
|
||||
pir_u->unx_u->dyr = c3y;
|
||||
}
|
||||
}
|
||||
|
||||
@ -557,6 +558,7 @@ _unix_fs_event_cb(uv_fs_event_t* was_u,
|
||||
// * this is what we get out of libuv down below
|
||||
// * thus a cast is cool
|
||||
u3_unod* nod_u = (u3_unod*) was_u;
|
||||
u3_pier *pir_u = was_u->data;
|
||||
|
||||
while ( nod_u ) {
|
||||
nod_u->dry = c3n;
|
||||
@ -567,22 +569,23 @@ _unix_fs_event_cb(uv_fs_event_t* was_u,
|
||||
// the extra time is so that the fs "settles down".
|
||||
// vim, for example, tends to delete and re-add files
|
||||
// for safety purposes.
|
||||
if ( c3y == u3_Host.unx_u.alm ) {
|
||||
uv_timer_stop(&u3_Host.unx_u.tim_u);
|
||||
if ( c3y == pir_u->unx_u->alm ) {
|
||||
uv_timer_stop(&pir_u->unx_u->tim_u);
|
||||
}
|
||||
else {
|
||||
u3_Host.unx_u.alm = c3y;
|
||||
pir_u->unx_u->alm = c3y;
|
||||
}
|
||||
|
||||
u3_Host.unx_u.dyr = c3n;
|
||||
pir_u->unx_u->dyr = c3n;
|
||||
|
||||
uv_timer_start(&u3_Host.unx_u.tim_u, _unix_time_cb, 100, 0);
|
||||
pir_u->unx_u->tim_u.data = pir_u;
|
||||
uv_timer_start(&pir_u->unx_u->tim_u, _unix_time_cb, 100, 0);
|
||||
}
|
||||
|
||||
/* _unix_watch_file(): initialize file
|
||||
*/
|
||||
static void
|
||||
_unix_watch_file(u3_ufil* fil_u, u3_udir* par_u, c3_c* pax_c)
|
||||
_unix_watch_file(u3_pier *pir_u, u3_ufil* fil_u, u3_udir* par_u, c3_c* pax_c)
|
||||
{
|
||||
// initialize fil_u
|
||||
|
||||
@ -609,6 +612,7 @@ _unix_watch_file(u3_ufil* fil_u, u3_udir* par_u, c3_c* pax_c)
|
||||
c3_assert(0);
|
||||
}
|
||||
|
||||
fil_u->was_u.data = pir_u;
|
||||
ret_w = uv_fs_event_start(&fil_u->was_u, _unix_fs_event_cb, pax_c, 0);
|
||||
if ( 0 != ret_w ){
|
||||
uL(fprintf(uH, "file event start %s: %s\n", fil_u->pax_c, uv_strerror(ret_w)));
|
||||
@ -674,7 +678,7 @@ _unix_create_dir(u3_udir* dir_u, u3_udir* par_u, u3_noun nam)
|
||||
_unix_watch_dir(dir_u, par_u, pax_c);
|
||||
}
|
||||
|
||||
static u3_noun _unix_update_node(u3_unod* nod_u);
|
||||
static u3_noun _unix_update_node(u3_pier *pir_u, u3_unod* nod_u);
|
||||
|
||||
/* _unix_update_file(): update file, producing list of changes
|
||||
*
|
||||
@ -685,7 +689,7 @@ static u3_noun _unix_update_node(u3_unod* nod_u);
|
||||
* mug_w with new mug and add path plus data to %into event.
|
||||
*/
|
||||
static u3_noun
|
||||
_unix_update_file(u3_ufil* fil_u)
|
||||
_unix_update_file(u3_pier *pir_u, u3_ufil* fil_u)
|
||||
{
|
||||
c3_assert( c3n == fil_u->dir );
|
||||
|
||||
@ -702,7 +706,7 @@ _unix_update_file(u3_ufil* fil_u)
|
||||
|
||||
if ( fid_i < 0 || fstat(fid_i, &buf_u) < 0 ) {
|
||||
if ( ENOENT == errno ) {
|
||||
return u3nc(u3nc(_unix_string_to_path(fil_u->pax_c), u3_nul), u3_nul);
|
||||
return u3nc(u3nc(_unix_string_to_path(pir_u, fil_u->pax_c), u3_nul), u3_nul);
|
||||
}
|
||||
else {
|
||||
uL(fprintf(uH, "error opening file %s: %s\r\n",
|
||||
@ -760,7 +764,7 @@ _unix_update_file(u3_ufil* fil_u)
|
||||
else {
|
||||
fil_u->mug_w = mug_w;
|
||||
|
||||
u3_noun pax = _unix_string_to_path(fil_u->pax_c);
|
||||
u3_noun pax = _unix_string_to_path(pir_u, fil_u->pax_c);
|
||||
u3_noun mim = u3nt(c3__text, u3i_string("plain"), u3_nul);
|
||||
u3_noun dat = u3nt(mim, len_ws, u3i_bytes(len_ws, dat_y));
|
||||
|
||||
@ -776,7 +780,7 @@ _unix_update_file(u3_ufil* fil_u)
|
||||
* _unix_initial_update_dir()
|
||||
*/
|
||||
static u3_noun
|
||||
_unix_update_dir(u3_udir* dir_u)
|
||||
_unix_update_dir(u3_pier *pir_u, u3_udir* dir_u)
|
||||
{
|
||||
u3_noun can = u3_nul;
|
||||
|
||||
@ -802,7 +806,7 @@ _unix_update_dir(u3_udir* dir_u)
|
||||
DIR* red_u = opendir(nod_u->pax_c);
|
||||
if ( 0 == red_u ) {
|
||||
u3_unod* nex_u = nod_u->nex_u;
|
||||
can = u3kb_weld(_unix_free_node(nod_u), can);
|
||||
can = u3kb_weld(_unix_free_node(pir_u, nod_u), can);
|
||||
nod_u = nex_u;
|
||||
}
|
||||
else {
|
||||
@ -821,7 +825,7 @@ _unix_update_dir(u3_udir* dir_u)
|
||||
}
|
||||
|
||||
u3_unod* nex_u = nod_u->nex_u;
|
||||
can = u3kb_weld(_unix_free_node(nod_u), can);
|
||||
can = u3kb_weld(_unix_free_node(pir_u, nod_u), can);
|
||||
nod_u = nex_u;
|
||||
}
|
||||
else {
|
||||
@ -905,12 +909,12 @@ _unix_update_dir(u3_udir* dir_u)
|
||||
}
|
||||
|
||||
u3_ufil* fil_u = c3_malloc(sizeof(u3_ufil));
|
||||
_unix_watch_file(fil_u, dir_u, pax_c);
|
||||
_unix_watch_file(pir_u, fil_u, dir_u, pax_c);
|
||||
}
|
||||
else {
|
||||
u3_udir* dis_u = c3_malloc(sizeof(u3_udir));
|
||||
_unix_watch_dir(dis_u, dir_u, pax_c);
|
||||
can = u3kb_weld(_unix_update_dir(dis_u), can); // XXX unnecessary?
|
||||
can = u3kb_weld(_unix_update_dir(pir_u, dis_u), can); // XXX unnecessary?
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -923,13 +927,13 @@ _unix_update_dir(u3_udir* dir_u)
|
||||
}
|
||||
|
||||
if ( !dir_u->kid_u ) {
|
||||
return u3kb_weld(_unix_free_node((u3_unod*) dir_u), can);
|
||||
return u3kb_weld(_unix_free_node(pir_u, (u3_unod*) dir_u), can);
|
||||
}
|
||||
|
||||
// get change list
|
||||
|
||||
for ( nod_u = dir_u->kid_u; nod_u; nod_u = nod_u->nex_u ) {
|
||||
can = u3kb_weld(_unix_update_node(nod_u), can);
|
||||
can = u3kb_weld(_unix_update_node(pir_u, nod_u), can);
|
||||
}
|
||||
|
||||
return can;
|
||||
@ -938,29 +942,30 @@ _unix_update_dir(u3_udir* dir_u)
|
||||
/* _unix_update_node(): update node, producing list of changes
|
||||
*/
|
||||
static u3_noun
|
||||
_unix_update_node(u3_unod* nod_u)
|
||||
_unix_update_node(u3_pier *pir_u, u3_unod* nod_u)
|
||||
{
|
||||
if ( c3y == nod_u->dir ) {
|
||||
return _unix_update_dir((void*)nod_u);
|
||||
return _unix_update_dir(pir_u, (void*)nod_u);
|
||||
}
|
||||
else {
|
||||
return _unix_update_file((void*)nod_u);
|
||||
return _unix_update_file(pir_u, (void*)nod_u);
|
||||
}
|
||||
}
|
||||
|
||||
/* _unix_update_mount(): update mount point
|
||||
*/
|
||||
static void
|
||||
_unix_update_mount(u3_umon* mon_u, u3_noun all)
|
||||
_unix_update_mount(u3_pier *pir_u, u3_umon* mon_u, u3_noun all)
|
||||
{
|
||||
if ( c3n == mon_u->dir_u.dry ) {
|
||||
u3_noun can = u3_nul;
|
||||
u3_unod* nod_u;
|
||||
for ( nod_u = mon_u->dir_u.kid_u; nod_u; nod_u = nod_u->nex_u ) {
|
||||
can = u3kb_weld(_unix_update_node(nod_u), can);
|
||||
can = u3kb_weld(_unix_update_node(pir_u, nod_u), can);
|
||||
}
|
||||
|
||||
u3_pier_plan(u3nq(u3_blip, c3__sync, u3k(u3A->sen), u3_nul),
|
||||
u3_pier_work(pir_u,
|
||||
u3nq(u3_blip, c3__sync, u3k(u3A->sen), u3_nul),
|
||||
u3nq(c3__into, u3i_string(mon_u->nam_c), all, can));
|
||||
}
|
||||
}
|
||||
@ -968,7 +973,7 @@ _unix_update_mount(u3_umon* mon_u, u3_noun all)
|
||||
/* _unix_initial_update_file(): read file, but don't watch
|
||||
*/
|
||||
static u3_noun
|
||||
_unix_initial_update_file(c3_c* pax_c)
|
||||
_unix_initial_update_file(u3_pier *pir_u, c3_c* pax_c)
|
||||
{
|
||||
struct stat buf_u;
|
||||
c3_i fid_i = open(pax_c, O_RDONLY, 0644);
|
||||
@ -1010,7 +1015,7 @@ _unix_initial_update_file(c3_c* pax_c)
|
||||
}
|
||||
else {
|
||||
u3_noun pax = _unix_string_to_path_helper(pax_c
|
||||
+ strlen(u3_Host.ops_u.arv_c)
|
||||
+ strlen(pir_u->arv_c)
|
||||
+ 1); /* XX slightly less VERY BAD than before*/
|
||||
u3_noun mim = u3nt(c3__text, u3i_string("plain"), u3_nul);
|
||||
u3_noun dat = u3nt(mim, len_ws, u3i_bytes(len_ws, dat_y));
|
||||
@ -1023,7 +1028,7 @@ _unix_initial_update_file(c3_c* pax_c)
|
||||
/* _unix_initial_update_dir(): read directory, but don't watch
|
||||
*/
|
||||
static u3_noun
|
||||
_unix_initial_update_dir(c3_c* pax_c)
|
||||
_unix_initial_update_dir(u3_pier *pir_u, c3_c* pax_c)
|
||||
{
|
||||
u3_noun can = u3_nul;
|
||||
|
||||
@ -1063,10 +1068,10 @@ _unix_initial_update_dir(c3_c* pax_c)
|
||||
}
|
||||
else {
|
||||
if ( S_ISDIR(buf_u.st_mode) ) {
|
||||
can = u3kb_weld(_unix_initial_update_dir(pox_c), can);
|
||||
can = u3kb_weld(_unix_initial_update_dir(pir_u, pox_c), can);
|
||||
}
|
||||
else {
|
||||
can = u3kb_weld(_unix_initial_update_file(pox_c), can);
|
||||
can = u3kb_weld(_unix_initial_update_file(pir_u, pox_c), can);
|
||||
}
|
||||
free(pox_c);
|
||||
}
|
||||
@ -1112,7 +1117,7 @@ _unix_ef_sync(uv_check_t* han_u)
|
||||
/* _unix_sync_file(): sync file to unix
|
||||
*/
|
||||
static void
|
||||
_unix_sync_file(u3_udir* par_u, u3_noun nam, u3_noun ext, u3_noun mim)
|
||||
_unix_sync_file(u3_pier *pir_u, u3_udir* par_u, u3_noun nam, u3_noun ext, u3_noun mim)
|
||||
{
|
||||
c3_assert( par_u );
|
||||
c3_assert( c3y == par_u->dir );
|
||||
@ -1150,7 +1155,7 @@ _unix_sync_file(u3_udir* par_u, u3_noun nam, u3_noun ext, u3_noun mim)
|
||||
|
||||
if ( u3_nul == mim ) {
|
||||
if ( nod_u ) {
|
||||
u3z(_unix_free_node(nod_u));
|
||||
u3z(_unix_free_node(pir_u, nod_u));
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -1158,7 +1163,7 @@ _unix_sync_file(u3_udir* par_u, u3_noun nam, u3_noun ext, u3_noun mim)
|
||||
if ( !nod_u ) {
|
||||
c3_w gum_w = _unix_write_file_hard(pax_c, u3k(u3t(mim)));
|
||||
u3_ufil* fil_u = c3_malloc(sizeof(u3_ufil));
|
||||
_unix_watch_file(fil_u, par_u, pax_c);
|
||||
_unix_watch_file(pir_u, fil_u, par_u, pax_c);
|
||||
fil_u->gum_w = gum_w;
|
||||
goto _unix_sync_file_out;
|
||||
}
|
||||
@ -1176,7 +1181,7 @@ _unix_sync_file_out:
|
||||
/* _unix_sync_change(): sync single change to unix
|
||||
*/
|
||||
static void
|
||||
_unix_sync_change(u3_udir* dir_u, u3_noun pax, u3_noun mim)
|
||||
_unix_sync_change(u3_pier *pir_u, u3_udir* dir_u, u3_noun pax, u3_noun mim)
|
||||
{
|
||||
c3_assert( c3y == dir_u->dir );
|
||||
|
||||
@ -1201,7 +1206,7 @@ _unix_sync_change(u3_udir* dir_u, u3_noun pax, u3_noun mim)
|
||||
u3_noun tt_pax = u3t(t_pax);
|
||||
|
||||
if ( u3_nul == tt_pax ) {
|
||||
_unix_sync_file(dir_u, u3k(i_pax), u3k(it_pax), mim);
|
||||
_unix_sync_file(pir_u, dir_u, u3k(i_pax), u3k(it_pax), mim);
|
||||
}
|
||||
else {
|
||||
c3_c* nam_c = u3r_string(i_pax);
|
||||
@ -1226,7 +1231,7 @@ _unix_sync_change(u3_udir* dir_u, u3_noun pax, u3_noun mim)
|
||||
c3_assert(0);
|
||||
}
|
||||
|
||||
_unix_sync_change((u3_udir*) nod_u, u3k(t_pax), mim);
|
||||
_unix_sync_change(pir_u, (u3_udir*) nod_u, u3k(t_pax), mim);
|
||||
}
|
||||
}
|
||||
u3z(pax);
|
||||
@ -1235,13 +1240,13 @@ _unix_sync_change(u3_udir* dir_u, u3_noun pax, u3_noun mim)
|
||||
/* _unix_sync_ergo(): sync list of changes to unix
|
||||
*/
|
||||
static void
|
||||
_unix_sync_ergo(u3_umon* mon_u, u3_noun can)
|
||||
_unix_sync_ergo(u3_pier *pir_u, u3_umon* mon_u, u3_noun can)
|
||||
{
|
||||
u3_noun nac = can;
|
||||
u3_noun nam = u3i_string(mon_u->nam_c);
|
||||
|
||||
while ( u3_nul != nac) {
|
||||
_unix_sync_change(&mon_u->dir_u,
|
||||
_unix_sync_change(pir_u, &mon_u->dir_u,
|
||||
u3nc(u3k(nam), u3k(u3h(u3h(nac)))),
|
||||
u3k(u3t(u3h(nac))));
|
||||
nac = u3t(nac);
|
||||
@ -1254,77 +1259,46 @@ _unix_sync_ergo(u3_umon* mon_u, u3_noun can)
|
||||
/* u3_unix_ef_ergo(): update filesystem from urbit
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_ergo(u3_noun mon, u3_noun can)
|
||||
u3_unix_ef_ergo(u3_pier *pir_u, u3_noun mon, u3_noun can)
|
||||
{
|
||||
u3_umon* mon_u = _unix_get_mount_point(mon);
|
||||
u3_umon* mon_u = _unix_get_mount_point(pir_u, mon);
|
||||
|
||||
_unix_sync_ergo(mon_u, can);
|
||||
_unix_sync_ergo(pir_u, mon_u, can);
|
||||
}
|
||||
|
||||
/* u3_unix_ef_ogre(): delete mount point
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_ogre(u3_noun mon)
|
||||
u3_unix_ef_ogre(u3_pier *pir_u, u3_noun mon)
|
||||
{
|
||||
_unix_delete_mount_point(mon);
|
||||
_unix_delete_mount_point(pir_u, mon);
|
||||
}
|
||||
|
||||
/* u3_unix_ef_hill(): enumerate mount points
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_hill(u3_noun hil)
|
||||
u3_unix_ef_hill(u3_pier *pir_u, u3_noun hil)
|
||||
{
|
||||
u3_noun mon;
|
||||
for ( mon = hil; c3y == u3du(mon); mon = u3t(mon) ) {
|
||||
u3_umon* mon_u = _unix_get_mount_point(u3k(u3h(mon)));
|
||||
_unix_scan_mount_point(mon_u);
|
||||
u3_umon* mon_u = _unix_get_mount_point(pir_u, u3k(u3h(mon)));
|
||||
_unix_scan_mount_point(pir_u, mon_u);
|
||||
}
|
||||
u3z(hil);
|
||||
u3_Host.unx_u.dyr = c3y;
|
||||
u3_unix_ef_look(c3y);
|
||||
pir_u->unx_u->dyr = c3y;
|
||||
u3_unix_ef_look(pir_u, c3y);
|
||||
}
|
||||
|
||||
/* u3_unix_io_init(): initialize unix sync.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_init(void)
|
||||
u3_unix_io_init(u3_pier *pir_u)
|
||||
{
|
||||
u3_unix* unx_u = &u3_Host.unx_u;
|
||||
u3_unix* unx_u = pir_u->unx_u;
|
||||
|
||||
unx_u->mon_u = NULL;
|
||||
|
||||
{
|
||||
u3_usig* sig_u;
|
||||
|
||||
sig_u = c3_malloc(sizeof(u3_usig));
|
||||
uv_signal_init(u3L, &sig_u->sil_u);
|
||||
|
||||
sig_u->num_i = SIGTERM;
|
||||
sig_u->nex_u = unx_u->sig_u;
|
||||
unx_u->sig_u = sig_u;
|
||||
}
|
||||
{
|
||||
u3_usig* sig_u;
|
||||
|
||||
sig_u = c3_malloc(sizeof(u3_usig));
|
||||
uv_signal_init(u3L, &sig_u->sil_u);
|
||||
|
||||
sig_u->num_i = SIGINT;
|
||||
sig_u->nex_u = unx_u->sig_u;
|
||||
unx_u->sig_u = sig_u;
|
||||
}
|
||||
{
|
||||
u3_usig* sig_u;
|
||||
|
||||
sig_u = c3_malloc(sizeof(u3_usig));
|
||||
uv_signal_init(u3L, &sig_u->sil_u);
|
||||
|
||||
sig_u->num_i = SIGWINCH;
|
||||
sig_u->nex_u = unx_u->sig_u;
|
||||
unx_u->sig_u = sig_u;
|
||||
}
|
||||
|
||||
uv_check_init(u3_Host.lup_u, &u3_Host.unx_u.syn_u);
|
||||
uv_check_init(u3L, &pir_u->unx_u->syn_u);
|
||||
|
||||
uv_timer_init(u3L, &unx_u->tim_u);
|
||||
unx_u->alm = c3n;
|
||||
@ -1413,10 +1387,9 @@ u3_unix_release(c3_c* pax_c)
|
||||
void
|
||||
u3_unix_ef_hold(void)
|
||||
{
|
||||
u3_unix* unx_u = &u3_Host.unx_u;
|
||||
u3_usig* sig_u;
|
||||
|
||||
for ( sig_u = unx_u->sig_u; sig_u; sig_u = sig_u->nex_u ) {
|
||||
for ( sig_u = u3_Host.sig_u; sig_u; sig_u = sig_u->nex_u ) {
|
||||
uv_signal_stop(&sig_u->sil_u);
|
||||
}
|
||||
}
|
||||
@ -1424,9 +1397,10 @@ u3_unix_ef_hold(void)
|
||||
/* u3_unix_ef_bake(): initial effects for new process.
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_bake(void)
|
||||
u3_unix_ef_bake(u3_pier *pir_u)
|
||||
{
|
||||
u3_pier_plan(u3nt(u3_blip, c3__boat, u3_nul),
|
||||
u3_pier_work(pir_u,
|
||||
u3nt(u3_blip, c3__boat, u3_nul),
|
||||
u3nc(c3__boat, u3_nul));
|
||||
|
||||
}
|
||||
@ -1436,10 +1410,9 @@ u3_unix_ef_bake(void)
|
||||
void
|
||||
u3_unix_ef_move(void)
|
||||
{
|
||||
u3_unix* unx_u = &u3_Host.unx_u;
|
||||
u3_usig* sig_u;
|
||||
|
||||
for ( sig_u = unx_u->sig_u; sig_u; sig_u = sig_u->nex_u ) {
|
||||
for ( sig_u = u3_Host.sig_u; sig_u; sig_u = sig_u->nex_u ) {
|
||||
uv_signal_start(&sig_u->sil_u, _unix_sign_cb, sig_u->num_i);
|
||||
}
|
||||
}
|
||||
@ -1447,12 +1420,13 @@ u3_unix_ef_move(void)
|
||||
/* u3_unix_ef_boot(): boot actions
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_boot(void)
|
||||
u3_unix_ef_boot(u3_pier *pir_u)
|
||||
{
|
||||
if ( u3_Host.ops_u.imp_c ) {
|
||||
u3_noun can = _unix_initial_update_dir(u3_Host.ops_u.arv_c);
|
||||
u3_noun can = _unix_initial_update_dir(pir_u, pir_u->arv_c);
|
||||
|
||||
u3_pier_plan(u3nq(u3_blip, c3__sync, u3k(u3A->sen), u3_nul),
|
||||
u3_pier_work(pir_u,
|
||||
u3nq(u3_blip, c3__sync, u3k(u3A->sen), u3_nul),
|
||||
u3nq(c3__into, u3_nul, c3y, can));
|
||||
}
|
||||
}
|
||||
@ -1460,14 +1434,14 @@ u3_unix_ef_boot(void)
|
||||
/* u3_unix_ef_look(): update the root.
|
||||
*/
|
||||
void
|
||||
u3_unix_ef_look(u3_noun all)
|
||||
u3_unix_ef_look(u3_pier *pir_u, u3_noun all)
|
||||
{
|
||||
if ( c3y == u3_Host.unx_u.dyr ) {
|
||||
u3_Host.unx_u.dyr = c3n;
|
||||
if ( c3y == pir_u->unx_u->dyr ) {
|
||||
pir_u->unx_u->dyr = c3n;
|
||||
u3_umon* mon_u;
|
||||
|
||||
for ( mon_u = u3_Host.unx_u.mon_u; mon_u; mon_u = mon_u->nex_u ) {
|
||||
_unix_update_mount(mon_u, all);
|
||||
for ( mon_u = pir_u->unx_u->mon_u; mon_u; mon_u = mon_u->nex_u ) {
|
||||
_unix_update_mount(pir_u, mon_u, all);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1475,25 +1449,25 @@ u3_unix_ef_look(u3_noun all)
|
||||
/* u3_unix_io_talk(): start listening for fs events.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_talk()
|
||||
u3_unix_io_talk(u3_pier *pir_u)
|
||||
{
|
||||
u3_unix_acquire(u3_Host.dir_c);
|
||||
u3_unix_acquire(pir_u->pax_c);
|
||||
u3_unix_ef_move();
|
||||
uv_check_start(&u3_Host.unx_u.syn_u, _unix_ef_sync);
|
||||
uv_check_start(&pir_u->unx_u->syn_u, _unix_ef_sync);
|
||||
}
|
||||
|
||||
/* u3_unix_io_exit(): terminate unix I/O.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_exit(void)
|
||||
u3_unix_io_exit(u3_pier *pir_u)
|
||||
{
|
||||
uv_check_stop(&u3_Host.unx_u.syn_u);
|
||||
u3_unix_release(u3_Host.dir_c);
|
||||
uv_check_stop(&pir_u->unx_u->syn_u);
|
||||
u3_unix_release(pir_u->pax_c);
|
||||
}
|
||||
|
||||
/* u3_unix_io_poll(): update unix IO state.
|
||||
*/
|
||||
void
|
||||
u3_unix_io_poll(void)
|
||||
u3_unix_io_poll(u3_pier *pir_u)
|
||||
{
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user