From e56bcde3ca12d4c14b9e1b0198e13345d7ec3fee Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Tue, 2 Apr 2019 20:31:31 +0200 Subject: [PATCH] subu-0 lib compiles again --- makefile | 21 ++-- module/da/include/da.h | 51 ++++++++++ module/da/lib/libda.a | Bin 0 -> 17734 bytes module/da/makefile | 2 +- module/da/makefile-flags | 7 +- module/da/src/da.lib.c | 14 ++- module/da/src/da.lib.h | 5 +- module/da/test/exec/test_da | Bin 0 -> 35376 bytes module/da/test/lib/libtest.a | Bin 0 -> 12162 bytes module/da/test/makefile-flags | 4 +- .../include/db.h => debug/include/debug.h} | 0 module/debug/lib/libda.a | Bin 6698 -> 0 bytes module/debug/lib/libdebug.a | Bin 0 -> 6726 bytes module/debug/makefile | 2 +- module/debug/makefile-flags | 9 +- module/dispatch/include/dispatch.h | 32 ++++++ module/dispatch/lib/libdispatch.a | Bin 0 -> 12306 bytes module/dispatch/makefile | 2 +- module/dispatch/makefile-flags | 6 +- module/dispatch/trc/dispatch.trc.c | 2 +- module/share/include/da.h | 5 +- module/share/include/debug.h | 6 ++ module/subu-0/include/subu.h | 62 ++++++++++++ module/subu-0/lib/libsubu-0.a | Bin 0 -> 54914 bytes module/subu-0/makefile | 17 ++-- module/subu-0/makefile-flags | 10 +- .../subu-0/trc/{common.lib.c => common.trc.c} | 0 ...ubu-bind-all.cli.c => subu-bind-all.trc.c} | 3 +- .../trc/{subu-bind.cli.c => subu-bind.trc.c} | 3 +- .../trc/{subu-mk-0.cli.c => subu-mk-0.trc.c} | 3 +- .../trc/{subu-rm-0.cli.c => subu-rm-0.trc.c} | 3 +- module/subu-0/trc/{subu.lib.c => subu.trc.c} | 91 ++++++++++++------ .../{subudb-init.cli.c => subudb-init.trc.c} | 3 +- ...ubudb-number.cli.c => subudb-number.trc.c} | 3 +- ...udb-rel-get.cli.c => subudb-rel-get.trc.c} | 3 +- ...udb-rel-put.cli.c => subudb-rel-put.trc.c} | 3 +- ...ubudb-rel-rm.cli.c => subudb-rel-rm.trc.c} | 3 +- ...{subudb-subus.cli.c => subudb-subus.trc.c} | 3 +- module/subu-0/trc/{db.lib.c => subudb.trc.c} | 83 +++++++++------- module/subu-0/try/makefile | 11 +++ module/tranche/exec/tranche | Bin 0 -> 38888 bytes module/tranche/exec/tranche-make | Bin 0 -> 38984 bytes module/tranche/exec/tranche-target | Bin 0 -> 39000 bytes module/tranche/include/tranche.h | 16 +++ module/tranche/lib/libtranche.a | Bin 0 -> 19562 bytes module/tranche/makefile | 2 +- module/tranche/makefile-flags | 7 +- module/tranche/src/tranche.lib.c | 84 +++++++++------- module/tranche/test/try/test4.out.expected | 2 + tool/bin/tranche | Bin 38520 -> 38888 bytes tool/bin/tranche-make | Bin 38624 -> 38984 bytes tool/bin/tranche-target | Bin 38640 -> 39000 bytes tool/lib/makefile-cc | 13 ++- 53 files changed, 420 insertions(+), 176 deletions(-) create mode 100644 module/da/include/da.h create mode 100644 module/da/lib/libda.a create mode 100755 module/da/test/exec/test_da create mode 100644 module/da/test/lib/libtest.a rename module/{share/include/db.h => debug/include/debug.h} (100%) delete mode 100644 module/debug/lib/libda.a create mode 100644 module/debug/lib/libdebug.a create mode 100644 module/dispatch/include/dispatch.h create mode 100644 module/dispatch/lib/libdispatch.a create mode 100644 module/share/include/debug.h create mode 100644 module/subu-0/include/subu.h create mode 100644 module/subu-0/lib/libsubu-0.a rename module/subu-0/trc/{common.lib.c => common.trc.c} (100%) rename module/subu-0/trc/{subu-bind-all.cli.c => subu-bind-all.trc.c} (93%) rename module/subu-0/trc/{subu-bind.cli.c => subu-bind.trc.c} (92%) rename module/subu-0/trc/{subu-mk-0.cli.c => subu-mk-0.trc.c} (95%) rename module/subu-0/trc/{subu-rm-0.cli.c => subu-rm-0.trc.c} (94%) rename module/subu-0/trc/{subu.lib.c => subu.trc.c} (92%) rename module/subu-0/trc/{subudb-init.cli.c => subudb-init.trc.c} (93%) rename module/subu-0/trc/{subudb-number.cli.c => subudb-number.trc.c} (97%) rename module/subu-0/trc/{subudb-rel-get.cli.c => subudb-rel-get.trc.c} (96%) rename module/subu-0/trc/{subudb-rel-put.cli.c => subudb-rel-put.trc.c} (96%) rename module/subu-0/trc/{subudb-rel-rm.cli.c => subudb-rel-rm.trc.c} (96%) rename module/subu-0/trc/{subudb-subus.cli.c => subudb-subus.trc.c} (96%) rename module/subu-0/trc/{db.lib.c => subudb.trc.c} (76%) create mode 100644 module/subu-0/try/makefile create mode 100755 module/tranche/exec/tranche create mode 100755 module/tranche/exec/tranche-make create mode 100755 module/tranche/exec/tranche-target create mode 100644 module/tranche/include/tranche.h create mode 100644 module/tranche/lib/libtranche.a diff --git a/makefile b/makefile index 06d6508..287b43b 100755 --- a/makefile +++ b/makefile @@ -4,23 +4,23 @@ MAKEABLE=\ module/da/test\ module/debug\ module/tranche\ - module/dispatch + module/dispatch\ + module/subu-0 .PHONY: all all: - $(foreach dir, $(MAKEABLE), \ - -make -C $$dir dist-clean dep lib exec share - ) + for dir in $(MAKEABLE); do pushd $$dir; make dist-clean dep lib exec share; popd; done -.PHONY: all +.PHONY: dep +dep: + for dir in $(MAKEABLE); do pushd $$dir; make dep; popd; done + +.PHONY: update update: - $(foreach dir, $(MAKEABLE), \ - -make -C $$dir lib exec share - ) + for dir in $(MAKEABLE); do pushd $$dir; make lib exec share; popd; done .PHONY: info info: - @echo "SRCDIRS:" $(SRCDIRS) @echo "MAKEABLE:" $(MAKEABLE) .PHONY: clean @@ -28,8 +28,7 @@ clean: for dir in $(MAKEABLE); do pushd $$dir; make clean; popd; done .PHONY: dist-clean -dist-clean : - for dir in $(MAKEABLE); do pushd $$dir; make dist-clean; popd; done +dist-clean : clean for i in $(wildcard module/share/lib/*); do rm $$i; done for i in $(wildcard module/share/inc/*); do rm $$i; done for i in $(wildcard module/share/bin/*); do rm $$i; done diff --git a/module/da/include/da.h b/module/da/include/da.h new file mode 100644 index 0000000..8195c4a --- /dev/null +++ b/module/da/include/da.h @@ -0,0 +1,51 @@ +#ifndef DA_LIB_H +#define DA_LIB_H +#include +#include +#include + +typedef struct Da{ + char *base; + char *end; // one byte/one element off the end of the array + size_t size; // size >= (end - base) + 1; + size_t element_size; +} Da; + +#define RETURN(dap, r) \ + { da_free_elements(dap); return r; } + + +void da_alloc(Da *dap, size_t element_size); +void da_free(Da *dap); +void da_rewind(Da *dap); +bool da_emptyq(Da *dap); +size_t da_length(Da *dap); +void da_rebase(Da *dap, char *old_base, void *pta); +char *da_expand(Da *dap); +bool da_boundq(Da *dap); + +char *da_index(Da *dap, size_t i); +char *da_push_alloc(Da *dap); +char *da_push(Da *dap, void *element); +bool da_pop(Da *dap, void *element); + +bool da_endq(Da *dap, void *pt); +void da_map(Da *dap, void f(void *, void *), void *closure); + +void da_free_elements(Da *dap); + +void da_ints_print(Da *dap, char *sep); + +void da_strings_print(Da *dap, char *sep); +bool da_strings_exists(Da *string_arrp, char *test_string); +void da_strings_set_insert(Da *string_arrp, char *proffered_string, void destruct(void *)); +void da_strings_set_union(Da *string_arrp, Da *proffered_string_arrp, void destruct(void *)); + + +char *da_string_input(Da *dap, FILE *file); +void da_string_push(Da *dap0, char *string); + +void da_cat(Da *dap_base, Da *dap_cat); + +#endif + diff --git a/module/da/lib/libda.a b/module/da/lib/libda.a new file mode 100644 index 0000000000000000000000000000000000000000..28db3cbf49951c6e413331c29f7feafba926ee3c GIT binary patch literal 17734 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 >= dap->base + dap->size ) da_expand(dap); - memcpy(dap->end, element, dap->element_size); +// allocate space for a new element at the end of the array +char *da_push_alloc(Da *dap){ + size_t element_off = dap->end - dap->base; dap->end += dap->element_size; + if( dap->end > dap->base + dap->size ) da_expand(dap); + return dap->base + element_off; +} + +char *da_push(Da *dap, void *element){ + char *element_pt = da_push_alloc(dap); + memcpy(element_pt, element, dap->element_size); + return element_pt; } bool da_pop(Da *dap, void *element){ diff --git a/module/da/src/da.lib.h b/module/da/src/da.lib.h index 518e72c..8195c4a 100644 --- a/module/da/src/da.lib.h +++ b/module/da/src/da.lib.h @@ -12,7 +12,7 @@ typedef struct Da{ } Da; #define RETURN(dap, r) \ - { da_map(dap, da_free, NULL); return r; } + { da_free_elements(dap); return r; } void da_alloc(Da *dap, size_t element_size); @@ -25,7 +25,8 @@ char *da_expand(Da *dap); bool da_boundq(Da *dap); char *da_index(Da *dap, size_t i); -void da_push(Da *dap, void *element); +char *da_push_alloc(Da *dap); +char *da_push(Da *dap, void *element); bool da_pop(Da *dap, void *element); bool da_endq(Da *dap, void *pt); diff --git a/module/da/test/exec/test_da b/module/da/test/exec/test_da new file mode 100755 index 0000000000000000000000000000000000000000..1b5765dcbd74431a3a12e07d38f6890e7dbbbebf GIT binary patch literal 35376 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 literal 0 HcmV?d00001 diff --git a/module/da/test/makefile-flags b/module/da/test/makefile-flags index 37ea9c1..686a0f8 100644 --- a/module/da/test/makefile-flags +++ b/module/da/test/makefile-flags @@ -23,7 +23,7 @@ ECHO= echo # compiler and flags C=gcc -CFLAGS=-std=gnu11 -fPIC -I../include -ggdb -Werror -DDEBUG -DDEBUGDB -#CFLAGS=-std=gnu11 -fPIC -I../include -Werror +CFLAGS=-std=gnu11 -fPIC -Iinclude -I../include -ggdb -Werror -DDEBUG -DDEBUGDB +#CFLAGS=-std=gnu11 -fPIC -Iinclude -I../include -Werror LINKFLAGS= -Llib -L../lib -ltest -lda diff --git a/module/share/include/db.h b/module/debug/include/debug.h similarity index 100% rename from module/share/include/db.h rename to module/debug/include/debug.h diff --git a/module/debug/lib/libda.a b/module/debug/lib/libda.a deleted file mode 100644 index c6e819fbcdc5f11f1108a9ea971b7136e2aebbb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6698 zcmbVQeQaA-6~E7p9VbrWH10>z4CGGG)nm4kG)kA7%J!7d#>%= zxI)@h-n-}byXTyH?z#89cbs)w4J)1B-kyjoZG)RO4G#=&9vd5sLnBvsR((WEsn(;>AKLUXflKy$z3zZ61n<`{2O9$N)GV*|cd$_?u~eXmWbD zM?;6AX>2=pFR|>;t&|dD<6InPD_NKwN>=}neB{q>0F|shzv0G>8_DW3_ww${4DS~6 z&`nntW_ha&cilcGZP(>`wY%m?ckw${Dmvo?H~MyppV5`6G^17p9jg z5`U8OSATro%UBC4vH;IU2bUXeR~uvx%H9qAW7wfQ0awdmxE+Mchd0LjfmZDJt=GfO zf{e>yLTr>#z91YEgWnR;7$$(1lY>Kr~unI7#CoigQNgEIoL121PAvDaM$XmAkG;9 zcCY*nfV==n9`&pMQye$~yf^qJEMZ=Ny*)nw@UQ@Phh75kF#+}ko&|3o7vMnX3V=ri zINbRcP&*~S2iE)?M$QRvr0;bA7X-MUhjUSY2ikChFA1QxKLy}90cLn?mjy@#eh&^_ z6r0rA+82cL7y@19e@|C8_QAl{Kp_~wffn2_jEfFkFz`44Qu}FLyapoI{fE>IvlZwp zQ0=+_RFH4BU>@U)kWbd-wzVC22wHZ)i64fmhjm1u3kLiUN5>e5+@!64EsloKxz_6A z=LThH@)6R$%-<$j>sqw(o<4VC)oL8q0>LMs^PawNVvS`wOl#+P@t*$v2^d_Vy}K(M z^mg@kt={VB_g!Y!zH=b)zR_*8mZa zc|d~Q0T=8lH2!+v65iwv)Cdx8fi3hfJkpx>A6SqE4FUYwR+=ST+e*MUCXq|06Z4}Z z`p9t1GBbI@i4_ZFcRn$iD3sGhH)9G_0*O??v6nLm=lHC-l&^in(m3bVlv^k|u|jz} zhG#n&!^*|;xFC=-W>(1D3y5%pY{zobj=p!z+EAo>&;9XxP^txYeiSJRZn~KDAFzxmn#TXP90oX7oxnYr_de zmu2wDP{B6lOs-+)E0z<%cduP|(9|6;5$dRQ%qlphKI?!@wrJ#RZi>EBhHbJrL&x}- zu9KuYMvmzv!#ZkOLf0~lj0hxanWkmh7#U^;twfPJI9(@xDAnN8fKjE?7h zi9;Rs2#$22EVq^Gi_rL)!u=T;hNDuMGp%f~a!iK>zy;IS3OyZ_@H9a{g))N&6ZV9c zere&Z9w8oABYo7J6{iXxf-;>qSUqg0SI({_^d-sDVp}+L8i@jYyBOqfm85GxCLmu zu<@7J&aUoHdUkdCJuiZW;G5m?E!M*Rj$g@T&D*rn#flDIDNUM}3Pg3ti!YZZ%`0lZ zWg}kYr7RV^42%2a&C8Y*qg=_$c)_sDz$?myCOog~mhd=ZPeUH$2Le8HqKa6e%~QMB@Zohn4pFy=?fs48~?`8K$^@qj_&r4RIy z|2%zGR`Jm~|69WFapw)qYhNIcF~8W*PvfzUbGGj1O)}b|@Z-cEQusLW_bL2`2*b}v z-emm0AZ#i83xuH{<4x*+ko-TU@PDKHd{N=?nZ|a3-|Oot5dN0Jj}rc#!k5U;4;B75 z#J{ZYA13})g_rq#UE#k=_;(7wK_*(aHFpCSK86~3SFyu#y8NNn=F%k}<*;`yASzmD?! zgu=&&|GL7TCqJ(!{H=t4rSMM@{-?sfK-f?7$T-&%?os%!h-I;NDm?yp!ZxY!orDi4 z{6}csBgEr!h~j=KivBk^3;%6U_@^lk@>_%PH&zw$+p7A1i~Om4gm{dlF&-ATkC&jf zgWj=3pO=zl7LB-L&O0p5>)d$CwppCB88hYP^g=mXfiW%{sgz~TEg3c}qnv{uc8wQ&J2J{L7f0 Z|8b7$H+B8Eug&bQQ~Vd}rd(3({|8B+KqCME diff --git a/module/debug/lib/libdebug.a b/module/debug/lib/libdebug.a new file mode 100644 index 0000000000000000000000000000000000000000..df2a6dd2e5c351d4bcaef93e42de621814d4b553 GIT binary patch literal 6726 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 XsyB80xUco>1N1}peASdos{Q`}J6TMx literal 0 HcmV?d00001 diff --git a/module/debug/makefile b/module/debug/makefile index 181818b..a19b90e 100644 --- a/module/debug/makefile +++ b/module/debug/makefile @@ -16,8 +16,8 @@ dep: .PHONY: lib lib: + cp $(SRCDIR)/debug.lib.h $(INCDIR)/debug.h $(MAKE) $@ - cp $(SRCDIR)/db.lib.h $(INCDIR)/db.h %:: $(MAKE) $@ diff --git a/module/debug/makefile-flags b/module/debug/makefile-flags index 65ef1be..4dfd9bf 100644 --- a/module/debug/makefile-flags +++ b/module/debug/makefile-flags @@ -1,12 +1,12 @@ -MODULE=db +MODULE=debug DEPRDIR=deprecated DOCDIR=doc EXECDIR=exec INCDIR=include LIBDIR=lib -SHAREDIR=../share +SHAREDIR=$(realpath $(PROJECT_SUBU)/module/share) SRCDIR=src TESTDIR=test TMPDIR=tmp @@ -23,9 +23,8 @@ ECHO= echo # compiler and flags C=gcc -CFLAGS=-std=gnu11 -fPIC -I. -ggdb -Werror -DDEBUG -DDEBUGDB -#CFLAGS=-std=gnu11 -fPIC -I. -Werror -LINKFLAGS=-Llib -ldb +CFLAGS=-std=gnu11 -fPIC -I$(SRCDIR) -I$(INCDIR) -I$(SHAREDIR)/include -ggdb -Werror -DDEBUG -DDEBUGDB +LINKFLAGS=-L$(LIBDIR) -l$(MODULE) diff --git a/module/dispatch/include/dispatch.h b/module/dispatch/include/dispatch.h new file mode 100644 index 0000000..8b99d43 --- /dev/null +++ b/module/dispatch/include/dispatch.h @@ -0,0 +1,32 @@ + /* + Runs a command or function as its own process. + + The return status integer from command or function must be greater than ERR_DISPATCH. + In the case of dispatch_exec, we only have a promise from the user to not dispatch + non compliant commands. + + */ + #ifndef DISPATCH_LIB_H + #define DISPATCH_LIB_H + #include + #include + + #define ERR_DISPATCH -1024 + #define ERR_DISPATCH_NEGATIVE_RETURN_STATUS -1024 + #define ERR_DISPATCH_F_FORK -1025 + #define ERR_DISPATCH_F_SETEUID -1026 + #define ERR_DISPATCH_F_SETEGID -1027 + #define ERR_DISPATCH_NULL_EXECUTABLE -1028 + #define ERR_DISPATCH_EXEC -1029 + + // currently both dispatcher and dispatchee strings are statically allocated + struct dispatch_ctx{ + char *dispatcher; // name of the dispatch function ("dispatch_f", "dispatch_f_euid_egid", etc.) + char *dispatchee; // name of the function being dispatched + int err; // error code as listed below, or status returned from dispatchee + }; +void dispatch_f_mess(char *fname, int err, char *dispatchee); +int dispatch_f(char *fname, int (*f)(void *arg), void *f_arg); +int dispatch_f_euid_egid(char *fname, int (*f)(void *arg), void *f_arg, uid_t euid, gid_t egid); +int dispatch_exec(char **argv, char **envp); +#endif diff --git a/module/dispatch/lib/libdispatch.a b/module/dispatch/lib/libdispatch.a new file mode 100644 index 0000000000000000000000000000000000000000..70d2fff9517b5fac09fd1c947dd258fb2563112e GIT binary patch literal 12306 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 eeSiuJ% #include #include -#include +#include #include "dispatch.lib.h" #tranche dispatch.lib.h diff --git a/module/share/include/da.h b/module/share/include/da.h index 518e72c..8195c4a 100644 --- a/module/share/include/da.h +++ b/module/share/include/da.h @@ -12,7 +12,7 @@ typedef struct Da{ } Da; #define RETURN(dap, r) \ - { da_map(dap, da_free, NULL); return r; } + { da_free_elements(dap); return r; } void da_alloc(Da *dap, size_t element_size); @@ -25,7 +25,8 @@ char *da_expand(Da *dap); bool da_boundq(Da *dap); char *da_index(Da *dap, size_t i); -void da_push(Da *dap, void *element); +char *da_push_alloc(Da *dap); +char *da_push(Da *dap, void *element); bool da_pop(Da *dap, void *element); bool da_endq(Da *dap, void *pt); diff --git a/module/share/include/debug.h b/module/share/include/debug.h new file mode 100644 index 0000000..f1be3d8 --- /dev/null +++ b/module/share/include/debug.h @@ -0,0 +1,6 @@ +#ifndef DB_LIB_H +#define DB_LIB_H + +int debug_printf(const char *format, ...); + +#endif diff --git a/module/subu-0/include/subu.h b/module/subu-0/include/subu.h new file mode 100644 index 0000000..683ddb3 --- /dev/null +++ b/module/subu-0/include/subu.h @@ -0,0 +1,62 @@ + typedef unsigned int uint; + /* + Fedora 29's sss_cache is checking the inherited uid instead of the effective + uid, so setuid root scripts will fail when calling sss_cache. + + Fedora 29's 'useradd' calls sss_cache, and useradd is called by our setuid root + program subu-mk-0. + */ + #define BUG_SSS_CACHE_RUID 1 + // extern char *DB_File; + extern char DB_File[]; + extern uint Subuhome_Perms; + extern uint First_Max_Subunumber; + extern char Subuland_Extension[]; + /* + The db file is maintained in SQLite + + Because linux user names are limited length, subu user names are of a compact + form: _s. A separate table translates the numbers into the subu names. + + Each of these returns SQLITE_OK upon success + */ + #include + int db_begin(sqlite3 *db); + int db_commit(sqlite3 *db); + int db_rollback(sqlite3 *db); + int subudb_schema(sqlite3 *db); + int subudb_number_get(sqlite3 *db, int *n); + int subudb_number_set(sqlite3 *db, int n); + int subudb_Masteru_Subu_put(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username); + int subudb_Masteru_Subu_get_subu_username(sqlite3 *db, char *masteru_name, char *subuname, char **subu_username); + typedef struct{ + char *subuname; // the name that masteru chose for his or her subu + char *subu_username; // the adduser name we gave it, typically of the s + } subudb_subu_element; + int subudb_Masteru_Subu_get_subus(sqlite3 *db, char *masteru_name, Da *subus); + int subudb_Masteru_Subu_rm(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username); + #include + #include + #include + char *useradd_mess(int err); + char *userdel_mess(int err); + #define SUBU_ERR_ARG_CNT 1 + #define SUBU_ERR_SETUID_ROOT 2 + #define SUBU_ERR_MALLOC 3 + #define SUBU_ERR_MKDIR_SUBUHOME 4 + #define SUBU_ERR_RMDIR_SUBUHOME 5 + #define SUBU_ERR_SUBUNAME_MALFORMED 6 + #define SUBU_ERR_HOMELESS 7 + #define SUBU_ERR_DB_FILE 8 + #define SUBU_ERR_SUBUHOME_EXISTS 9 + #define SUBU_ERR_BUG_SSS 10 + #define SUBU_ERR_FAILED_USERADD 11 + #define SUBU_ERR_FAILED_USERDEL 12 + #define SUBU_ERR_SUBU_NOT_FOUND 13 + #define SUBU_ERR_N 14 + #define SUBU_ERR_BIND 15 + void subu_err(char *fname, int err, char *mess); + int subu_mk_0(char **mess, sqlite3 *db, char *subuname); + int subu_rm_0(char **mess, sqlite3 *db, char *subuname); + int subu_bind(char **mess, char *masteru_name, char *subu_username, char *subuhome); + int subu_bind_all(char **mess, sqlite3 *db); diff --git a/module/subu-0/lib/libsubu-0.a b/module/subu-0/lib/libsubu-0.a new file mode 100644 index 0000000000000000000000000000000000000000..e6787623f9ed608109e0b3cc9d05814d8a50380b GIT binary patch literal 54914 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

(LMT^66i%;&)je7i}2@o*>^ z4FbtC0{=pP0ppbI90Q-qIH{3NYgmq%2ED1bYYcp(!DpSt=VQ$0V+Os+=L-ft%HZ>q zfsZ!uUmN(j27c1O&ol6Ber`bZ9b@3<82DHNpTxN6;SQF6wn1;Udxe3Mu0_w+8u$eU zzQw@J_PRd<{+5B$sw3f_&CfTeUM8Q_22QK=guae(sn^|Huk{(|?=Wzhg9x9m8hD9; z|1bmowt<`SWbu6^$#3GL4BRaD3IjLGjc350H}LU>oPTFr^dRF!AO}PUB+mr=OMUex zD;lS{pWyoI6^+xgF2VJOEE=aRR|MCev1ojXfzRM_MV_a)UCJ}abGLz$>ki@ng$(#p z8So!wz<-kgkL98;1k%qm{7bpp85jBAVfp{Vpf~lo&%mb}e7 zBI8wI9+)DKoEPF>q z=uQ26)}mj{^m{YVf8C-K>vb)&ot`wnt_}0|K8&NH1nTG4}=jYIt%}zpCyco zo`1;nD-3#5p9zazt{2xC^kzGLJOll93zv4>Y49=2{epoHFyw#Mz)d~;+~WUBuGe9M z-fYKX7X3-4|7!;NLVo^3WEUCo&@z7tqR&Zuott3Ln|64qft&JITYRo!K1~L_DgQ>UlxBESA+aWoa$xr?`h!XxZ2;q&2e?Oft%y%XahIL)iTCKZ!)efH0Vuv z?lf?7TzxnL{&)ub2O01gSi??%^kC|91>+)ToZBU0(3^5zXW*us9R@xMWk`Sgyn&Y) z__rCCa(8jL-!yE+3t5)^jn$#rwn>iKVLO)Q$H_Re0DIOg9g264~Grh z341BVIFEnuTx*TO(^eorq7K7fDf1iPy_V8Q= z{AU^P^JtQXK<#eoVLsy`&%>k+-;;s< zevAH(Our`s{qqKHw)?LPyc{}`c0XnDKgs;xHRw&d-7t`}oV*T>H%TsL7oAtfKz^8$q$a7@| zJfELu6My=D7ylG!KNbptFVazm)-_NNe2t3XnU96X86Rfhw=y2G@Li0Lvhcl()91Jp zq}*q8)EQ^t&oW+W;Xh`ac8Q=Md=BfVGtI*P%J@tR&*FHQh0FRCdEX-ZMeZ#YJ*_vO zaI1yWdJGD;S$Le|wAPM-@ZZYuyDVJZ1Kn%k+c>_93VSU4 zn;d_{!e8LH`Cf_Y@EYS^x9ES*@oD`0M(SHg9Ry*fg-;~{gfa`ii}86DzMt{1h2P2X zMHc=CjxVuri7&VCB95=L@He^K)fV2)@ii9yLypVyA<9nwZ!pf&FSWB0-};amJU^E7 zxT-Jy=P*4_Clx*6H7pNbrab&o)<4Y&DNvM2Rh;HL6o|j@qinmL4`z8@v+y;H|IWg%VSS1| zL=Wp(p7$*J2If=9=|cZwu9x_(6nr}Kr*&-<1pg|x3%OA<@dufHwuP57|H~|VGUHcS zxU}n93*W7ab6PF@3NCk(h0}UA3ZJlWz8&^_T}r(!VmcW=1s}Q)l6_-ZyUHVV3763zzH4CoTL{mh(Ofe~J0*v2a@7NZ~OH zKf(2S*1~1I!VfKc71O_N;SccmbJW5=#`J%)@Itn$0Oyl-T*U2_XW{2@{s|V|#r2wH z;V$!+>z(kQzX+C|m@6j=CYS)bU%Lj|GV&-~A~@OK!ObqGRV$9kJ*(aXAo%PstImh+<){wnin zwD3cWZ?y0)vHZ7KcpmHjP7D7Tm%H1-U*vl2weS%4uO}>gA(wl=!sYt$6AOQu<8N5_ zm$+Q9U(u)N{ht>70G21n|J?NcHllF5pmpj>_7kifVA;L%Od4)wU z_8hfvvFC(^OZ(np;bPDCSh(2p9t)Rtf84^wPF`eO^!a<9(Er+^mv%W}(SL$(f_AtxY)zv7B2SiqJ@h+ z{KCS;9*$YK*uy_9TyP9hdAcGAkY z=<|M-d#6P&?eefie+S2(wCKeizHi}T53gIe*ux(zT*`fyaglQ#ujlB+N72Kti2xzQ zxX}Nd<4Y}i`M&XLi(bBCj9c`g&vpwJySl@|Mb8gf_`5vL?6dGsFuvcy<$1*S8JBv= zcbLDi=*3R{Y~dom!|O&wZvpOKy)9hk)o0l_%UNvUQ+WKJ&bY`adR}7De~z!45exqj zUuT;w{2-Sr*8!1#scv@XcB@?ZuJtjCkCgkog-f|Vws0x;zbu@-!=ms<#-+aUovq93 zQbbM}m(H

A$Nj{34!*G+KCvF4kGkxRfi;0X}WfiyiK@@N>A`yDUEPUGc9hdg1d& z3vXjR{N3U+fcY2jLt9%9XIr@Rqhbq}aah*p2%i^OKebFRdXVpFH(7ihV!OJ}!lhll zWZ{FE{u>s5c@OfsMK64gTlm+Q&)+OQ+>Fj(z79*hgb!CwT`yR*DvLaalllsuy#yfG zcu1ki_bD88$}C*!wZ_6lpEp{#wC`>U7yH?7;bNbMEL{4F5*%q{PV_JRH^lW4T*i|! z3zzY5jfKm2exrrU{9(6+%lNY2!e!om$in5m$tiBz*n~|+aE!O}Vui-Y4^kyZ^ap_r&9yBcj8-M;B9&EDF>I}&X&H)DHrHW$9}~ltDpART zLY-pzViDWFIK}WO6fMS1I7RqS5PRb2Oi?&{f?KdCH^qPJ5JGNJiP)K$3h$^FHiH;8hlDQmvQc91gY>4zYmtU9PRSQA%S>)*!)wF zmw1wWnqd!@f4vCIiB{AZ4?JD{yBc%`d45Cnr%RyZm+H+0X4i>wjv7I~jx$yU3?1!8 zOKV@#mA|1$XOQ&>R6bqe?eeLa(v@F96+;+rDaNL)0*#GPzReTq7k(!6!TYsouSQBb z`CGT>ERvt(r!m%+e;qKJC*^#U%YRlf5Qt#YUJEQ;`MbG%X(uY5rewlS@SB;Z$cd;5 zt^7jq5}sEHF6GN{8xrW;&i_p^41^+m@O~wq9PdVooO?t#In4P@jLvP^FEM5{vvY*= zpRzJY{e|ztI7z3!F4kW?=O_KqEvV!d{ZX=AHX!FvIsH1$ejb?m;hdJx*!k%;H-LXT z>|UgigBEkEI!dN=`9rtp{PKQN_}lsQr_k!d{g#qYC^UZZ6Fq^N}mLb!kXM0$`{S|`;r`eSjnD@Nr|wHsmb#)by^0$3jLfF;f^=M?Z*qk z9h*+UVd<&aU6lAZ{X9WGNhiifD9Uc1|NR*}$I{CAY1iDP<+GQUhn9z*pxpvO_!J$k zwb|LUa@yL34YCrEWr?cr6Nxc;Qv*=6;=Au~hjy&pl~7w%5s&hf%az|Z<#M?L-sHQ~ zK6|0%<>4ndDWTjicffORm+V&;ej*BrmCMJ@K-%tb2fRhwa?Os%kp}<4@K@axYp6=`@iniKJ0*2oYT7GNp^kGwKTj?uQ&qV^6*Bh{AcU@;f`0HpiknH9(~oV zRj1SOER5iYdNG?!Bj3~qRP!q@yU8g0=0@YHL|2)OXC0+5C-}Ziyqpx|6bnLDb}*9^ zN!A_ZC)+ojtVzsQ@+eCb8A!yJJK$nBh1!fFr;_XBu|Y~MI6O9pyJ!qf6}2PrlMgIu z=Zc@4Mo%Zr5=ov!wiYGOS$@(hyv)-RSw%<1{tqk#91XwBHbD*AU82qvFPP~xlu2tU z5j$7xH`8exOGy{4m!DaUmY_zcNrLRW3pIlKbY)sFZ#BMnypEQtouE{f z6xP}C4B>H1=>f(n7EZ<0 zB<2ufwE$02P=iAN4<+Mdi0JENiB|q-Vu-Ri4~Fo^ayMuf7;$e>8I;WlzzJ2 zDKvlS;tGrF72)!wtf}JW7 zw)T>aTNIwDp6IBgZewtFrbvvr-k&;^%t>+0mFHj=QzHDBI z^3n#9sN2O8bZs2bi==6{u^*xY;WrO@hJKWWKb&MCku@m=1fDp<`32^;G@ZsoSIq?J za+ebBG43bS)b@YU1#5TLsctYUcrOGHSEzKZitV9Yp0ejxH7h^pjt|oI9qP@KYq~OZ zr{vs$jQZPfcdCl$55nDPDx$vvcc-g}{`A|uP({XQZZlLwJ1ul)s)%-4=+06R?X=J> zQ<1RFGh0QL=*S!u(H;!lc>}J1oNIK-{C-y>Qm-SXD^u5WW$G@>+kh%;&}617Q`dB5 z>MjmegPV3`>R#TP92Es%5hbz;cs+|uF9Rd? zLzKeY@5kZTzAxxx!9eY@$jV#g{ zEyMLJ(n=lO#3F^2NSj%t#-ZemvwhH3aDuoHkc=-YNb1&Nu1OKIgm2G%yB6TNgc5Vj zq*O82T$C#2nx#6vhc&sTdLN1)Cz@K5m8qJnO4Vd_ir6(Q_G($J>RdqTN6?jA+lTrT zRfMHqnj-y=G%Y-d{#2x2dTxppEG;ErJu6r`Ps=V=uynbOixn(Om3=u2yHe?R6$@L# zvdl}7Ws@h%#o4UMc_Ef%FgY6?Q>G-Dr+AeMFRiorspVcG<#I_AQ%d@hSJD@xq={xp z6UTl74T3sr-jh;!PZr)vj;SICmozw~B-z8ux9ehD5S4Wd9;U71h0QAe5YFFt77OK! zXN&5E99n?kxs;onHfj%aL>XgpO>wU3_3%lkTm8I3-P>03u(uf5)p&giOW7|)N`9~l zE4Wdl?5AAtk{3d4^nEg9_=;rcGe|d8y>m86=IfOqgVI5-fkOQMgX6gVzVnm^I4oo* z-*)}kbDi@0hVk8W@}~XD4NUbbHz=bYHF5+u*!JKy#CG~N)OP7M%=Q8|T%5_Bm2@z7 zcE(cCyyNh%u6z#K-w5Vh)PNltL;VhY;qd>u_cr!__QCwOB^|US&&avQ`?+fSK;GCK zxS5i*Mi?!6`jm4na$7UB#5*0HJUx3nT-S{9zv~+S=Qd*t-4Ho4s&(^LyY8cKXof`i z_<7UKe$pMKQ*y5&pIH}-C%0OGN8u2S+?u`V=GMVqPB9%)sPo}yYrWwg?EF$U=eNj5 zxq@)I6@UkwC*5ayq62h7|0%5A-D zG_1VdB%KmzaoeivqfM2L_AKKinvQ>njUm6~p~8!j`zG=8@^AG}<9XjvZb!uX2Nw3b#V=O{1!XR;-HF!R?XZCd9K4#6mW9hW%@&R%tvb ziSsXVw4@k&ZmG1Np>D2!Qk=0UCsDF@w{|82zbPV8O%%&V;6t<}79qc)ioY0%*Erhe zN~%X4N;F(ICB2C{YLJOHwU%fV@fPLU8<4KJxfM6N3j;THSoDD%xL_hd?|Lbm&WDSd z#flG*M(qKFro%H;POMv?W195U?~{H#r>nWVFWN* zOW)w7zs~7DqNA7opI-VqoUZOPB|UJySN<@*Ur;y9Uiv66eI}=?JAO&`|5+=DdD{od z^1tCDh2#iyTY03V3s`eajS{_j3?fnQ7|>5vytteMWWlTed`#yvgpxA*9#PMMQn(Oe z`WTTrtAW4^QYdwV)^eo7F9c3}B)=TzFF87@uMLZqDqXFmOh+k~+~h`fyN*~rYut^{9>a|%MwON5ngCc#MEH!-*&WrGcCB++meV;~53nOWiK_puvZp^okx%Wxxj!0|Yvl^rH;i zlyjnin{w7LF8YzZh~fr4J?|5FK5gJ;`#xddCjF}hZp!&z25!=;MoLq!d}=(#&3c_{ z;31@ooKp;Zgn=(IaFb89ft&idopI5R?13cT$Wt{;`Cl;jnEH`#%4~W+UpELh_0!A1 zO*zjt@R3HnWKVYD6Eg6b2ED0=D-7JEj~KW~zs|r-c{&Z;)Z0^xi{4)MK`4YD81$yz z{%YW+-pXj;!C_&`qJiThAfB6=!j}}v5gzq4M z5!7ox9EHAGp?IjvM^X#vNWxe?A$oJxTWsKz)}P0PnHIi=@r4#1Vf|lj;jmVR3zz$> ztrjjmTXtLc5aus?XNjD$=g2b_{S?;MixxhY_48*7zmfUpus($UXBZ!8;fFb1YT@s4 zT=vKlK7F}78Ak=bkm(yOJ`twhVBs=Pz01Py=lE_5e}MJyNCx~{7Cwyi^HU2S!t(qk z1O7V;AJ2M|J$9tN3z*K_dx+A8F+QC03B8Ov=UaH3>t*gSM0p-%KJzU4aa=Fidx)}A zmE`_f=A}~ZznH$=;v@3hY2hNzS1p|892CB7;kRqpdDFsUEdL3{MNWBcFo5TQwwy9w z6dQx-1u>auW=|7RBdX_iO! zzL9##bFEUIEQE_wT%DMw3 z6kNuiGK*fu&kym<^Z(PIJBOe(QiW+Fq{uS*L9o}eu-bGYeuv_phNd$7n_>G%9UH`q z`yxtt*F_G|ONq71kx?i{DzZRIylX8kLg4tHX+O&l2491kSOOST_1Ybl_uD< z4}*p<%S@d?oPVX2LFzB8AH+#I{cUIconS)JUjhClzvwkx*_5UAEc(UA0o;CtIHz}m lc7C!6tBHYNug?+c;5=x_Z$&eHt9;`WoqwM`c)xc3{{w5ydpiIC literal 0 HcmV?d00001 diff --git a/module/subu-0/makefile b/module/subu-0/makefile index ab3ffe5..dacec61 100644 --- a/module/subu-0/makefile +++ b/module/subu-0/makefile @@ -2,17 +2,16 @@ SHELL=/bin/bash MAKE=/usr/bin/make --no-print-directory -f $(PROJECT_SUBU)/tool/lib/makefile-cc -#MAKE=/usr/bin/make -f $(PROJECT_SUBU)/tool/lib/makefile-cc -include makefile-flags - .PHONY: all all: version .PHONY: info info: @echo "TRCDIR: " $(TRCDIR) + @echo "SHAREDIR: " $(SHAREDIR) $(MAKE) $@ .PHONY: setup @@ -23,21 +22,25 @@ setup: .PHONY: dep dep: if [ -e $(DEPFILE) ]; then rm $(DEPFILE); fi - @trcsources=$(wildcard $(TRCDIR)/*.trc.c)$(wildcard $(TRCDIR)/*.trc.cc);\ + trcsources=($(wildcard $(TRCDIR)/*.trc.c)$(wildcard $(TRCDIR)/*.trc.cc));\ if [ ! -z "$$trcsources" ]; then\ - trctargets=$$(tranche-target $$trcsources -sep " " -tdir $(SRCDIR) );\ - $(ECHO) $$trcsources;\ - tranche-make $$trcsources -tdir $(SRCDIR) -mfile $(DEPFILE);\ + trctargets=$$(tranche-target $${trcsources[@]} -sep " " -tdir $(SRCDIR) );\ + $(ECHO) "trcsources: " $${trcsources[@]};\ + $(ECHO) "trctargets: " $$trctargets;\ + tranche-make $${trcsources[@]} -tdir $(SRCDIR) -mfile $(DEPFILE);\ $(MAKE) $$trctargets;\ fi $(MAKE) $@ .PHONY: lib lib: + cp $(SRCDIR)/common.lib.h $(INCDIR)/subu.h + cat $(SRCDIR)/subudb.lib.h >> $(INCDIR)/subu.h + cat $(SRCDIR)/subu.lib.h >> $(INCDIR)/subu.h $(MAKE) $@ - cp $(SRCDIR)/dispatch.lib.h $(INCDIR)/dispatch.h %:: + @echo default target $(MAKE) $@ diff --git a/module/subu-0/makefile-flags b/module/subu-0/makefile-flags index 854b84f..f373601 100644 --- a/module/subu-0/makefile-flags +++ b/module/subu-0/makefile-flags @@ -1,12 +1,12 @@ -MODULE=dispatch +MODULE=subu-0 DEPRDIR=deprecated DOCDIR=doc EXECDIR=exec INCDIR=include LIBDIR=lib -SHAREDIR=../share +SHAREDIR=$(realpath $(PROJECT_SUBU)/module/share) SRCDIR=tmp TESTDIR=test TMPDIR=tmp @@ -24,10 +24,8 @@ ECHO= echo # compiler and flags C=gcc -CFLAGS=-std=gnu11 -fPIC -I. -I../share/include -ggdb -Werror -DDEBUG -DDEBUGDB -#CFLAGS=-std=gnu11 -fPIC -I. -I../share/include -Werror - -LINKFLAGS=-L1_lib -lda +CFLAGS=-std=gnu11 -fPIC -I$(SRCDIR) -I$(INCDIR) -I$(SHAREDIR)/include -ggdb -Werror -DDEBUG -DDEBUGDB +LINKFLAGS=-L$(LIBDIR) -L$(SHAREDIR)/lib/ -l$(MODULE) -lda -ltranche -ldispatch diff --git a/module/subu-0/trc/common.lib.c b/module/subu-0/trc/common.trc.c similarity index 100% rename from module/subu-0/trc/common.lib.c rename to module/subu-0/trc/common.trc.c diff --git a/module/subu-0/trc/subu-bind-all.cli.c b/module/subu-0/trc/subu-bind-all.trc.c similarity index 93% rename from module/subu-0/trc/subu-bind-all.cli.c rename to module/subu-0/trc/subu-bind-all.trc.c index e942909..7674927 100644 --- a/module/subu-0/trc/subu-bind-all.cli.c +++ b/module/subu-0/trc/subu-bind-all.trc.c @@ -1,9 +1,9 @@ +#tranche subu-bind-all.cli.c /* mount all the subu user directories into master's subuland uses unmount to undo this */ -#include "subu-bind-all.cli.h" #include #include @@ -29,3 +29,4 @@ int main(int argc, char **argv){ } return 0; } +#tranche-end diff --git a/module/subu-0/trc/subu-bind.cli.c b/module/subu-0/trc/subu-bind.trc.c similarity index 92% rename from module/subu-0/trc/subu-bind.cli.c rename to module/subu-0/trc/subu-bind.trc.c index f315823..0510d55 100644 --- a/module/subu-0/trc/subu-bind.cli.c +++ b/module/subu-0/trc/subu-bind.trc.c @@ -1,9 +1,9 @@ +#tranche subu-bind.cli.c /* mount a subu user directory into master's subuland uses unmount to undo this */ -#include "subu-bind.cli.h" #include #include @@ -23,3 +23,4 @@ int main(int argc, char **argv){ } return 0; } +#tranche-end diff --git a/module/subu-0/trc/subu-mk-0.cli.c b/module/subu-0/trc/subu-mk-0.trc.c similarity index 95% rename from module/subu-0/trc/subu-mk-0.cli.c rename to module/subu-0/trc/subu-mk-0.trc.c index af0888b..f0a7b5a 100644 --- a/module/subu-0/trc/subu-mk-0.cli.c +++ b/module/subu-0/trc/subu-mk-0.trc.c @@ -1,8 +1,8 @@ +#tranche subu-mk-0.cli.c /* subu-mk-0 command */ -#include "subu-mk-0.cli.h" #include #include @@ -41,3 +41,4 @@ int main(int argc, char **argv){ return 0; } +#tranche-end diff --git a/module/subu-0/trc/subu-rm-0.cli.c b/module/subu-0/trc/subu-rm-0.trc.c similarity index 94% rename from module/subu-0/trc/subu-rm-0.cli.c rename to module/subu-0/trc/subu-rm-0.trc.c index a7e5926..e49e611 100644 --- a/module/subu-0/trc/subu-rm-0.cli.c +++ b/module/subu-0/trc/subu-rm-0.trc.c @@ -1,8 +1,8 @@ +#tranche subu-rm-0.cli.c /* subu-mk-0 command */ -#include "subu-rm-0.cli.h" #include #include @@ -30,3 +30,4 @@ int main(int argc, char **argv){ return ret; } } +#tranche-end diff --git a/module/subu-0/trc/subu.lib.c b/module/subu-0/trc/subu.trc.c similarity index 92% rename from module/subu-0/trc/subu.lib.c rename to module/subu-0/trc/subu.trc.c index cd6bc2f..6ce4625 100644 --- a/module/subu-0/trc/subu.lib.c +++ b/module/subu-0/trc/subu.trc.c @@ -1,3 +1,4 @@ +#tranche subu.lib.c /* sqllite3 is used to maintain the db file, which is currently compiled in as /etc/subu.db, (or just subu.db for testing). @@ -18,6 +19,11 @@ subu-mk-0 and subu-rm-0 are setuid root scripts. */ +#include +#include +#include +#include "common.lib.h" +#include "subudb.lib.h" #include "subu.lib.h" // without this #define we get the warning: implicit declaration of function ‘seteuid’/‘setegid’ @@ -32,15 +38,18 @@ #include #include -#if INTERFACE -#include -#include -#include -#endif +#tranche subu.lib.h + #include + #include + #include +#tranche-end //-------------------------------------------------------------------------------- // dispatched command errors .. should add mkdir and rmdir ... // +#tranche subu.lib.h + char *useradd_mess(int err); +#tranche-end char *useradd_mess(int err){ if(err <= 0) return NULL; char *mess; @@ -63,6 +72,9 @@ char *useradd_mess(int err){ } return strdup(mess); } +#tranche subu.lib.h + char *userdel_mess(int err); +#tranche-end char *userdel_mess(int err){ if(err <= 0) return NULL; char *mess; @@ -87,24 +99,26 @@ char *userdel_mess(int err){ //-------------------------------------------------------------------------------- // -#if INTERFACE -#define SUBU_ERR_ARG_CNT 1 -#define SUBU_ERR_SETUID_ROOT 2 -#define SUBU_ERR_MALLOC 3 -#define SUBU_ERR_MKDIR_SUBUHOME 4 -#define SUBU_ERR_RMDIR_SUBUHOME 5 -#define SUBU_ERR_SUBUNAME_MALFORMED 6 -#define SUBU_ERR_HOMELESS 7 -#define SUBU_ERR_DB_FILE 8 -#define SUBU_ERR_SUBUHOME_EXISTS 9 -#define SUBU_ERR_BUG_SSS 10 -#define SUBU_ERR_FAILED_USERADD 11 -#define SUBU_ERR_FAILED_USERDEL 12 -#define SUBU_ERR_SUBU_NOT_FOUND 13 -#define SUBU_ERR_N 14 -#define SUBU_ERR_BIND 15 -#endif - +#tranche subu.lib.h + #define SUBU_ERR_ARG_CNT 1 + #define SUBU_ERR_SETUID_ROOT 2 + #define SUBU_ERR_MALLOC 3 + #define SUBU_ERR_MKDIR_SUBUHOME 4 + #define SUBU_ERR_RMDIR_SUBUHOME 5 + #define SUBU_ERR_SUBUNAME_MALFORMED 6 + #define SUBU_ERR_HOMELESS 7 + #define SUBU_ERR_DB_FILE 8 + #define SUBU_ERR_SUBUHOME_EXISTS 9 + #define SUBU_ERR_BUG_SSS 10 + #define SUBU_ERR_FAILED_USERADD 11 + #define SUBU_ERR_FAILED_USERDEL 12 + #define SUBU_ERR_SUBU_NOT_FOUND 13 + #define SUBU_ERR_N 14 + #define SUBU_ERR_BIND 15 +#tranche-end +#tranche subu.lib.h + void subu_err(char *fname, int err, char *mess); +#tranche-end void subu_err(char *fname, int err, char *mess){ if(!mess) mess = ""; switch(err){ @@ -271,11 +285,14 @@ static int mk_subuhome(char *subuland, char *subuname, char **subuhome){ //=============================================================================== +#tranche subu.lib.h + int subu_mk_0(char **mess, sqlite3 *db, char *subuname); +#tranche-end int subu_mk_0(char **mess, sqlite3 *db, char *subuname){ int rc; if(mess)*mess = 0; - da resources; + Da resources; da_alloc(&resources, sizeof(char *)); //-------------------------------------------------------------------------------- @@ -418,11 +435,14 @@ int subu_mk_0(char **mess, sqlite3 *db, char *subuname){ } //================================================================================ +#tranche subu.lib.h + int subu_rm_0(char **mess, sqlite3 *db, char *subuname); +#tranche-end int subu_rm_0(char **mess, sqlite3 *db, char *subuname){ int rc; if(mess)*mess = 0; - da resources; + Da resources; da_alloc(&resources, sizeof(char *)); //-------------------------------------------------------------------------------- @@ -578,11 +598,14 @@ int subu_rm_0(char **mess, sqlite3 *db, char *subuname){ //================================================================================ // identifies masteru, the bindfs maps each subu_user's home to its mount point // in subuland. +#tranche subu.lib.h + int subu_bind(char **mess, char *masteru_name, char *subu_username, char *subuhome); +#tranche-end int subu_bind(char **mess, char *masteru_name, char *subu_username, char *subuhome){ int rc; if(mess)*mess = 0; - da resources; + Da resources; da_alloc(&resources, sizeof(char *)); // lookup the subu_user_home @@ -626,11 +649,14 @@ int subu_bind(char **mess, char *masteru_name, char *subu_username, char *subuho RETURN(&resources, 0); } +#tranche subu.lib.h + int subu_bind_all(char **mess, sqlite3 *db); +#tranche-end int subu_bind_all(char **mess, sqlite3 *db){ int rc; if(mess)*mess = 0; - da resources; + Da resources; da_alloc(&resources, sizeof(char *)); //-------------------------------------------------------------------------------- @@ -676,8 +702,10 @@ int subu_bind_all(char **mess, sqlite3 *db){ #endif //-------------------------------------------------------------------------------- - da subus; - rc = subudb_Masteru_Subu_get_subus(db, masteru_name, &subus); + Da subus; + Da *subusp = &subus; + da_alloc(subusp, sizeof(subudb_subu_element)); + rc = subudb_Masteru_Subu_get_subus(db, masteru_name, subusp); if( rc != SQLITE_OK ){ if(mess)*mess = strdup("db access failed when fetching a list of subus"); return rc; @@ -687,8 +715,8 @@ int subu_bind_all(char **mess, sqlite3 *db){ rc = 0; char *subuhome = 0; // the name of the directory to put in subuland, not subu_user home dir uint err_cnt = 0; - subudb_subu_element *pt = (subudb_subu_element *)(subus.base); - while( !da_endq(&subus,pt) ){ + subudb_subu_element *pt = (subudb_subu_element *)(subusp->base); + while( !da_endq(subusp,pt) ){ rc = mk_subuhome(subuland, pt->subuname, &subuhome); #ifdef DEBUG if(subuhome) @@ -711,3 +739,4 @@ int subu_bind_all(char **mess, sqlite3 *db){ } RETURN(&resources, 0); } +#tranche-end diff --git a/module/subu-0/trc/subudb-init.cli.c b/module/subu-0/trc/subudb-init.trc.c similarity index 93% rename from module/subu-0/trc/subudb-init.cli.c rename to module/subu-0/trc/subudb-init.trc.c index 714c7e4..794644d 100644 --- a/module/subu-0/trc/subudb-init.cli.c +++ b/module/subu-0/trc/subudb-init.trc.c @@ -1,8 +1,8 @@ +#tranche subudb-init.cli.c /* This command initializes the db file. */ -#include "subudb-init.cli.h" #include int main(){ @@ -24,3 +24,4 @@ int main(){ } return 0; } +#tranche-end diff --git a/module/subu-0/trc/subudb-number.cli.c b/module/subu-0/trc/subudb-number.trc.c similarity index 97% rename from module/subu-0/trc/subudb-number.cli.c rename to module/subu-0/trc/subudb-number.trc.c index 60304e3..183aec0 100644 --- a/module/subu-0/trc/subudb-number.cli.c +++ b/module/subu-0/trc/subudb-number.trc.c @@ -1,8 +1,8 @@ +#tranche subudb-number.cli.c /* Set or get a new maximum subu number. Currently doesn't do the setting part. */ -#include "subudb-number.cli.h" #include #include #include @@ -61,3 +61,4 @@ int main(int argc, char **argv){ return 0; } +#tranche-end diff --git a/module/subu-0/trc/subudb-rel-get.cli.c b/module/subu-0/trc/subudb-rel-get.trc.c similarity index 96% rename from module/subu-0/trc/subudb-rel-get.cli.c rename to module/subu-0/trc/subudb-rel-get.trc.c index 9828b15..e64331a 100644 --- a/module/subu-0/trc/subudb-rel-get.cli.c +++ b/module/subu-0/trc/subudb-rel-get.trc.c @@ -1,9 +1,9 @@ +#tranche subudb-rel-get.cli.c /* get the username from the db file for testing subudb_Masteru_Subu_get_subu_username */ -#include "subudb-rel-get.cli.h" #include #include @@ -40,3 +40,4 @@ int main(int argc, char **argv){ } return 0; } +#tranche-end diff --git a/module/subu-0/trc/subudb-rel-put.cli.c b/module/subu-0/trc/subudb-rel-put.trc.c similarity index 96% rename from module/subu-0/trc/subudb-rel-put.cli.c rename to module/subu-0/trc/subudb-rel-put.trc.c index b19896e..5352700 100644 --- a/module/subu-0/trc/subudb-rel-put.cli.c +++ b/module/subu-0/trc/subudb-rel-put.trc.c @@ -1,8 +1,8 @@ +#tranche subudb-rel-put.cli.c /* puts a relation in the masteru/subu table */ -#include "subudb-rel-put.cli.h" #include #include @@ -38,3 +38,4 @@ int main(int argc, char **argv){ } return 0; } +#tranche-end diff --git a/module/subu-0/trc/subudb-rel-rm.cli.c b/module/subu-0/trc/subudb-rel-rm.trc.c similarity index 96% rename from module/subu-0/trc/subudb-rel-rm.cli.c rename to module/subu-0/trc/subudb-rel-rm.trc.c index 3d15ca9..6008c70 100644 --- a/module/subu-0/trc/subudb-rel-rm.cli.c +++ b/module/subu-0/trc/subudb-rel-rm.trc.c @@ -1,8 +1,8 @@ +#tranche subudb-rel-rm.cli.c /* puts a relation in the masteru/subu table */ -#include "subudb-rel-rm.cli.h" #include #include @@ -39,3 +39,4 @@ int main(int argc, char **argv){ } return 0; } +#tranche-end diff --git a/module/subu-0/trc/subudb-subus.cli.c b/module/subu-0/trc/subudb-subus.trc.c similarity index 96% rename from module/subu-0/trc/subudb-subus.cli.c rename to module/subu-0/trc/subudb-subus.trc.c index be3af20..4871967 100644 --- a/module/subu-0/trc/subudb-subus.cli.c +++ b/module/subu-0/trc/subudb-subus.trc.c @@ -1,8 +1,8 @@ +#tranche subudb-subus.cli.c /* Set or get a new maximum subu number. Currently doesn't do the setting part. */ -#include "subudb-subus.cli.h" #include #include #include @@ -45,3 +45,4 @@ int main(int argc, char **argv){ return SUBU_ERR_DB_FILE; } +#tranche-end diff --git a/module/subu-0/trc/db.lib.c b/module/subu-0/trc/subudb.trc.c similarity index 76% rename from module/subu-0/trc/db.lib.c rename to module/subu-0/trc/subudb.trc.c index 17a5419..27d5639 100644 --- a/module/subu-0/trc/db.lib.c +++ b/module/subu-0/trc/subudb.trc.c @@ -1,22 +1,19 @@ -/* -The db file is maintained in SQLite +#tranche subudb.lib.c +#tranche subudb.lib.h + /* + The db file is maintained in SQLite -Because user names of are of limited length, subu user names are always named _s. -A separate table translates the numbers into the subu names. + Because linux user names are limited length, subu user names are of a compact + form: _s. A separate table translates the numbers into the subu names. -The first argument is the biggest subu number in the system, or one minus an -starting point for subu numbering. + Each of these returns SQLITE_OK upon success + */ + #include +#tranche-end -currently a unit converted to base 10 will always fit in a 21 bit buffer. - -Each of these returns SQLITE_OK upon success -*/ +#include +#include "common.lib.h" #include "subudb.lib.h" - -#if INTERFACE -#include -#endif - #include #include #include @@ -26,6 +23,11 @@ Each of these returns SQLITE_OK upon success // sqlite transactions don't nest. There is a way to use save points, but still // we can't just nest transactions. Instead use these wrappers around the whole // of something that needs to be in a transaction. +#tranche subudb.lib.h + int db_begin(sqlite3 *db); + int db_commit(sqlite3 *db); + int db_rollback(sqlite3 *db); +#tranche-end int db_begin(sqlite3 *db){ return sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL); } @@ -37,6 +39,9 @@ int db_rollback(sqlite3 *db){ } //-------------------------------------------------------------------------------- +#tranche subudb.lib.h + int subudb_schema(sqlite3 *db); +#tranche-end int subudb_schema(sqlite3 *db){ int rc; @@ -63,6 +68,9 @@ int subudb_schema(sqlite3 *db){ } //-------------------------------------------------------------------------------- +#tranche subudb.lib.h + int subudb_number_get(sqlite3 *db, int *n); +#tranche-end int subudb_number_get(sqlite3 *db, int *n){ char *sql = "SELECT value FROM Attribute_Int WHERE attribute = 'Max_Subunumber';"; sqlite3_stmt *stmt; @@ -80,6 +88,9 @@ int subudb_number_get(sqlite3 *db, int *n){ return SQLITE_NOTFOUND; } +#tranche subudb.lib.h + int subudb_number_set(sqlite3 *db, int n); +#tranche-end int subudb_number_set(sqlite3 *db, int n){ int rc; char *sql = "UPDATE Attribute_Int SET value = ?1 WHERE attribute = 'Max_Subunumber';"; @@ -94,6 +105,9 @@ int subudb_number_set(sqlite3 *db, int n){ //-------------------------------------------------------------------------------- // put relation into Masteru_Subu table +#tranche subudb.lib.h + int subudb_Masteru_Subu_put(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username); +#tranche-end int subudb_Masteru_Subu_put(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username){ char *sql = "INSERT INTO Masteru_Subu VALUES (?1, ?2, ?3);"; sqlite3_stmt *stmt; @@ -108,6 +122,9 @@ int subudb_Masteru_Subu_put(sqlite3 *db, char *masteru_name, char *subuname, cha } //-------------------------------------------------------------------------------- +#tranche subudb.lib.h + int subudb_Masteru_Subu_get_subu_username(sqlite3 *db, char *masteru_name, char *subuname, char **subu_username); +#tranche-end int subudb_Masteru_Subu_get_subu_username(sqlite3 *db, char *masteru_name, char *subuname, char **subu_username){ char *sql = "SELECT subu_username FROM Masteru_Subu WHERE masteru_name = ?1 AND subuname = ?2;"; size_t sql_len = strlen(sql); @@ -131,21 +148,15 @@ int subudb_Masteru_Subu_get_subu_username(sqlite3 *db, char *masteru_name, char } //-------------------------------------------------------------------------------- - -// we return and array of subudb_subu_info -#if INTERFACE -struct subudb_subu_element{ - char *subuname; - char *subu_username; -}; -#endif - -int subudb_Masteru_Subu_get_subus -( - sqlite3 *db, - char *masteru_name, - da *subus -){ +#tranche subudb.lib.h + typedef struct{ + char *subuname; // the name that masteru chose for his or her subu + char *subu_username; // the adduser name we gave it, typically of the s + } subudb_subu_element; + int subudb_Masteru_Subu_get_subus(sqlite3 *db, char *masteru_name, Da *subus); +#tranche-end +//returns an array of subudb_subu_elements that correspond to the masteru_name +int subudb_Masteru_Subu_get_subus(sqlite3 *db, char *masteru_name, Da *subusp){ char *sql = "SELECT subuname, subu_username" " FROM Masteru_Subu" " WHERE masteru_name = ?1;"; @@ -156,18 +167,13 @@ int subudb_Masteru_Subu_get_subus if( rc != SQLITE_OK ) return rc; sqlite3_bind_text(stmt, 1, masteru_name, strlen(masteru_name), SQLITE_STATIC); - da_alloc(subus, sizeof(subudb_subu_element)); - subudb_subu_element *pt = (subudb_subu_element *)subus->base; + subudb_subu_element *pt; rc = sqlite3_step(stmt); while( rc == SQLITE_ROW ){ - if( da_boundq(subus, pt) ){ - char *old_base = da_expand(subus); - da_rebase(subus, old_base, pt); - } + pt = (subudb_subu_element *)da_push_alloc(subusp); pt->subuname = strdup(sqlite3_column_text(stmt, 0)); pt->subu_username = strdup(sqlite3_column_text(stmt, 1)); rc = sqlite3_step(stmt); - pt++; } sqlite3_finalize(stmt); if( rc != SQLITE_DONE ) return rc; @@ -175,6 +181,9 @@ int subudb_Masteru_Subu_get_subus } //-------------------------------------------------------------------------------- +#tranche subudb.lib.h + int subudb_Masteru_Subu_rm(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username); +#tranche-end int subudb_Masteru_Subu_rm(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username){ char *sql = "DELETE FROM Masteru_Subu WHERE masteru_name = ?1 AND subuname = ?2 AND subu_username = ?3;"; size_t sql_len = strlen(sql); diff --git a/module/subu-0/try/makefile b/module/subu-0/try/makefile new file mode 100644 index 0000000..400ec02 --- /dev/null +++ b/module/subu-0/try/makefile @@ -0,0 +1,11 @@ + + +a b c: + echo $@ + +x y z: + echo $@ + +e f g: x y z + echo $^ + diff --git a/module/tranche/exec/tranche b/module/tranche/exec/tranche new file mode 100755 index 0000000000000000000000000000000000000000..886b91563d81105a78f6023f87a3cd77b39dd50e GIT binary patch literal 38888 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

    JifzB%a_Z!=Pzrwv!kNZn^RI*bfw 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 DWS;4| literal 0 HcmV?d00001 diff --git a/module/tranche/exec/tranche-target b/module/tranche/exec/tranche-target new file mode 100755 index 0000000000000000000000000000000000000000..8ef74f3f6c0c44cf6260d3772cca763b00091c25 GIT binary patch literal 39000 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 wG!aBE{^@+sWsUa9bnaN?+de6wSM}CNtBSHxz0q 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 // char * because it points to a byte in the array + if( pt < target_arrp->end ){ + da_string_push(taasp, *(char **)pt); + pt += target_arrp->element_size; + } + while( pt < target_arrp->end ){ + da_push(taasp, &sp); + da_string_push(taasp, *(char **)pt); + pt += target_arrp->element_size; + } + da_free_elements(target_arrp); + da_free(target_arrp); // construct then output the dependency line ---------------------------------------- - Da dla; - Da *dlap=&dla; // dependency line array pointer - da_alloc(dlap, sizeof(char)); - char *pt = tap->base; // char * because it points to a byte in the array - while( pt < tap->end ){ - da_string_push(dlap, *(char **)pt); - da_push(dlap, &sp); - pt += tap->element_size; - } - da_push(dlap, &colon); - da_push(dlap, &sp); - da_string_push(dlap, src_name); - da_push(dlap, &newline); - write(mfile_fd, dlap->base, dlap->end - dlap->base); - da_free_elements(tap); - da_free(tap); + Da make_line_string; + Da *mlsp = &make_line_string; + da_alloc(mlsp, sizeof(char)); + da_cat(mlsp, taasp); + da_push(mlsp, &colon); + da_push(mlsp, &sp); + da_string_push(mlsp, src_name); + da_push(mlsp, &newline); + write(mfile_fd, mlsp->base, mlsp->end - mlsp->base); // output action lines ---------------------------------------- - da_rewind(dlap); // reuse the line buffer - da_push(dlap, &tab); - da_string_push(dlap, "for i in $@; do rm $$i || true; done"); - da_push(dlap, &newline); - write(mfile_fd, dlap->base, dlap->end - dlap->base); - - da_rewind(dlap); // reuse the line buffer - da_push(dlap, &tab); - da_string_push(dlap, "tranche $<"); + da_rewind(mlsp); // reuse make line buffer + da_push(mlsp, &tab); + da_string_push(mlsp, "rm -f "); + da_cat(mlsp, taasp); + da_push(mlsp, &newline); + write(mfile_fd, mlsp->base, mlsp->end - mlsp->base); + + da_rewind(mlsp); // reuse the line buffer + da_push(mlsp, &tab); + da_string_push(mlsp, "tranche $<"); if(tdir){ - da_string_push(dlap, " -tdir "); - da_string_push(dlap, tdir); + da_string_push(mlsp, " -tdir "); + da_string_push(mlsp, tdir); } - da_push(dlap, &newline); - da_push(dlap, &newline); - write(mfile_fd, dlap->base, dlap->end - dlap->base); + da_push(mlsp, &newline); + da_push(mlsp, &newline); + write(mfile_fd, mlsp->base, mlsp->end - mlsp->base); - da_free(dlap); + da_free(taasp); + da_free(mlsp); return; } diff --git a/module/tranche/test/try/test4.out.expected b/module/tranche/test/try/test4.out.expected index e69de29..c7ff184 100644 --- a/module/tranche/test/try/test4.out.expected +++ b/module/tranche/test/try/test4.out.expected @@ -0,0 +1,2 @@ +test2.c +test2.h \ No newline at end of file diff --git a/tool/bin/tranche b/tool/bin/tranche index 31fdc5d80814132b413af368403f7ea0baf784a7..886b91563d81105a78f6023f87a3cd77b39dd50e 100755 GIT binary patch delta 9269 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 delta 8004 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 Brab@v delta 8632 zcmaJ{4O~>!w%_LrGYnsf%6!7W@G%7P>Gd-;98+LW(oy4vC<+P$YJhxP&D23Kl{=D* zyALxgOD$6?es`?Amz$y0#k@YV`(FLZ-|cGoG*UDyO?&xk-dg+YIWtV}zGIwq_WG~= zUu*BZ_B#7Or@F<9Z-|{KqWLM;=zoQdHxPD>H_(wnX2@Q()Z9x8g!kjS$4IU2F;@2A zl@)@dub`>o-=m5TU41%dT>Pm;*;9u(C#2kX``&G%TdmkQEX15@CAPj3-6`%JBTRz$ zlfwPx$Ra^JI)W;r7K`hG=<=up@ja1ljr!;BrU9qT`B1OTnS1arNN;ODYisZ8pA?Mx z++KWM!)$U7;`3VqeMS=}Rz}iyG*5{A!|7OUzPOpt_1X#atEAAK@yVj`e`relcyZLv zbZPuO@$y|-nvgW?t-Br%@ZCj@OLypwgcs-+NyF(U2|8OtxEFZ;S8n9A>zU4JRYP!t zJf?T=$S|mZ%W2iygp*QlyPCdfG0@wI%f*;Gv?OV#cV>rJ4 zy|-zV#T>p+Ry5tFJ1w(I9OH1rkrFXX!{-=k!focVUviau_u6!uQ&}WiUgT!K+(I+u zR2hKSyc8F1(TT}r;v2W<^T~UJ3_9_?w&WE*dOYp9x2`4FI*M+A$9~S^`h~dz+P?n0 zAL+&W(u86fo>CC>(hnXFjZL)(7pNn}D!%;#J(1EX7@=XIHL0fH8#g_kYeFZTtcw>X z{6I@}lc}IHh$jYVjBc8^_aTW+`D&v*WN7GaA{NoN}hX6U}hX&Z3n4z%6%G$+A~ zU(dirga3-|+B(MP4~JHJpR~@0ZUAKz_!$63NFf&dej0BaMfVtog)i}7P<{P7!81LZ zqziTuXrwo?_c4c{ou33J9df9dAG^PYy!0CP0 zI69{c7TMO3+kG52H};z=DLRh_aYYU&zPpDFXVEq=J;$Tm@iS1wMVAL{L9WfwN4EDR|=xHB7(!kiaq3@Lg9?z4#!#5AY7K22Qob~np z0ZkxAG+7}%cjEIB%(odaDVonAvCu#s#7Cf@Eiq9+T1XDMD`rmglcRBXtZJ0woN>C- zXegNC#=eFWP+r&+T$93h2xi|ej1ukzP3B;~1*Qzqd6l-Bra9U^Y_YX(*kx;P?rbmG zZfk$21w8aZJ`Li!%5g2kBy$$Eu=Q}}f<22UA4^I{?q0BmO`O|*9BU}LNoDp(0!`T1 zlK_QX8;M4I8Lq?Z+cenjJK5`--&CBN-LaFc-tpT545CbS>+VJG*s7JapCXdz9>EY6Pc zn>ezBMS-g&&-QG;z><7J*y^Pn67Ooz;$)@$X0qP-);B4Op#*e({K4?J7FcvbJ5%+# zBnu%$wvG&x3kp*&+u8=y{c+#A-%p*cqGcf$|CC)UI4sS?(g?R1b>lAZEow?yLb5c@`dHs5GQ$uqls%k4qQ$u;}^6E-+ z(o|y3XsW1bFcTqKF$G`ZX%J2QzdW9U@Z5XB<7ojo2=Zx=uU_;xJm=uyr~meN20_lh z?D0g3gscad4f0u#c93s_tOt1&WGBefD;`fb$o~L&4&)t>gCMhDLLwD}yaqBG;~BhrRE&SN1#j&g1ingQb|Y~tVTA-FjzY~$frQogFFVZ6XX{lyAhub$#@PPP!57z z2{KYe$S<(*vO$JHfwO~r3}ih>0#&CIB)&wxz&4@3{w_h7MB~Sf(mV|F3>@rAg8NMP z>7@l@?-S0_)nnrvzkcKKEJk$tu*faqj0lzZNO&+*>=;lTfuG5jJRT@;KD?5_3_k~zQhc0 z0ILAM4fwwsz;?kwhzATN`4cqy92@}x9VFsfe_WId(7_qN>i};Xf^U=q7y$eqfSdgB zVjq9_Ovunrz+k?=f%uS2kPf&28J^&em-+|_0aws@<6<1}panyxzoEEACfW}8CcqC2 z!S~Ae5x`ZjWgZ!V&zJEtfIk5E{r-59FA&E782la#7Wx~A56cAMu$6WIUOWU}AmizP z_W{0f2>!T?7Xog9J?tKWzv;ytWEB`31B1RH1}D7+WINzXVUs^Q1b4~!5x_tDfABMa z&xV??4c1iNEs8b)31Y~7gbaXz8;V2Q5C^_w2!~>zrSrx|SEj?08Onv(-*OR)gl()s zj*s=nYkl}Cz{f)W3I6zMAHE&%0`%lK0#6IDKn)4n$%BRj2K)mkSdl~UFc}{J+zkb6 znZGAdNOnex(t{yQ@Yo4OPU)T(vPek>ADASj zq`F7vtWbrfz$Y7C*{Sr!nK_}|DN@st>b^2FPYAVe*pf{cV7 zCJI69fwq{9$`=$F}rX0+6_YhS|V zQ!gaN9K2{GI-zzfTz8G(m*Mi^$BkarKGizw9gc;axdK3smR~d=Pg+4-8#Mx*o zP{5Ia-BI-m0Q$yycrtf_64T&8blx>uYTC6EuLt>R0T||W`;RP!= zRjHi+fXrVA=LCI4IXG~7mrmbUiOpnhtT=_+z5FDq1pTd7y=b&D5?p7zgs$ggs`Yw4 zZi#ArB2bwi9y?o(4L+_I2D1=;ZzGLsnRox_tH3n61^|deVp=v%Vv_P?IsJ99IpRF# z$s)G4=M6Ni)R??zBu@)HPQ@aV*SqcldY{8gA2HCCrAEgbuQN>)!(t>`yY^#j&SjNA zbk&h4Ogh1)x}cW=XXgqCUg(+%brK)(j_^L z$I#&v7TX4H!%jcU$!XcilqfznqRYX7XE4?;by8US87q=bf)5rctPG9R!zS(NOz&!H zzrp@lygb;;wA(R)Y~C)`W?*n*xV4?c)}y&awVS(QM>`hW%d#sA53X3F2%;;NCI~On zj-@8YawLvdW8tghz1hK$_5M=s9k2Bc&D4gzOl&gpc#k-FXkk$CrJ#(#h4EU&piHjg@iA!$@1H}}o-qcXY1yPPDh1g(dwUe(gZvh1{l5OEMG28aBO z^F3^&KZ7&hYf6gsipssXaDcyZnhWb8lfmgvFt0?^Bw{N_gZr7NHSDM#srd#mv*ra< zS~XWtv}jAgQqYcvhNx|Wdyw|wU>asOW*&zIgtZH-LKOHxkC*C46vW zbW=GI-c{jiP~mWOJD?4P?N~5!Lvf6*SOxfd67K4B#1!E$j&ry;8aI2dH@o@k)R2xL z98mRG&?zCy*d0_|pJBlFVb&ao#Q>mEGlthBhB>Zk(*c~xgW@gTm&8`1qC;r~^TSDa zCxo59Knh(LO%R@jvB_Fy_yQ?O?+ZUDg;4M%u|o zx7R^pLlA$Id5cc8qBFuygCK>j%d)pe^^&){8;vtqkN7tF^?aR!d8;1kt!AjV6|%SJ zstTCfmAu{JAm%kV*0PA330Ck2U*GJGo)aKWV?KH+OORHk+Q`l!Wtq}EmJzd7h3~J@ zh@J#1>&MQ!@Fa9Ch2C*h6|kIfSm$vag~fiM-m#UdBaPvadrp%y|(x30CanH%$DNHs&DrJb9RG)brAL zJ`(d8?3@?T6EAgcV-%q3s#nAKy$WlFBCF;x(qkT0(fMmgsxvP%xf4&dOXIZa2<5S;ZC5p9yU5+b|I1>ulh=) z$>dI|CP?<;#qbn7a^1Ujzb5*=Lj)JXN@uqk2phZT$x_26|JQ4FJ<%l8NG zf%+hlQFNf%MDwaj#mr21UsbFqOs6@IT^FJJX4HO}ZOK-K{;1TpDifNNrdFkLsxpm; zK|--o(W8uLRVrGQ;g^*o;ohng-cTmxxaZatiorUlbs{kU^*W%Xf2=tm2FJO_tf&+n z>J>^wn|hQom^~;%;8FdCQkkV*s0@c6RjYDjzETa$E7c3(UzRcvv{|jn)F!2(N~xQw zR5X3u^Ip%tfldRURI0O@p`${b4UK^AYUqEuM=8X+pItpeLDSc`LYpcZ9;>M>Z>npc ze_bjTfWmGs00ouiSX-glih z88&l$V3JU-56s+sTpzf1+*}{HAwQJ#4idP}KjR$&tHrlo2MN;fyd~%s*WcuNZ(&oi z+>0QAr8bW1rGg*ktN2ss*Bf=z>QEcKU%h++$s*`N#0Uakz30~_hcrS{fO+qtF2@?7 zn})Px&B8x*;su+9UEhMuNLY-(1IhPX|C_HCcyXaUoOoMXYT;LgH(TOn1%54*a-+bb z|4Ob89O_!GhqH0Xreydl-KI@*MQbem$EHkU;KAx^3``tGAlHno$-<*_dTX39@O1nY zC)}W?>sm9#JRLpMTB3<0I&#czjJOY~(M-}*TtwL0Ig55i)t4%ki3oJ*7 z!-+b3C=Y(4+zFhCfIIzd2&J(CL6a4QM3Mle+;Ezn88C6i+%B)Q22}J;JU-=v#Ol z?}oo}{=jdIzcHKhRM?^`zsPL@k6S-*ec;E#J+2S@$R7!B9h~gI??eNnqz?WT?b@O< z+|O+S&!Tzs#1@?}4=u-3a+~2MD;v*7X;@??`W10AOM0#*%`|?iPH-|W``z=l{$8LP z+LP&P+dg;iYyU-XA92P6QM;&epW0zoh;QrY)t#C0@4#RyB+xwA;59UBgtz#5|DT8o z`Z{R!VMc_182#?KiJ`sQrPe}$UfmJJ{1&DwLe$%Fda#}xp~H7w?S7M8L~bjM{u;9j>>TF=xG$C zlM(LU_nIb3e>Je5dXJDki)6#1*A~1UCJ2uDDOVizxhLKxyN+#_9ot%3+j`k2krGx3tR?p_*MtdT-4A1WV}kU8p7k-Vlj8L3fN{d0E1_hs zpo5eh+dd(=^d8&=hApj6M*8j#LbN{jXI2}ZD8=7r`{Soef4s+jh#xI&{RyLo*zyF6 z)cYQLHeq618{%k_9d)@!MY7!EzlBZj_t-QT8EUm+jG$&hXeFQqQN{-o^89UeRi4U4a-J4FxpD z{JH5yXat7kOm98Y1)Iyqdw%qIw&k|h=eE~%c~+!2>gB&YK+~rLbvYV_?lohyt>pwI zwRIvOl#{q(yY&t@!n2kRqX^?t(lgf~=5CW& z493@cX(IInhZH+}Ej^Uh>Xb)qO9ul}c1Ip16PX~3%b>?TO-UF$nJm`l9wO$jP9>}< z$e~|Y9-U9`d)%|k)J&=7d-g=?XxE1JeLRcruI70^UInskcLg6b6ccI4eINUewor$6 z|J|0z>28kG`qgh%)cGbJq$F)0v|6FndWt#+h4&WMB2ySrVdr+tan$D+91rGp)jWYA zSW%>*X8$-=k%S-<;}CPZ+J(`);~Kf&ecJF2U7*{GHz*IOEEOi z0_WZU?}j%xnFm)u5#Lb#Us3$uK$)EOd2Cb?PF%k@)^hG{N}rzv*QZo}WU*WQJ*t_g z&o^)s3CTF)*mgzP6$s2wzgbxW+8Bj*G@~u8Um}^R!E?TtexVg6Hw{D2QVWGr33+za zcbkytn~>jbIISuF|DySz!xv5Azl^3zGuYr7`mh?#RoYy2?^4AG&I~oyek%AT-+5{| zdDFk2a|3f1tr_o@(O;F)Lgu<Y!fI*VLA!)tUh-WI@e12#HK)MpBEI?f{vdlX=#ZEf#!44>`5X3Y ztc`sUQzqHIVUsL7rIt4I+=1d0*3ct7+&rHAirW3#OGaLLQ4X=8QPNpouZQnAoR z!>&QC@P3onriG*KwK0x*d4^XK$>Cx@-6Ao0gctBL@!2hwZY!1!-(t_$UJ@6u^w_$z zMPJiHr?V{ykCIMh>fFxx``jJRdG6Qjqu74p4)#mz#Gsd3Js#F0K2>~?RmJ7#k73v* zvb|OlyBJq4ebU92$EC12@o`b#{FC>%|2f+uVG|Y&+dbW4K9?d01&)SHqSGg5eCeob zH?+R@mAfeYw0`G+E3QYDt*BUFuUzJ|FRLo8w3jWaD7B~7gbLM5?U`kE!C75WIlsKr zo-$IfXF3-wsY<{0M?*(~T%cz4ym`^yePWVcajc;qhz&-37V_H1DRza}~7r zmmW_i=pR9&QJSN_@_2?wf=g&Y)HA@y!@QiJPS9PTyFibDwt!v*{ROlWv=8z}75^sk zJ_NJ{%QOQtqaFI7vu;Bl)D3zJ^nXFGg8m5F32H)}N2A+J0v!_M5`<@PGXsn)^b{v3 z^_E?rjiARs!@h$7(8-{kpdW%pqsO*`4gnqYJ@i3~L7kusbQfqm9zDlE&w^eBwc-ic z2})1OX!PI1phGfn6NHEV4A70BPSBw^Y3w3C&Ns(EouEJK+4ez6;x+chpx(yL&paL& z;#UfO$KkJ-T_4m(tYqTg1ef^>kLNi;$3#XwEj<#Umzu(Z(fne;I*h-De}i8HuKS0_ zvlVOQ)z{UDWPtSB@wWtPSO@CGrCP83a8Vd5T!sMlgHNE8@h7`_JF?vFq2!zUBY zZVric;ie6OIFk7cE%ymN3tU7M{g$J{z{7wyf_fv>)q7`h5&U&1zNl_^m=`Z?2e1TH zH_tx+X|8XosKz6}vrtt&2N^mNpj7n-eiGIBL^u6eUj50ye`Na~u(>L5C!&6>{*ncL zQw4q>mJG@RZNMv%vF#*ZJdqWp^03 z8+e>QUg*=m2>dAUY5ur0MF{}@g?0%19Rf-I0?JzR#SF*J{|9iKJ$;K^>2uH@_>aKr z{c-7O#Q}J9D4mA~<-uqEC@HBr7`oXzW|d>C0Yl~-pAy=rO6<;HuZ(|G8W+mONG1zCwj^OE z-gwa)am}~qaC(s48E z%2kEKlG`$?U4kMDp0mRBG$tj8#%m}pK{6)OD9AVix`M%YlbBJ)b42XMKM*s=_!W`$ zrn!(5O%G!rnRehe$TR~SgJ7} zZO%Ru#G)SWE4Hx_kEh0@lBP*t0urJ-uZdgrlCt3B*079~!54;VlsoV)Ls2tQ4m&=ndq>(qBeb5D)4ZXx7e};C4#s_9j|u@_SrPq;)oE{ zGk;`o&tu`)`WSgCPEuB`-1-Q3VsVy|$6~=A6NGLg&W-rkqQuP~{#@HdahEMX{m->G zf`g@0wCDCyhR{Ar#tS3%smi=pbLAsm*M-TdYr$Sd(ghLgRcSjU>2it9x4gazQZ!$$ zV41{%Y_BhRB8gKYW~$o0Y4$-kv5qI(Q@zvVv!2>ttyjVRIw_Bj_&6qqyR75CU^O>V zH%=(4#5BhzE5007?s|NdGR(1+(Rxqtt`E2E(Dnk>Ll7qhlU=Fl3Bm57K>9~aG80D- z_^}RDY>r1uvtFV&`X^Fcx~4;}1llRAsmSWGttBMWyXvdROqS}TJn^JzPOnz664S^q zWy7Ap)=An!8mW=QIj%NIekSG4AA@u5EHznK`f?%pCGr^06%s@f>sM^=cL!ZHNN56} zw%s}`!t)5$+p3k$Euc^P+HQ&~O57Jx46P7eUi*2fgph?)Yp)mxFbFzPvSBPW(z3p) z8wqA~D$>Fy7qZD^yb2hT2c(`uSJn-PJrz#0jJ$$NKEH}|dK=E&0 z2j>5z@ugrc9o2_DlW%ohQll$0Hj|S}X|&&^rhL;xlD(`|kOi&h!(fU?YFc1w!~Ddn z>abXd{wvA8qd$>G0(d*(zhE`rrI7DY%HB!PLcYz11C*gD-}nI^Pew0;ZHI-*>s|KX zRGW)FK#6XBk!qD6T3}gho(56Hs@txZDK|bysdf)m5>c!eb>}HY3k7os!LR9QUDH&1 z{E)=$z2dd^TC5i3%wX#6uVt&5wbYa%1Bc@l@|7(XVvmx+0}&sl=J3h#6B##lAI4(n z5qv;xL4`)XHxKkx_GZ3`zR-vVy_v145yaoelNugVC<1a3y)u}39Mktz?H}Y`pw~PZ zS&3Ot0tZZ6x|o_$8m4KnQVMrz_J!y_k-ts)y(vnl^MxD1}Y7_0aI4T3a z9GiW%wves0`id0x?KErjS~Y@lA+~}RYgI&E3X7d?DPN`brE+ENt1`8g82uE zE5S_j1~VI$m3b}J_D@V1L~V-zAQHvW;vs6o;KkH|J6KGr4GCG7Ftyb>%0ch<5hzbwY_dCCXGC8 za|>}x$>LaUV1a62xYs~CJ2YdI>k_Gq;PZV*74bcUsJkmckBCz(|CY7E;Q|-mS4Dpd`x&^S@gju#|}ciFXqIM-P+oXF3ZNvbw~wS@(-ITH^BWon5gZEA5>$yXdt zhECN;@cJwAYQ%Yy5&s!!SoB}pbGRIT_2%{)XhMnui&s24ktS!7JBnzAsReN1tIE5QI1h?iRvb=Gj9Br5_>o>}V$+Db{TXkriAR9Kyx+N#& zU{WyjHUOmmT|(et_YGAc@W^~tbD$n?wR89tl^=Mz zzp3&A-#6~7eC4$#%=g}7W_NyP?rZ0@A0gzWD7!F;??pivpz?i>V0PSHkSTCw7r46!`dEs`3M~L5FGzqA)p!2UVxUCTw8)U1qs2dPpyPndr@m*AJJ* zq_Y>+XITUL(-#!46e*y({=Pmfd@YNM-5)c;=^prX0wG} zH^^?_*P)qg`DU|RqDc>=FCios)km2h{}PFL(zmZ(5;YHn4;H^RvyY(vqNXn%bBj+G zip;g;6E=HGn!8}@eUaVX7OYnqxBIbY5`)~8+mm#XF^27I%JP0!#9q44gb#_V=g#b& z+W+07{a-&7Y$~{`2jy^=s|P8r54oFmz9)%W*wo#_#P`^?-J?TCl_}7?F!tx&4}|Pn lt_(kBJ)avEvU-g&>S9wds@kHA&avkT9q{U4^&J+A-& delta 8219 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