From af789ab57fb54cbcfbbb752bd1cf56b50eb52f6a Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Sun, 24 Feb 2019 02:37:01 +0100 Subject: [PATCH] number example --- src/1_try/mh_main_prob/command1.c | 6 +++++ src/1_try/mh_main_prob/command2.c | 6 +++++ src/1_try/mh_main_prob/just_fun.c | 4 +++ src/1_try/mh_main_prob/transcript1.txt | 36 +++++++++++++++++++++++++ src/1_try/mh_main_prob/transcript2.txt | 20 ++++++++++++++ src/1_try/mh_main_prob/transcript3.txt | 27 +++++++++++++++++++ src/{ => 3_documents}/README.txt | 0 src/5_scratch/dispatch_f.lib.h | 6 +++++ src/5_scratch/subu-config.lib.h | 3 ++- src/5_scratch/subu-init.cli.h | 7 ++--- src/5_scratch/subu-mk-0.cli.h | 8 +++--- src/5_scratch/subu-mk-0.lib.h | 21 ++++++++------- src/5_scratch/subu-number.cli.h | 9 ++++--- src/dispatch_f.lib.c | 19 ++++++++----- src/makefile | 11 ++++---- src/subu-config.lib.c | 34 ++++++++++++----------- src/subu-init.cli.c | 2 +- src/subu-mk-0.cli.c | 14 ++++++---- src/subu-mk-0.lib.c | 19 ++++++------- src/subu-number.cli.c | 6 ++--- src/subu_init | Bin 23656 -> 0 bytes 21 files changed, 192 insertions(+), 66 deletions(-) create mode 100644 src/1_try/mh_main_prob/command1.c create mode 100644 src/1_try/mh_main_prob/command2.c create mode 100644 src/1_try/mh_main_prob/just_fun.c create mode 100644 src/1_try/mh_main_prob/transcript1.txt create mode 100644 src/1_try/mh_main_prob/transcript2.txt create mode 100644 src/1_try/mh_main_prob/transcript3.txt rename src/{ => 3_documents}/README.txt (100%) delete mode 100755 src/subu_init diff --git a/src/1_try/mh_main_prob/command1.c b/src/1_try/mh_main_prob/command1.c new file mode 100644 index 0000000..637df55 --- /dev/null +++ b/src/1_try/mh_main_prob/command1.c @@ -0,0 +1,6 @@ +#include "command1.h" +#include +int main(int argc, char **argv){ + printf("command1 %d\n", f()); + return 0; +} diff --git a/src/1_try/mh_main_prob/command2.c b/src/1_try/mh_main_prob/command2.c new file mode 100644 index 0000000..5d8c612 --- /dev/null +++ b/src/1_try/mh_main_prob/command2.c @@ -0,0 +1,6 @@ +#include "command2.h" +#include +int main(int argc, char **argv){ + printf("command2 %d\n", f() + argc); + return 0; +} diff --git a/src/1_try/mh_main_prob/just_fun.c b/src/1_try/mh_main_prob/just_fun.c new file mode 100644 index 0000000..67625f4 --- /dev/null +++ b/src/1_try/mh_main_prob/just_fun.c @@ -0,0 +1,4 @@ +#include "just_fun.h" +int f(){ + return 5; +} diff --git a/src/1_try/mh_main_prob/transcript1.txt b/src/1_try/mh_main_prob/transcript1.txt new file mode 100644 index 0000000..c5511fe --- /dev/null +++ b/src/1_try/mh_main_prob/transcript1.txt @@ -0,0 +1,36 @@ +Various commmand files each with its own main for testing a library. makeheaders gets confused and puts all the +declarations in the headers, leading to a failure. + + +> ls +command1.c command2.c just_fun.c +> cat just_fun.c +#include "just_fun.h" +int f(){ + return 5; +} +> cat command1.c +#include "command1.h" +#include +int main(){ + printf("command1 %d\n", f()); + return 0; +} +> cat command2.c +#include "command2.h" +#include +int main(int argc, char **argv){ + printf("command2 %d\n", f() + argc); + return 0; +} +> makeheaders *.c +> gcc -o command1 command1.c +command1.c: In function ‘main’: +command1.c:3:1: error: number of arguments doesn’t match prototype + int main(){ + ^~~ +In file included from command1.c:1: +command1.h:5:5: error: prototype declaration + int main(int argc,char **argv); + ^~~~ +> diff --git a/src/1_try/mh_main_prob/transcript2.txt b/src/1_try/mh_main_prob/transcript2.txt new file mode 100644 index 0000000..77ec819 --- /dev/null +++ b/src/1_try/mh_main_prob/transcript2.txt @@ -0,0 +1,20 @@ +Making each main call static so it won't be in the header. gcc can't find main. + +> cat command1.c +#include "command1.h" +#include +static int main(){ + printf("command1 %d\n", f()); + return 0; +} +> cat command2.c +#include "command2.h" +#include +static int main(int argc, char **argv){ + printf("command2 %d\n", f() + argc); + return 0; +} +> gcc -o command1 command1.c just_fun.c +/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/crt1.o: in function `_start': +(.text+0x24): undefined reference to `main' +collect2: error: ld returned 1 exit status diff --git a/src/1_try/mh_main_prob/transcript3.txt b/src/1_try/mh_main_prob/transcript3.txt new file mode 100644 index 0000000..b3a00b7 --- /dev/null +++ b/src/1_try/mh_main_prob/transcript3.txt @@ -0,0 +1,27 @@ +This time making each main definition have the same prototype. Still end up with multiple main declarations, +it is just that they agree. + +> rm *.h +> makeheaders *.c +> cat command1.c +#include "command1.h" +#include +int main(int argc, char **argv){ + printf("command1 %d\n", f()); + return 0; +} +> cat command1.h +/* This file was automatically generated. Do not edit! */ +#undef INTERFACE +int f(); +int main(int argc,char **argv); +int main(int argc,char **argv); +> cat command2.c +#include "command2.h" +#include +int main(int argc, char **argv){ + printf("command2 %d\n", f() + argc); + return 0; +} +> gcc -o command1 command1.c just_fun.c +> .. worked diff --git a/src/README.txt b/src/3_documents/README.txt similarity index 100% rename from src/README.txt rename to src/3_documents/README.txt diff --git a/src/5_scratch/dispatch_f.lib.h b/src/5_scratch/dispatch_f.lib.h index 994592d..85eaf80 100644 --- a/src/5_scratch/dispatch_f.lib.h +++ b/src/5_scratch/dispatch_f.lib.h @@ -1,5 +1,11 @@ /* This file was automatically generated. Do not edit! */ #undef INTERFACE +#include +#include int dispatch_f_euid_egid(char *fname,int(*f)(void *arg),void *f_arg,uid_t euid,gid_t egid); int dbprintf(const char *format,...); int dispatch_f(char *fname,int(*f)(void *arg),void *f_arg); +#define ERR_DISPATCH_F_SETEGID 3 +#define ERR_DISPATCH_F_SETEUID 2 +#define ERR_DISPATCH_F_FORK 1 +#define INTERFACE 0 diff --git a/src/5_scratch/subu-config.lib.h b/src/5_scratch/subu-config.lib.h index c359b52..a63786d 100644 --- a/src/5_scratch/subu-config.lib.h +++ b/src/5_scratch/subu-config.lib.h @@ -2,8 +2,9 @@ #undef INTERFACE #include typedef unsigned int uint; -int subu_number(sqlite3 *db,uint **subu_number); +int subu_number(sqlite3 *db,uint *subu_number); int schema(sqlite3 *db,uint max_subu_number); extern char config_file[]; +extern char config_file[]; #define ERR_CONFIG_FILE -1 #define INTERFACE 0 diff --git a/src/5_scratch/subu-init.cli.h b/src/5_scratch/subu-init.cli.h index 46bfd20..eff6c3f 100644 --- a/src/5_scratch/subu-init.cli.h +++ b/src/5_scratch/subu-init.cli.h @@ -5,6 +5,7 @@ typedef unsigned int uint; int schema(sqlite3 *db,uint max_subu_number); extern char config_file[]; -int main(); -int main(); -int main(int argc,char **argv,char **env); +extern char config_file[]; +int main(int argc,char **argv,char **envp); +int main(int argc,char **argv,char **envp); +int main(int argc,char **argv,char **envp); diff --git a/src/5_scratch/subu-mk-0.cli.h b/src/5_scratch/subu-mk-0.cli.h index 075b350..9c73c68 100644 --- a/src/5_scratch/subu-mk-0.cli.h +++ b/src/5_scratch/subu-mk-0.cli.h @@ -2,7 +2,9 @@ #undef INTERFACE #include extern char config_file[]; +extern char config_file[]; int subu_mk_0(char *subuname,char *config_file); -int main(); -int main(); -int main(int argc,char **argv,char **env); +#define ERR_SUBU_MK_0_ARG_CNT 1 +int main(int argc,char **argv,char **envp); +int main(int argc,char **argv,char **envp); +int main(int argc,char **argv,char **envp); diff --git a/src/5_scratch/subu-mk-0.lib.h b/src/5_scratch/subu-mk-0.lib.h index 82c7e14..76a337a 100644 --- a/src/5_scratch/subu-mk-0.lib.h +++ b/src/5_scratch/subu-mk-0.lib.h @@ -10,20 +10,23 @@ struct dispatch_useradd_ret_t { struct passwd *pw_record; }; struct dispatch_useradd_ret_t dispatch_useradd(char **argv,char **envp); +#include int dispatch_f_euid_egid(char *fname,int(*f)(void *arg),void *f_arg,uid_t euid,gid_t egid); int dbprintf(const char *format,...); #include extern char config_file[]; +extern char config_file[]; int subu_mk_0(char *subuname,char *config_file); int masteru_makes_subuhome(void *arg); int allowed_subuname(char *subuname); -#define ERR_SUBU_MK_0_SETFACL 9 -#define ERR_SUBU_MK_0_FAILED_USERADD 8 -#define ERR_SUBU_MK_0_BUG_SSS 7 -#define ERR_SUBU_MK_0_FAILED_MKDIR_SUBU 6 -#define ERR_SUBU_MK_0_MK_SUBUHOME 5 -#define ERR_SUBU_MK_0_MALLOC 4 -#define ERR_SUBU_MK_0_BAD_MASTERU_HOME 3 -#define ERR_SUBU_MK_0_SETUID_ROOT 2 -#define ERR_SUBU_MK_0_CONFIG_FILE 1 +#define ERR_SUBU_MK_0_SETFACL 10 +#define ERR_SUBU_MK_0_FAILED_USERADD 9 +#define ERR_SUBU_MK_0_BUG_SSS 8 +#define ERR_SUBU_MK_0_FAILED_MKDIR_SUBU 7 +#define ERR_SUBU_MK_0_MK_SUBUHOME 6 +#define ERR_SUBU_MK_0_MALLOC 5 +#define ERR_SUBU_MK_0_BAD_MASTERU_HOME 4 +#define ERR_SUBU_MK_0_SETUID_ROOT 3 +#define ERR_SUBU_MK_0_CONFIG_FILE 2 +#define ERR_SUBU_MK_0_ARG_CNT 1 #define INTERFACE 0 diff --git a/src/5_scratch/subu-number.cli.h b/src/5_scratch/subu-number.cli.h index 759d808..91145ce 100644 --- a/src/5_scratch/subu-number.cli.h +++ b/src/5_scratch/subu-number.cli.h @@ -2,9 +2,10 @@ #undef INTERFACE #include typedef unsigned int uint; -int subu_number(sqlite3 *db,uint **subu_number); +int subu_number(sqlite3 *db,uint *subu_number); #define ERR_CONFIG_FILE -1 extern char config_file[]; -int main(); -int main(); -int main(int argc,char **argv,char **env); +extern char config_file[]; +int main(int argc,char **argv,char **envp); +int main(int argc,char **argv,char **envp); +int main(int argc,char **argv,char **envp); diff --git a/src/dispatch_f.lib.c b/src/dispatch_f.lib.c index cfa75a8..7edf41b 100644 --- a/src/dispatch_f.lib.c +++ b/src/dispatch_f.lib.c @@ -10,14 +10,21 @@ command passed in, and wants better behavior, he or she can spin a special version of dispatch for that command. */ +#define _GNU_SOURCE #include "dispatch_f.lib.h" +// we need the declaration for uid_t etc. +#if INTERFACE +#include +#include +#define ERR_DISPATCH_F_FORK 1 +#define ERR_DISPATCH_F_SETEUID 2 +#define ERR_DISPATCH_F_SETEGID 3 +#endif // without this #define execvpe is undefined #define _GNU_SOURCE -#include -#include #include #include #include @@ -32,7 +39,7 @@ int dispatch_f(char *fname, int (*f)(void *arg), void *f_arg){ if( pid == -1 ){ perror(perror_src); fprintf(stderr, "%s %s\n", perror_src, fname); - return ERR_FORK; + return ERR_DISPATCH_F_FORK; } if( pid == 0 ){ // we are the child int status = (*f)(f_arg); @@ -53,18 +60,18 @@ int dispatch_f_euid_egid(char *fname, int (*f)(void *arg), void *f_arg, uid_t eu if( pid == -1 ){ perror(perror_src); fprintf(stderr, "%s %s %u %u\n", perror_src, fname, euid, egid); - return ERR_FORK; + return ERR_DISPATCH_F_FORK; } if( pid == 0 ){ // we are the child if( seteuid(euid) == -1 ){ perror(perror_src); fprintf(stderr, "%s %s %u %u\n", perror_src, fname, euid, egid); - return ERR_SETEUID; + return ERR_DISPATCH_F_SETEUID; } if( setegid(egid) == -1 ){ perror(perror_src); fprintf(stderr, "%s %s %u %u\n", perror_src, fname, euid, egid); - return ERR_SETEGID; + return ERR_DISPATCH_F_SETEGID; } int status = (*f)(f_arg); exit(status); diff --git a/src/makefile b/src/makefile index ddfcfdd..030a9f7 100755 --- a/src/makefile +++ b/src/makefile @@ -16,10 +16,9 @@ ECHO= echo SHELL=/bin/bash SCRATCHDIR= 5_scratch # clean and others put things here CC=gcc -CFLAGS=-std=c11 -fPIC -I. -ggdb -DDEBUG +CFLAGS=-std=c11 -fPIC -I. -ggdb -DDEBUG -Werror LIB="libsubu.a" -LIBPATH="." #no trailing slash -LINKFLAGS="-L. -lsubu" +LINKFLAGS=-L. -lsubu -lsqlite3 #these are the source files that exist SOURCES_LIB= $(wildcard *.lib.c) @@ -46,7 +45,6 @@ version: @echo "CC: " $(CC) @echo "CFLAGS: " $(CFLAGS) @echo "LIB: " $(LIB) - @echo "LIBPATH: " $(LIBPATH) @echo "LINKFLAGS: " $(LINKFLAGS) @echo '______end make $@_____' @@ -71,7 +69,7 @@ deps: $(CC) $(CFLAGS) -MM $(SOURCES) 1> 2_makefile_deps for i in $(EXECS) ; do\ $(ECHO) >> 2_makefile_deps;\ - $(ECHO) "$$i : $$i.cli.o $(LIBPATH)/$(LIB)" >> 2_makefile_deps;\ + $(ECHO) "$$i : $$i.cli.o $(LIB)" >> 2_makefile_deps;\ $(ECHO) " $(CXX) -o $$i $$i.cli.o $(LINKFLAGS)" >> 2_makefile_deps;\ done @echo '______end make $@_____' @@ -86,7 +84,7 @@ lib: sub_lib: $(LIB) -execs: $(LIBPATH)/$(LIB) +execs: $(LIB) @echo '---- make $@:------------------------------------------------------------' @echo `pwd`'>' if [ ! -e 2_makefile_deps ]; then make deps; fi @@ -110,6 +108,7 @@ install: all clean: @echo '---- make $@:------------------------------------------------------------' @echo `pwd`'>' + if [ -f subu.db ]; then rm subu.db; fi for i in $(wildcard *~); do mv $$i $(SCRATCHDIR); done for i in $(wildcard *.lib.o) $(wildcard *.cli.o); do rm $$i; done for i in $(HFILES); do mv $$i 5_scratch; done # just in case someone wrote a header file diff --git a/src/subu-config.lib.c b/src/subu-config.lib.c index 8706aaf..525e195 100644 --- a/src/subu-config.lib.c +++ b/src/subu-config.lib.c @@ -50,28 +50,30 @@ int schema(sqlite3 *db, uint max_subu_number){ return sqlite3_exec(db, sql, NULL, NULL, NULL); } -int subu_number(sqlite3 *db, uint **subu_number){ +static uint count = 0; + +static int callback(void *NotUsed, int argc, char **argv, char **col_name){ + int i; + printf("count: %u\n", count++); + for(i=0; i -int main(){ +int main(int argc, char **argv, char **envp){ sqlite3 *db; if( sqlite3_open(config_file, &db) diff --git a/src/subu-mk-0.cli.c b/src/subu-mk-0.cli.c index cc07a78..6ed3bed 100644 --- a/src/subu-mk-0.cli.c +++ b/src/subu-mk-0.cli.c @@ -2,15 +2,19 @@ subu-mk-0 command */ - -#include #include "subu-mk-0.lib.h" +#include -int main(int argc, char **argv, char **env){ +// char *config_file = "/etc/subu.db"; +char config_file[] = "subu.db"; + +int main(int argc, char **argv, char **envp){ char *command = argv[0]; if( argc != 2 ){ fprintf(stderr, "usage: %s subu", command); - return ERR_ARG_CNT; + return ERR_SUBU_MK_0_ARG_CNT; } - return subu_mk_0(argv[1]); + char *subuname = argv[1]; + + return subu_mk_0(subuname, config_file); } diff --git a/src/subu-mk-0.lib.c b/src/subu-mk-0.lib.c index 5c1bc88..657dc80 100644 --- a/src/subu-mk-0.lib.c +++ b/src/subu-mk-0.lib.c @@ -33,15 +33,16 @@ #include #if INTERFACE -#define ERR_SUBU_MK_0_CONFIG_FILE 1 -#define ERR_SUBU_MK_0_SETUID_ROOT 2 -#define ERR_SUBU_MK_0_BAD_MASTERU_HOME 3 -#define ERR_SUBU_MK_0_MALLOC 4 -#define ERR_SUBU_MK_0_MK_SUBUHOME 5 -#define ERR_SUBU_MK_0_FAILED_MKDIR_SUBU 6 -#define ERR_SUBU_MK_0_BUG_SSS 7 -#define ERR_SUBU_MK_0_FAILED_USERADD 8 -#define ERR_SUBU_MK_0_SETFACL 9 +#define ERR_SUBU_MK_0_ARG_CNT 1 +#define ERR_SUBU_MK_0_CONFIG_FILE 2 +#define ERR_SUBU_MK_0_SETUID_ROOT 3 +#define ERR_SUBU_MK_0_BAD_MASTERU_HOME 4 +#define ERR_SUBU_MK_0_MALLOC 5 +#define ERR_SUBU_MK_0_MK_SUBUHOME 6 +#define ERR_SUBU_MK_0_FAILED_MKDIR_SUBU 7 +#define ERR_SUBU_MK_0_BUG_SSS 8 +#define ERR_SUBU_MK_0_FAILED_USERADD 9 +#define ERR_SUBU_MK_0_SETFACL 10 #endif diff --git a/src/subu-number.cli.c b/src/subu-number.cli.c index cb9d32b..586115c 100644 --- a/src/subu-number.cli.c +++ b/src/subu-number.cli.c @@ -7,7 +7,7 @@ Currently it doesn't do the setting part. #include "subu-number.cli.h" #include -int main(){ +int main(int argc, char **argv, char **envp){ int ret; sqlite3 *db; ret = sqlite3_open(config_file, &db); @@ -15,8 +15,8 @@ int main(){ fprintf(stderr, "error exit, could not build schema\n"); return ERR_CONFIG_FILE; } - uint subu_number; - ret = subu_number(db, subu_number); + uint msn; + ret = subu_number(db, &msn); if( sqlite3_close(db) != SQLITE_OK ){ fprintf(stderr, "error exit, strange, we could not close the db\n"); return ERR_CONFIG_FILE; diff --git a/src/subu_init b/src/subu_init deleted file mode 100755 index 91cc8fa2fe74d7343c6638a772fadc58a7129bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23656 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