mirror of
https://github.com/urbit/shrub.git
synced 2024-12-23 02:41:35 +03:00
6c36594f6f
* master: (124 commits) use compile-time assertion to check for unsigned char Don't build libuv in travis if it is now submoduled. Rebuild the scripts without PKG_CONFIG_PATH hacks. Remove manual PKG_CONFIG_PATH configuration. Enable fallback libuv bundle Bundle libuv. adds a cell check for the sample of the +roll gate Add missing flags fixing the markdown parser bug #951 Revert "Merge pull request #952 from eglaysher/revert-meson" Revert "Merge pull request #949 from eglaysher/meson-build-clean" Revert "The -C flag was added for exactly this case." The -C flag was added for exactly this case. Take ownership of the submodule repositories. Revert "Revert "Merge pull request #941 from frodwith/runtime-overflows"" Add legacy meson instructions to README Fix new meson version check Fix legacy meson version detection. Universal meson build. change overflow check to short do the don trick for jam ...
1132 lines
36 KiB
C
1132 lines
36 KiB
C
/* include/v/vere.h
|
|
**
|
|
** This file is in the public domain.
|
|
*/
|
|
|
|
#include "h2o.h"
|
|
|
|
/** Quasi-tunable parameters.
|
|
**/
|
|
/* First kernel this executable can boot.
|
|
*/
|
|
# define FirstKernel 164
|
|
# define DefaultKernel 164
|
|
|
|
#define RECK
|
|
|
|
/** Data types.
|
|
**/
|
|
struct _u3_http;
|
|
|
|
/* u3_hhed: http header.
|
|
*/
|
|
typedef struct _u3_hhed {
|
|
struct _u3_hhed* nex_u;
|
|
c3_w nam_w;
|
|
c3_c* nam_c;
|
|
c3_w val_w;
|
|
c3_c* val_c;
|
|
} u3_hhed;
|
|
|
|
/* u3_hbod: http body block. Also used for responses.
|
|
*/
|
|
typedef struct _u3_hbod {
|
|
struct _u3_hbod* nex_u;
|
|
c3_w len_w;
|
|
c3_y hun_y[0];
|
|
} u3_hbod;
|
|
|
|
/* u3_hreq: incoming http request.
|
|
*/
|
|
typedef struct _u3_hreq {
|
|
h2o_req_t* rec_u; // h2o request
|
|
c3_w seq_l; // sequence within connection
|
|
struct _u3_hcon* hon_u; // connection backlink
|
|
struct _u3_hreq* nex_u; // next in connection's list
|
|
} u3_hreq;
|
|
|
|
/* u3_hcon: incoming http connection.
|
|
*/
|
|
typedef struct _u3_hcon {
|
|
uv_tcp_t wax_u; // client stream handler
|
|
h2o_conn_t* con_u; // h2o connection
|
|
h2o_socket_t* sok_u; // h2o connection socket
|
|
c3_w ipf_w; // client ipv4
|
|
c3_w coq_l; // connection number
|
|
c3_w seq_l; // next request number
|
|
struct _u3_http* htp_u; // server backlink
|
|
struct _u3_hreq* req_u; // request list
|
|
struct _u3_hcon* nex_u; // next in server's list
|
|
} u3_hcon;
|
|
|
|
/* u3_http: http server.
|
|
*/
|
|
typedef struct _u3_http {
|
|
uv_tcp_t wax_u; // server stream handler
|
|
h2o_globalconf_t* fig_u; // h2o global config
|
|
h2o_context_t* ctx_u; // h2o ctx
|
|
h2o_accept_ctx_t* cep_u; // h2o accept ctx (wat for?)
|
|
h2o_hostconf_t* hos_u; // h2o host config
|
|
h2o_handler_t* han_u; // h2o request handler
|
|
c3_w sev_l; // server number
|
|
c3_w coq_l; // next connection number
|
|
c3_w por_w; // running port
|
|
c3_o sec; // logically secure
|
|
c3_o lop; // loopback-only
|
|
struct _u3_hcon* hon_u; // connection list
|
|
struct _u3_http* nex_u; // next in list
|
|
} u3_http;
|
|
|
|
/* u3_csat: client connection state.
|
|
*/
|
|
typedef enum {
|
|
u3_csat_init = 0, // initialized
|
|
u3_csat_addr = 1, // address resolution begun
|
|
u3_csat_quit = 2, // cancellation requested
|
|
u3_csat_ripe = 3 // passed to libh2o
|
|
} u3_csat;
|
|
|
|
/* u3_cres: response to http client.
|
|
*/
|
|
typedef struct _u3_cres {
|
|
c3_w sas_w; // status code
|
|
u3_noun hed; // headers
|
|
u3_hbod* bod_u; // exit of body queue
|
|
u3_hbod* dob_u; // entry of body queue
|
|
} u3_cres;
|
|
|
|
/* u3_creq: outgoing http request.
|
|
*/
|
|
typedef struct _u3_creq { // client request
|
|
c3_l num_l; // request number
|
|
h2o_http1client_t* cli_u; // h2o client
|
|
u3_csat sat_e; // connection state
|
|
c3_o sec; // yes == https
|
|
c3_w ipf_w; // IP
|
|
c3_c* ipf_c; // IP (string)
|
|
c3_c* hot_c; // host
|
|
c3_s por_s; // port
|
|
c3_c* por_c; // port (string)
|
|
c3_m met_m; // method
|
|
c3_c* url_c; // url
|
|
u3_hhed* hed_u; // headers
|
|
u3_hbod* bod_u; // body
|
|
u3_hbod* rub_u; // exit of send queue
|
|
u3_hbod* bur_u; // entry of send queue
|
|
h2o_iovec_t* vec_u; // send-buffer array
|
|
u3_cres* res_u; // nascent response
|
|
struct _u3_creq* nex_u; // next in list
|
|
struct _u3_creq* pre_u; // previous in list
|
|
} u3_creq;
|
|
|
|
/* u3_chot: foreign host (not yet used).
|
|
*/
|
|
typedef struct _u3_chot {
|
|
c3_w ipf_w; // ip address (or 0)
|
|
c3_c* hot_c; // hostname (no port) (or 0)
|
|
void* ins_u; // insecure connection (or 0)
|
|
void* sec_u; // secure connection (or 0)
|
|
} u3_chot;
|
|
|
|
/* u3_cttp: http client.
|
|
*/
|
|
typedef struct _u3_cttp {
|
|
u3_creq* ceq_u; // request list
|
|
h2o_http1client_ctx_t* //
|
|
ctx_u; // h2o client ctx
|
|
void* tls_u; // client SSL_CTX*
|
|
} u3_cttp;
|
|
|
|
/* u3_apac: ames packet, coming or going.
|
|
*/
|
|
typedef struct _u3_apac {
|
|
struct _u3_apac* nex_u; // next in queue
|
|
c3_w pip_w; // IPv4 address, to
|
|
c3_s por_s; // IPv4 port, to
|
|
c3_w len_w; // length in bytes
|
|
c3_y hun_y[0]; // data
|
|
} u3_apac;
|
|
|
|
/* u3_ames: ames networking.
|
|
*/
|
|
typedef struct _u3_ames { // packet network state
|
|
union {
|
|
uv_udp_t wax_u;
|
|
uv_handle_t had_u;
|
|
};
|
|
uv_timer_t tim_u; // network timer
|
|
c3_o alm; // alarm on
|
|
c3_w law_w; // last wakeup, unix time
|
|
c3_s por_s; // public IPv4 port
|
|
c3_w imp_w[256]; // imperial IPs
|
|
time_t imp_t[256]; // imperial IP timestamps
|
|
} u3_ames;
|
|
|
|
/* u3_save: checkpoint control.
|
|
*/
|
|
typedef struct _u3_save {
|
|
uv_timer_t tim_u; // checkpoint timer
|
|
uv_signal_t sil_u; // child signal
|
|
c3_d ent_d; // event number
|
|
c3_w pid_w; // pid of checkpoint process
|
|
} u3_save;
|
|
|
|
/* u3_ubuf: unix tty i/o buffer.
|
|
*/
|
|
typedef struct _u3_ubuf {
|
|
struct _u3_ubuf* nex_u;
|
|
c3_w len_w;
|
|
c3_y hun_y[0]; // bytes to send
|
|
} u3_ubuf;
|
|
|
|
/* u3_utat: unix terminal state.
|
|
*/
|
|
typedef struct {
|
|
struct {
|
|
c3_l col_l; // columns
|
|
c3_l row_l; // rows
|
|
} siz;
|
|
|
|
struct {
|
|
c3_w* lin_w; // current line (utf32)
|
|
c3_w len_w; // length of current line
|
|
c3_w cus_w; // cursor position
|
|
} mir;
|
|
|
|
struct { // escape code control
|
|
c3_o ape; // escape received
|
|
c3_o bra; // bracket or O received
|
|
} esc;
|
|
|
|
struct {
|
|
c3_y syb_y[5]; // utf8 code buffer
|
|
c3_w len_w; // present length
|
|
c3_w wid_w; // total width
|
|
} fut;
|
|
|
|
struct {
|
|
uv_thread_t* sit_u; // spinner thread
|
|
c3_o diz_o; // spinner activated
|
|
c3_d eve_d; // spinner start tick (unix μs)
|
|
c3_d end_d; // spinner end tick (unix μs)
|
|
c3_c* why_c; // spinner event wire (root only)
|
|
} sun;
|
|
|
|
uv_mutex_t mex_u; // mutex for non-daemon term state
|
|
} u3_utat;
|
|
|
|
/* u3_uled: event log header.
|
|
*/
|
|
typedef struct {
|
|
c3_l mag_l; // mug of log format, 'a', 'b'...
|
|
c3_w kno_w; // kernel number validated with
|
|
c3_l sal_l; // salt for passcode
|
|
c3_l key_l; // mug of crypto key, or 0
|
|
c3_l sev_l; // host process identity
|
|
c3_l tno_l; // terminal count in host
|
|
} u3_uled;
|
|
|
|
/* u3_olar: event log trailer, old version.
|
|
*/
|
|
typedef struct {
|
|
c3_w syn_w; // must equal mug of address
|
|
c3_w ent_w; // event sequence number
|
|
c3_w len_w; // word length of this event
|
|
c3_w mug_w; // mug of entry
|
|
} u3_olar;
|
|
|
|
/* u3_ular: event log trailer.
|
|
*/
|
|
typedef struct {
|
|
c3_w syn_w; // must equal mug of address
|
|
c3_d ent_d; // event sequence number
|
|
c3_w len_w; // word length of this event
|
|
c3_w mug_w; // mug of entry
|
|
c3_w tem_w; // raft term of event
|
|
c3_w typ_w; // type of event, %ra|%ov
|
|
} u3_ular;
|
|
|
|
/* u3_ulog: unix event log.
|
|
*/
|
|
typedef struct {
|
|
c3_i fid_i; // file descriptor
|
|
c3_d len_d; // length in words
|
|
} u3_ulog;
|
|
|
|
struct _u3_umon;
|
|
struct _u3_udir;
|
|
struct _u3_ufil;
|
|
|
|
/* u3_unod: file or directory.
|
|
*/
|
|
typedef struct _u3_unod {
|
|
uv_fs_event_t was_u; // stat watcher
|
|
c3_o dir; // c3y if dir, c3n if file
|
|
c3_o dry; // ie, unmodified
|
|
c3_c* pax_c; // absolute path
|
|
struct _u3_udir* par_u; // parent
|
|
struct _u3_unod* nex_u; // internal list
|
|
} u3_unod;
|
|
|
|
/* u3_ufil: synchronized file.
|
|
*/
|
|
typedef struct _u3_ufil {
|
|
uv_fs_event_t was_u; // stat watcher
|
|
c3_o dir; // c3y if dir, c3n if file
|
|
c3_o dry; // ie, unmodified
|
|
c3_c* pax_c; // absolute path
|
|
struct _u3_udir* par_u; // parent
|
|
struct _u3_unod* nex_u; // internal list
|
|
c3_w mug_w; // mug of last %into
|
|
c3_w gum_w; // mug of last %ergo
|
|
} u3_ufil;
|
|
|
|
/* u3_ufil: synchronized directory.
|
|
*/
|
|
typedef struct _u3_udir {
|
|
uv_fs_event_t was_u; // stat watcher
|
|
c3_o dir; // c3y if dir, c3n if file
|
|
c3_o dry; // ie, unmodified
|
|
c3_c* pax_c; // absolute path
|
|
struct _u3_udir* par_u; // parent
|
|
struct _u3_unod* nex_u; // internal list
|
|
u3_unod* kid_u; // subnodes
|
|
} u3_udir;
|
|
|
|
/* u3_ufil: synchronized mount point.
|
|
*/
|
|
typedef struct _u3_umon {
|
|
u3_udir dir_u; // root directory, must be first
|
|
c3_c* nam_c; // mount point name
|
|
struct _u3_umon* nex_u; // internal list
|
|
} u3_umon;
|
|
|
|
/* u3_usig: receive signals.
|
|
*/
|
|
typedef struct _u3_usig {
|
|
uv_signal_t sil_u;
|
|
c3_i num_i;
|
|
struct _u3_usig* nex_u;
|
|
} u3_usig;
|
|
|
|
/* u3_unix: clay support system, also
|
|
*/
|
|
typedef struct _u3_unix {
|
|
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
|
|
c3_w lot_w; // sync-slot
|
|
struct _u3_sylo {
|
|
c3_o unx; // from unix
|
|
c3_m wer_m; // mote saying where
|
|
c3_m wot_m; // mote saying what
|
|
c3_c* pax_c; // path
|
|
} sylo[1024];
|
|
#endif
|
|
} u3_unix;
|
|
|
|
/* u3_behn: just a timer for ever
|
|
*/
|
|
typedef struct _u3_behn {
|
|
uv_timer_t tim_u; // behn timer
|
|
c3_w run_w; // run of consecutive alarms
|
|
c3_o alm; // alarm
|
|
} u3_behn;
|
|
|
|
/* u2_utfo: unix terminfo strings.
|
|
*/
|
|
typedef struct {
|
|
struct {
|
|
const c3_y* kcuu1_y; // key_up
|
|
const c3_y* kcud1_y; // key_down
|
|
const c3_y* kcub1_y; // key_back
|
|
const c3_y* kcuf1_y; // key_forward
|
|
c3_w max_w; // maximum input sequence length
|
|
} inn;
|
|
struct {
|
|
const c3_y* clear_y; // clear_screen
|
|
const c3_y* el_y; // clr_bol clear to beginning
|
|
// const c3_y* el1_y; // clr_eol clear to end
|
|
const c3_y* ed_y; // clear to end of screen
|
|
const c3_y* bel_y; // bel sound bell
|
|
const c3_y* cub1_y; // parm_left
|
|
const c3_y* cuf1_y; // parm_right
|
|
const c3_y* cuu1_y; // parm_up
|
|
const c3_y* cud1_y; // parm_down
|
|
// const c3_y* cub_y; // parm_left_cursor #num
|
|
// const c3_y* cuf_y; // parm_right_cursor #num
|
|
} out;
|
|
} u3_utfo;
|
|
|
|
#if 0
|
|
/* u3_uwen: unix alarm.
|
|
*/
|
|
typedef struct _u3_uwen {
|
|
c3_y* pax_y; // printed path
|
|
c3_d wen_d[2]; // timer expire
|
|
};
|
|
|
|
/* u3_utim: unix timer control.
|
|
*/
|
|
typedef struct _u3_utim {
|
|
uv_timer_t wat_u; // timer control
|
|
u3_uwen* wen_u; // timers in ascending order
|
|
};
|
|
#endif
|
|
|
|
/* u3_utty: unix tty.
|
|
*/
|
|
typedef struct _u3_utty {
|
|
union {
|
|
uv_pipe_t pop_u;
|
|
uv_tcp_t wax_u;
|
|
};
|
|
struct _u3_utty* nex_u; // next in host list
|
|
c3_i fid_i; // file descriptor
|
|
c3_w tid_l; // terminal identity number
|
|
u3_utfo ufo_u; // terminfo strings
|
|
c3_i cug_i; // blocking fcntl flags
|
|
c3_i nob_i; // nonblocking fcntl flags
|
|
u3_utat tat_u; // control state
|
|
struct termios bak_u; // cooked terminal state
|
|
struct termios raw_u; // raw terminal state
|
|
} u3_utty;
|
|
|
|
/* u3_utel: unix telnet listener.
|
|
*/
|
|
typedef struct _u3_utel {
|
|
struct _u3_utty uty_t; // pseudo-tty
|
|
c3_s por_s; // file descriptor
|
|
void* tel_u; // telnet context
|
|
} u3_utel;
|
|
|
|
/* u3_raty: raft server type.
|
|
*/
|
|
typedef enum {
|
|
u3_raty_none,
|
|
u3_raty_foll,
|
|
u3_raty_cand,
|
|
u3_raty_lead
|
|
} u3_raty;
|
|
|
|
/* u3_raft: raft state.
|
|
*/
|
|
typedef struct {
|
|
uv_tcp_t wax_u; // TCP listener
|
|
uv_timer_t tim_u; // election/heartbeat timer
|
|
u3_ulog lug_u; // event log
|
|
c3_d ent_d; // last log index
|
|
c3_w lat_w; // last log term
|
|
u3_raty typ_e; // server type
|
|
struct _u3_rnam* nam_u; // list of peers
|
|
struct _u3_rcon* run_u; // unknown connections
|
|
c3_w pop_w; // population count
|
|
c3_w vot_w; // votes in this election
|
|
c3_c* str_c; // our name
|
|
// persistent state
|
|
c3_w tem_w; // current term
|
|
c3_c* vog_c; // who we voted for this term
|
|
// end persistent state
|
|
} u3_raft;
|
|
|
|
/* u3_rreq: raft request.
|
|
*/
|
|
typedef struct _u3_rreq {
|
|
struct _u3_rmsg* msg_u;
|
|
struct _u3_rreq* nex_u;
|
|
struct _u3_rcon* ron_u;
|
|
} u3_rreq;
|
|
|
|
/* u3_rbuf: raft input buffer.
|
|
*/
|
|
typedef struct _u3_rbuf {
|
|
c3_w len_w;
|
|
c3_w cap_w;
|
|
c3_y buf_y[0];
|
|
} u3_rbuf;
|
|
|
|
/* u3_rcon: raft connection.
|
|
*/
|
|
typedef struct _u3_rcon {
|
|
uv_tcp_t wax_u; // TCP handle
|
|
struct _u3_rnam* nam_u; // peer we're connected to
|
|
u3_rbuf* red_u; // read buffer
|
|
c3_o red; // u3_yes on new data
|
|
u3_rbuf* wri_u; // write buffer
|
|
u3_raft* raf_u; // back-reference to server
|
|
u3_rreq* out_u; // exit of request queue
|
|
u3_rreq* tou_u; // entry of request queue
|
|
struct _u3_rcon* nex_u; // pointer to next con
|
|
c3_o liv; // are we live?
|
|
} u3_rcon;
|
|
|
|
/* u3_rnam: raft peer name.
|
|
*/
|
|
typedef struct _u3_rnam {
|
|
c3_c* str_c; // our name
|
|
c3_c* nam_c; // hostname
|
|
c3_c* por_c; // port
|
|
u3_rcon* ron_u; // connection
|
|
struct _u3_rnam* nex_u; // pointer to next peer
|
|
c3_o vog; // did they vote for us?
|
|
} u3_rnam;
|
|
|
|
/* u3_opts: command line configuration.
|
|
*/
|
|
typedef struct _u3_opts {
|
|
c3_c* arv_c; // -A, initial sync from
|
|
c3_c* dns_c; // -H, ames bootstrap domain
|
|
c3_c* gen_c; // -G, czar generator
|
|
c3_c* imp_c; // -I, czar name
|
|
c3_c* nam_c; // -n, unix hostname
|
|
c3_c* pil_c; // -B, bootstrap from
|
|
c3_c* raf_c; // -r, raft flotilla
|
|
c3_c* tic_c; // -t, ticket value
|
|
c3_c* url_c; // -u, pill url
|
|
c3_c* who_c; // -w, begin with ticket
|
|
c3_o abo; // -a
|
|
c3_o bat; // -b, batch create
|
|
c3_o dem; // -d, daemon
|
|
c3_o dry; // -D, dry compute
|
|
c3_o fak; // -F, fake carrier
|
|
c3_o fog; // -X, skip last event
|
|
c3_o gab; // -g, run with garbage collector
|
|
c3_o git; // -s, pill url from arvo git hash
|
|
c3_o mem; // -M, memory madness
|
|
c3_o net; // -N, remote networking in -F mode
|
|
c3_o nuu; // -c, new pier
|
|
c3_o pro; // -P, profile
|
|
c3_o qui; // -q, quiet
|
|
c3_o rep; // -R, report build info
|
|
c3_o tex; // -x, exit after loading
|
|
c3_o veb; // -v, verbose (inverse of -q)
|
|
c3_o vno; // -V, replay without reboots
|
|
c3_s por_s; // -p, ames port
|
|
c3_s rop_s; // -l, raft port
|
|
c3_w fuz_w; // -f, fuzz testing
|
|
c3_w kno_w; // -k, kernel version
|
|
} u3_opts;
|
|
|
|
/* u3_host: entire host.
|
|
*/
|
|
typedef struct _u3_host {
|
|
c3_w kno_w; // current executing stage
|
|
c3_c* dir_c; // pier path (no trailing /)
|
|
c3_d now_d; // event tick
|
|
uv_loop_t* lup_u; // libuv event loop
|
|
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_ames sam_u; // packet interface
|
|
u3_save sav_u; // autosave
|
|
u3_opts ops_u; // commandline options
|
|
u3_unix unx_u; // sync and clay
|
|
u3_behn teh_u; // behn timer
|
|
c3_o liv; // if u3_no, shut down
|
|
c3_i xit_i; // exit code for shutdown
|
|
void* tls_u; // server SSL_CTX*
|
|
} u3_host; // host == computer == process
|
|
|
|
# define u3L u3_Host.lup_u // global event loop
|
|
# define u3Z (&(u3_Raft))
|
|
|
|
/** Global variables.
|
|
**/
|
|
c3_global u3_host u3_Host;
|
|
c3_global u3_raft u3_Raft;
|
|
c3_global c3_c* u3_Local;
|
|
|
|
/** Functions.
|
|
**/
|
|
/* Urbit time: 128 bits, leap-free.
|
|
**
|
|
** High 64 bits: 0x8000.000c.cea3.5380 + Unix time at leap 25 (Jul 2012)
|
|
** Low 64 bits: 1/2^64 of a second.
|
|
**
|
|
** Seconds per Gregorian 400-block: 12.622.780.800
|
|
** 400-blocks from 0 to 0AD: 730.692.561
|
|
** Years from 0 to 0AD: 292.277.024.400
|
|
** Seconds from 0 to 0AD: 9.223.372.029.693.628.800
|
|
** Seconds between 0A and Unix epoch: 62.167.219.200
|
|
** Seconds before Unix epoch: 9.223.372.091.860.848.000
|
|
** The same, in C hex notation: 0x8000000cce9e0d80ULL
|
|
**
|
|
** New leap seconds after July 2012 (leap second 25) are ignored. The
|
|
** platform OS will not ignore them, of course, so they must be detected
|
|
** and counteracted. Perhaps this phenomenon will soon find an endpoint.
|
|
*/
|
|
/* u3_time_sec_in(): urbit seconds from unix time.
|
|
**
|
|
** Adjust (externally) for future leap secs!
|
|
*/
|
|
c3_d
|
|
u3_time_sec_in(c3_w unx_w);
|
|
|
|
/* u3_time_sec_out(): unix time from urbit seconds.
|
|
**
|
|
** Adjust (externally) for future leap secs!
|
|
*/
|
|
c3_w
|
|
u3_time_sec_out(c3_d urs_d);
|
|
|
|
/* u3_time_fsc_in(): urbit fracto-seconds from unix microseconds.
|
|
*/
|
|
c3_d
|
|
u3_time_fsc_in(c3_w usc_w);
|
|
|
|
/* u3_time_fsc_out: unix microseconds from urbit fracto-seconds.
|
|
*/
|
|
c3_w
|
|
u3_time_fsc_out(c3_d ufc_d);
|
|
|
|
/* u3_time_in_tv(): urbit time from struct timeval.
|
|
*/
|
|
u3_atom
|
|
u3_time_in_tv(struct timeval* tim_tv);
|
|
|
|
/* u3_time_out_tv(): struct timeval from urbit time.
|
|
*/
|
|
void
|
|
u3_time_out_tv(struct timeval* tim_tv, u3_noun now);
|
|
|
|
/* u3_time_in_ts(): urbit time from struct timespec.
|
|
*/
|
|
u3_atom
|
|
u3_time_in_ts(struct timespec* tim_ts);
|
|
#if defined(U3_OS_linux)
|
|
/* u3_time_t_in_ts(): urbit time from time_t.
|
|
*/
|
|
u3_atom
|
|
u3_time_t_in_ts(time_t tim);
|
|
#endif
|
|
|
|
/* u3_time_out_ts(): struct timespec from urbit time.
|
|
*/
|
|
void
|
|
u3_time_out_ts(struct timespec* tim_ts, u3_noun now);
|
|
|
|
/* u3_time_gap_ms(): (wen - now) in ms.
|
|
*/
|
|
c3_d
|
|
u3_time_gap_ms(u3_noun now, u3_noun wen);
|
|
|
|
/** Filesystem (new api).
|
|
**/
|
|
/* u3_walk_load(): load file or bail.
|
|
*/
|
|
u3_noun
|
|
u3_walk_load(c3_c* pas_c);
|
|
|
|
/* u3_walk_safe(): load file or 0.
|
|
*/
|
|
u3_noun
|
|
u3_walk_safe(c3_c* pas_c);
|
|
|
|
/* u3_walk_save(): save file or bail.
|
|
*/
|
|
void
|
|
u3_walk_save(c3_c* pas_c, u3_noun tim, u3_atom pad, c3_c* bas_c, u3_noun pax);
|
|
|
|
/* u3_sync_reck(): traverse filesystem for changes -> lamb
|
|
*/
|
|
u3_noun
|
|
u3_sync_reck(void);
|
|
|
|
/* u3_walk(): traverse `dir_c` to produce an arch, updating `old`.
|
|
*/
|
|
u3_noun
|
|
u3_walk(const c3_c* dir_c, u3_noun old);
|
|
|
|
/* u3_path(): C unix path in computer for file or directory.
|
|
*/
|
|
c3_c*
|
|
u3_path(c3_o fyl, u3_noun pax);
|
|
|
|
/** Filesystem (old api).
|
|
**/
|
|
/* u3_ve_file(): load internal file as atom from local or system.
|
|
*/
|
|
u3_weak
|
|
u3_ve_file(c3_c* ext_c, u3_noun tah);
|
|
|
|
/* u3_ve_frep(): load [.~ %rep myp {now} tah].
|
|
**
|
|
** File is either ~ or [nbytes mdate atom].
|
|
*/
|
|
u3_noun
|
|
u3_ve_frep(u3_noun myp, u3_noun tah);
|
|
|
|
/* u3_ve_date(): date internal file.
|
|
*/
|
|
c3_d
|
|
u3_ve_date(c3_c* ext_c, u3_noun tah);
|
|
|
|
/* u3_ve_save(): save internal file as atom.
|
|
*/
|
|
c3_o
|
|
u3_ve_save(c3_c* ext_c, u3_noun tah, u3_noun dat);
|
|
|
|
/* u3_ve_zeus(): prayer to internal file path. Return unit.
|
|
*/
|
|
u3_noun
|
|
u3_ve_zeus(u3_noun hap);
|
|
|
|
/** Output.
|
|
**/
|
|
/* u3_ve_tank(): print a tank at `tab`.
|
|
*/
|
|
void
|
|
u3_ve_tank(c3_l tab_l, u3_noun tac);
|
|
|
|
/* u3_reck_kick(): handle effect.
|
|
*/
|
|
void
|
|
u3_reck_kick(u3_noun ovo);
|
|
|
|
|
|
/** Main loop, new style.
|
|
**/
|
|
/* u3_lo_loop(): enter main event loop.
|
|
*/
|
|
void
|
|
u3_lo_loop(void);
|
|
|
|
/* u3_lo_lead(): actions on promotion to leader.
|
|
*/
|
|
void
|
|
u3_lo_lead(void);
|
|
|
|
/* u3_lo_exit(): shut down io across pier.
|
|
*/
|
|
void
|
|
u3_lo_exit(void);
|
|
|
|
/* u3_lo_show(): print typeless noun.
|
|
*/
|
|
void
|
|
u3_lo_show(c3_c* cap_c, u3_noun nun);
|
|
#define u3ls(cap_c, nun) u3_lo_show(cap_c, nun)
|
|
|
|
/* u3_lo_bail(): clean up all event state.
|
|
*/
|
|
void
|
|
u3_lo_bail(void);
|
|
|
|
/* u3_lo_tank(): dump single tank.
|
|
*/
|
|
void
|
|
u3_lo_tank(c3_l tab_l, u3_noun tac);
|
|
|
|
/* u3_lo_punt(): dump tank list.
|
|
*/
|
|
void
|
|
u3_lo_punt(c3_l tab_l, u3_noun tac);
|
|
|
|
/* u3_lo_sway(): print trace.
|
|
*/
|
|
void
|
|
u3_lo_sway(c3_l tab_l, u3_noun tax);
|
|
|
|
/* u3_lo_grab(): garbage-collect the world, plus roots; end with u3_none
|
|
*/
|
|
void
|
|
u3_lo_grab(c3_c* cap_c, u3_noun som, ...);
|
|
|
|
/* u3_lo_open(): begin callback processing.
|
|
*/
|
|
void
|
|
u3_lo_open(void);
|
|
|
|
/* u3_lo_shut(): end callback processing.
|
|
*/
|
|
void
|
|
u3_lo_shut(c3_o);
|
|
|
|
|
|
/** Terminal, new style.
|
|
**/
|
|
/* u3_term_get_blew(): return window size [columns rows].
|
|
*/
|
|
u3_noun
|
|
u3_term_get_blew(c3_l tid_l);
|
|
|
|
/* u3_term_ef_boil(): initial effects for restored server.
|
|
*/
|
|
void
|
|
u3_term_ef_boil();
|
|
|
|
/* u3_term_ef_ticket(): initial effects for new ticket.
|
|
*/
|
|
void
|
|
u3_term_ef_ticket(c3_c* who_c, c3_c* tic_c);
|
|
|
|
/* u3_term_ef_verb(): initial effects for verbose events.
|
|
*/
|
|
void
|
|
u3_term_ef_verb(void);
|
|
|
|
/* u3_term_ef_winc(): window change.
|
|
*/
|
|
void
|
|
u3_term_ef_winc(void);
|
|
|
|
/* u3_term_ef_ctlc(): send ^C.
|
|
*/
|
|
void
|
|
u3_term_ef_ctlc(void);
|
|
|
|
/* u3_term_ef_bake(): initial effects for new server.
|
|
*/
|
|
void
|
|
u3_term_ef_bake(u3_noun fav);
|
|
|
|
/* u3_term_ef_blit(): send %blit effect to terminal.
|
|
*/
|
|
void
|
|
u3_term_ef_blit(c3_l tid_l,
|
|
u3_noun blt);
|
|
|
|
/* u3_term_io_init(): initialize terminal I/O.
|
|
*/
|
|
void
|
|
u3_term_io_init(void);
|
|
|
|
/* u3_term_io_talk(): start terminal listener.
|
|
*/
|
|
void
|
|
u3_term_io_talk(void);
|
|
|
|
/* u3_term_io_exit(): terminate terminal I/O.
|
|
*/
|
|
void
|
|
u3_term_io_exit(void);
|
|
|
|
/* u3_term_io_poll(): update terminal IO state.
|
|
*/
|
|
void
|
|
u3_term_io_poll(void);
|
|
|
|
/* u3_term_io_hija(): hijack console for cooked print.
|
|
*/
|
|
FILE*
|
|
u3_term_io_hija(void);
|
|
|
|
/* u3_term_io_loja(): release console from cooked print.
|
|
*/
|
|
void
|
|
u3_term_io_loja(int x);
|
|
|
|
/* uL, uH: wrap hijack/lojack around fprintf.
|
|
**
|
|
** uL(fprintf(uH, ...));
|
|
*/
|
|
# define uH u3_term_io_hija()
|
|
# define uL(x) u3_term_io_loja(x)
|
|
|
|
|
|
/** Ames, packet networking.
|
|
**/
|
|
/* u3_ames_ef_bake(): create ames duct.
|
|
*/
|
|
void
|
|
u3_ames_ef_bake(void);
|
|
|
|
/* u3_ames_ef_send(): send packet to network.
|
|
*/
|
|
void
|
|
u3_ames_ef_send(u3_noun lan,
|
|
u3_noun pac);
|
|
|
|
/* u3_ames_io_init(): initialize ames I/O.
|
|
*/
|
|
void
|
|
u3_ames_io_init(void);
|
|
|
|
/* u3_ames_io_talk(): bring up listener.
|
|
*/
|
|
void
|
|
u3_ames_io_talk(void);
|
|
|
|
/* u3_ames_io_exit(): terminate ames I/O.
|
|
*/
|
|
void
|
|
u3_ames_io_exit(void);
|
|
|
|
/* u3_ames_io_poll(): update ames IO state.
|
|
*/
|
|
void
|
|
u3_ames_io_poll(void);
|
|
|
|
/** Autosave.
|
|
**/
|
|
/* u3_save_ef_chld(): report SIGCHLD.
|
|
*/
|
|
void
|
|
u3_save_ef_chld(void);
|
|
|
|
/* u3_save_io_init(): initialize autosave.
|
|
*/
|
|
void
|
|
u3_save_io_init(void);
|
|
|
|
/* u3_save_io_exit(): terminate autosave.
|
|
*/
|
|
void
|
|
u3_save_io_exit(void);
|
|
|
|
/* u3_save_io_poll(): update autosave state.
|
|
*/
|
|
void
|
|
u3_save_io_poll(void);
|
|
|
|
/** Storage, new school.
|
|
**/
|
|
/* u3_unix_ef_hold():
|
|
*/
|
|
void
|
|
u3_unix_ef_hold();
|
|
|
|
/* u3_unix_ef_move():
|
|
*/
|
|
void
|
|
u3_unix_ef_move();
|
|
|
|
/* u3_unix_initial_into(): intialize filesystem from urb/zod
|
|
*/
|
|
void
|
|
u3_unix_ef_initial_into();
|
|
|
|
/* u3_unix_ef_look(): update filesystem from unix
|
|
*/
|
|
void
|
|
u3_unix_ef_look(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_ogre(): delete mount point
|
|
*/
|
|
void
|
|
u3_unix_ef_ogre(u3_noun mon);
|
|
|
|
/* u3_unix_ef_hill(): enumerate mount points
|
|
*/
|
|
void
|
|
u3_unix_ef_hill(u3_noun hil);
|
|
|
|
/* u3_unix_io_init(): initialize storage.
|
|
*/
|
|
void
|
|
u3_unix_io_init(void);
|
|
|
|
/* u3_unix_io_talk(): start listening for fs events.
|
|
*/
|
|
void
|
|
u3_unix_io_talk(void);
|
|
|
|
/* u3_unix_io_exit(): terminate storage.
|
|
*/
|
|
void
|
|
u3_unix_io_exit(void);
|
|
|
|
/* u3_unix_io_poll(): update storage state.
|
|
*/
|
|
void
|
|
u3_unix_io_poll(void);
|
|
|
|
|
|
/** behn, just a timer.
|
|
**/
|
|
/* u2_behn_io_init(): initialize behn timer.
|
|
*/
|
|
void
|
|
u2_behn_io_init(void);
|
|
|
|
/* u2_behn_io_exit(): terminate timer.
|
|
*/
|
|
void
|
|
u2_behn_io_exit(void);
|
|
|
|
/* u2_behn_io_poll(): update behn IO state.
|
|
*/
|
|
void
|
|
u2_behn_io_poll(void);
|
|
|
|
|
|
/** HTTP server.
|
|
**/
|
|
/* u3_http_ef_thou(): send %thou effect to http.
|
|
*/
|
|
void
|
|
u3_http_ef_thou(c3_l sev_l,
|
|
c3_l coq_l,
|
|
c3_l seq_l,
|
|
u3_noun rep);
|
|
|
|
/* u3_cttp_ef_thus(): send %thus effect to cttp.
|
|
*/
|
|
void
|
|
u3_cttp_ef_thus(c3_l num_l,
|
|
u3_noun req);
|
|
|
|
/* u3_http_ef_bake(): create new http server.
|
|
*/
|
|
void
|
|
u3_http_ef_bake(void);
|
|
|
|
/* u3_http_io_init(): initialize http I/O.
|
|
*/
|
|
void
|
|
u3_http_io_init(void);
|
|
|
|
/* u3_http_io_talk(): start http listener.
|
|
*/
|
|
void
|
|
u3_http_io_talk(void);
|
|
|
|
/* u3_http_io_exit(): terminate http I/O.
|
|
*/
|
|
void
|
|
u3_http_io_exit(void);
|
|
|
|
/* u3_http_io_poll(): update http IO state.
|
|
*/
|
|
void
|
|
u3_http_io_poll(void);
|
|
|
|
/** Raft log syncing.
|
|
**/
|
|
/* u3_raft_readopt(): parse command line options.
|
|
*/
|
|
u3_rnam*
|
|
u3_raft_readopt(const c3_c* arg_c, c3_c* our_c, c3_s oup_s);
|
|
|
|
/* u3_raft_init(): start Raft process.
|
|
*/
|
|
void
|
|
u3_raft_init(void);
|
|
|
|
/* u3_raft_work(): poke, kick, and push pending events.
|
|
*/
|
|
void
|
|
u3_raft_work(void);
|
|
|
|
|
|
/** Disk persistence.
|
|
**/
|
|
/* u3_sist_boot(): restore or create pier from disk.
|
|
*/
|
|
void
|
|
u3_sist_boot(void);
|
|
|
|
/* u3_sist_pack(): write a log entry to disk.
|
|
**
|
|
** XX Synchronous.
|
|
**
|
|
** typ_w is a mote describing the entry type: %ov for Arvo
|
|
** logs, %ra for Raft events.
|
|
**
|
|
** Returns the entry's sequence number.
|
|
*/
|
|
c3_d
|
|
u3_sist_pack(c3_w tem_w,
|
|
c3_w typ_w,
|
|
c3_w* bob_w,
|
|
c3_w len_w);
|
|
|
|
/* u3_sist_put(): moronic key-value store put.
|
|
**
|
|
** u3_sist_put will do its best to associate the passed key with
|
|
** the passed value in a way that will persist across process
|
|
** restarts. It will probably do so by writing a file named for
|
|
** the key with contents identical to the value. To rely on it
|
|
** for anything heavy-duty would be a mistake.
|
|
**
|
|
** Why would we even have something like this? Because sometimes
|
|
** we need to maintain files completely independently of the
|
|
** noun state.
|
|
*/
|
|
void
|
|
u3_sist_put(const c3_c* key_c, const c3_y* val_y, size_t siz_i);
|
|
|
|
/* u3_sist_nil(): moronic key-value store rm.
|
|
**
|
|
** Does its best to expunge all records on the given key. Has
|
|
** no effect if the key doesn't exist.
|
|
*/
|
|
void
|
|
u3_sist_nil(const c3_c* key_c);
|
|
|
|
/* u3_sist_has(): moronic key-value store existence check.
|
|
**
|
|
** Returns the byte length of the value previously stored via
|
|
** u3_sist_put, or -1 if it couldn't find one.
|
|
*/
|
|
ssize_t
|
|
u3_sist_has(const c3_c* key_c);
|
|
|
|
/* u3_sist_get(): moronic key-value store get.
|
|
**
|
|
** u3_sist_get is the mirror of u3_sist_put. It writes to val_y,
|
|
** which had better be at least as big as the return value from
|
|
** u3_sist_has, the value that you previously put.
|
|
**
|
|
** Needless to say, u3_sist_get crashes if it can't find your
|
|
** value.
|
|
*/
|
|
void
|
|
u3_sist_get(const c3_c* key_c, c3_y* val_y);
|
|
|
|
/* u3_sist_rand(): fill 8 words (32 bytes) with high-quality entropy.
|
|
*/
|
|
void
|
|
u3_sist_rand(c3_w* rad_w);
|
|
|
|
/** New timer system.
|
|
**/
|
|
/* u3_behn_io_init(): initialize time timer.
|
|
*/
|
|
void
|
|
u3_behn_io_init(void);
|
|
|
|
/* u3_behn_io_exit(): terminate timer.
|
|
*/
|
|
void
|
|
u3_behn_io_exit(void);
|
|
|
|
/* u3_behn_io_poll(): update behn IO state.
|
|
*/
|
|
void
|
|
u3_behn_io_poll(void);
|
|
|
|
|
|
/** HTTP client.
|
|
**/
|
|
/* u3_cttp_ef_thus(): send %thus effect to cttp.
|
|
*/
|
|
void
|
|
u3_cttp_ef_thus(c3_l num_l,
|
|
u3_noun req);
|
|
|
|
/* u3_cttp_io_init(): initialize cttp I/O.
|
|
*/
|
|
void
|
|
u3_cttp_io_init(void);
|
|
|
|
/* u3_cttp_io_exit(): terminate cttp I/O.
|
|
*/
|
|
void
|
|
u3_cttp_io_exit(void);
|
|
|
|
/* u3_cttp_io_poll(): update cttp IO state.
|
|
*/
|
|
void
|
|
u3_cttp_io_poll(void);
|