applied with fix: https://github.com/crash-utility/crash/commit/3fc8d4023c0d5dfbf21ea7cdce96a24ece00d4f2
On Fri, Oct 31, 2025 at 1:12 PM Tao Liu <[email protected]> wrote: > > On Thu, Oct 30, 2025 at 9:03 PM lijiang <[email protected]> wrote: > > > > On Tue, Oct 28, 2025 at 6:40 AM Tao Liu <[email protected]> wrote: > >> > >> This patch will add the following functions to eppic: > >> > >> 1) Allow main() as the entry for any eppic program. Previously only func() > >> which companied by func_help() & func_usage() is regarded as the main > >> entry of the eppic program. This constraint only makes sense for > >> creating > >> a crash-like cmd. If users only want to create a oneshot run program for > >> fast testing, then the constraint is misleading. So this patch will add > >> main() as entry for eppic programs. > >> > >> 2) Add new command "eppic" for oneshot run eppic programs. Previously eppic > >> expect programs to run as the form of crash-like cmd, and it is not > >> convenient for oneshot run programs. With "eppic" command, people can > >> use "edit -f" or any other editors to create eppic programs, then run > >> it via "eppic myfile.c". > >> > >> 3) Add a template for any new eppic program files. If "edit -f" a new > >> file, a > >> template with an example will be written into the new file. So users can > >> refer to it when writting any eppic programs. > >> > >> Signed-off-by: Tao Liu <[email protected]> > >> --- > >> extensions/eppic.mk | 9 +- > >> extensions/eppic.patch | 210 +++++++++++++++++++++++++++++++++++++++++ > >> 2 files changed, 218 insertions(+), 1 deletion(-) > >> create mode 100644 extensions/eppic.patch > >> > >> diff --git a/extensions/eppic.mk b/extensions/eppic.mk > >> index 9435793..bf80dd1 100644 > >> --- a/extensions/eppic.mk > >> +++ b/extensions/eppic.mk > > > > > > Again, please refer to the comment: > > https://www.mail-archive.com/[email protected]/msg01698.html > > This looks like: > > --- a/extensions/eppic.mk.orig > > +++ b/extensions/eppic.mk > > ... > > And remove the lines: > > diff --git a/extensions/eppic.mk b/extensions/eppic.mk > > index 9435793..bf80dd1 100644 > > > > > >> > >> @@ -53,7 +53,14 @@ all: > >> fi; \ > >> if [ -f $(APPFILE) ]; \ > >> then \ > >> - make -f eppic.mk eppic.so; \ > >> + if patch --dry-run -N -p0 < eppic.patch > >> >/dev/null ; then \ > >> + patch -N -p0 < eppic.patch; \ > >> + make -f eppic.mk eppic.so; \ > >> + elif patch --dry-run -N -p0 -R < > >> eppic.patch >/dev/null ; then \ > >> + make -f eppic.mk eppic.so; \ > >> + else \ > >> + echo "eppic.so: apply eppic.patch > >> error"; \ > >> + fi; \ > >> else \ > >> echo "eppic.so: failed to pull eppic code > >> from git repo"; \ > >> fi; \ > >> diff --git a/extensions/eppic.patch b/extensions/eppic.patch > >> new file mode 100644 > >> index 0000000..ffac6d7 > >> --- /dev/null > >> +++ b/extensions/eppic.patch > >> @@ -0,0 +1,210 @@ > >> +--- eppic/applications/crash/eppic.c > >> ++++ eppic/applications/crash/eppic.c > >> +@@ -20,6 +20,7 @@ > >> + #include "defs.h" > >> + > >> + #include <eppic_api.h> > >> ++#include "eppic.h" > >> + > >> + /* > >> + * Global data (global_data.c) > >> +@@ -788,6 +789,39 @@ char *sclass_help[]={ > >> + NULL > >> + }; > >> + > >> ++char *eppic_help[]={ > >> ++ "eppic", > >> ++ "Run eppic program(es).", > >> ++ "<fileName1.c>[, <fileName2.c>]", > >> ++ " Oneshot run eppic program(es) which with a main() > >> entry each.", > >> ++ NULL > >> ++}; > >> ++ > >> ++void > >> ++eppic_command(void) > >> ++{ > >> ++ char *buf; > >> ++ optind = 1; > >> ++ > >> ++ if (!args[optind]) { > >> ++ cmd_usage(crash_global_cmd(), SYNOPSIS); > >> ++ return; > >> ++ } > >> ++ > >> ++ while(args[optind]) { > >> ++ buf = eppic_filempath(args[optind]); > >> ++ if (!buf) { > >> ++ eppic_msg("eppic_filempath error on %s\n", > >> args[optind]); > >> ++ return; > >> ++ } > >> ++ eppic_load(buf); > >> ++ if (eppic_findfile(buf, 0)) > >> ++ eppic_unload(buf); > >> ++ eppic_free(buf); > >> ++ optind++; > >> ++ } > >> ++} > >> ++ > >> + #define NCMDS 200 > >> + static struct command_table_entry command_table[NCMDS] = { > >> + > >> +@@ -797,6 +831,7 @@ static struct command_table_entry > >> command_table[NCMDS] = { > >> + {"sdebug", sdebug_cmd, sdebug_help}, > >> + {"sname", sname_cmd, sname_help}, > >> + {"sclass", sclass_cmd, sclass_help}, > >> ++ {"eppic", eppic_command, eppic_help}, > >> + {(char *)0 } > >> + }; > >> + > >> +@@ -885,6 +920,13 @@ char **help=malloc(sizeof *help * 5); > >> + } > >> + } > >> + free(help); > >> ++ > >> ++ if (load && !strcmp(name, "main")) { > >> ++ int optind_save = optind; > >> ++ eppic_cmd(name, NULL, 0); > >> ++ optind = optind_save; > >> ++ } > >> ++ > >> + return; > >> + } > >> + > >> +--- eppic/libeppic/eppic_api.h > >> ++++ eppic/libeppic/eppic_api.h > >> +@@ -16,6 +16,9 @@ > >> + /* minor and major version number > >> + 4.0 switch to new Eppic name and use of fully typed symbols. > >> + */ > >> ++#ifndef EPPIC_API_H > >> ++#define EPPIC_API_H > >> ++ > >> + #define S_MAJOR 5 > >> + #define S_MINOR 0 > >> + > >> +@@ -298,3 +301,5 @@ void eppic_dbg_named(int class, char *name, int > >> level, char *, ...); > >> + > >> + /* parsers debug flags */ > >> + extern int eppicdebug, eppicppdebug; > >> ++ > >> ++#endif > >> +\ No newline at end of file > >> +--- eppic/libeppic/eppic_func.c > >> ++++ eppic/libeppic/eppic_func.c > >> +@@ -22,6 +22,8 @@ > >> + #include <sys/types.h> > >> + #include <time.h> > >> + #include <sys/stat.h> > >> ++#include <fcntl.h> > >> ++#include <unistd.h> > >> + #include "eppic.h" > >> + > >> + /* > >> +@@ -793,6 +795,42 @@ char *ed=getenv("EDITOR"); > >> + if(!system(buf)) eppic_load(fname); > >> + } > >> + > >> ++static const char *example[] = { > >> ++"/* > >> ", > >> ++" * Example: Print all tasks' PID & command > >> ", > >> ++" * > >> ", > >> ++" * // Kernel's global variables and data structures can be used > >> directly without", > >> ++" * // pre-define it in kernel header. If any are within kernel modules, > >> should", > >> ++" * // preload the .ko first via \"mod -S/-s\" cmd in crash before > >> invoke your", > >> ++" * // eppic program. > >> ", > >> ++" * // > >> ", > >> ++" * // Eppic program's syntax is similar to C but with slight > >> differences. ", > >> ++" * // Code samples: > >> ", > >> ++" * // > >> https://github.com/lucchouina/eppic/tree/master/applications/crash/code", > >> ++" * // Available eppic functions: > >> ", > >> ++" * // > >> https://github.com/lucchouina/eppic/blob/master/libeppic/eppic_builtin.c#L316", > >> ++" * > >> ", > >> ++" * int main(void) > >> ", > >> ++" * { > >> ", > >> ++" * struct task_struct *p; > >> ", > >> ++" * unsigned long offset; > >> ", > >> ++" * > >> ", > >> ++" * p = (struct task_struct *)&init_task; > >> ", > >> ++" * offset = (unsigned long)&(p->tasks) - (unsigned long)p; > >> ", > >> ++" * > >> ", > >> ++" * do { > >> ", > >> ++" * printf(\"PID: %d Command: %s\\n\", (int)(p->pid), > >> getstr((char *)&(p->comm[0])));", > >> ++" * p = (struct task_struct *)((unsigned long)(p->tasks.next) - > >> offset);", > >> ++" * } while(p != &init_task); > >> ", > >> ++" * > >> ", > >> ++" * return 0; > >> ", > >> ++" * } > >> ", > >> ++" * > >> ", > >> ++" * crash> eppic program_file.c > >> ", > >> ++" */ > >> ", > >> ++}; > >> ++ > >> ++char *eppic_get_func_file(char *); > >> + /* > >> + This funciton is called to start a vi session on a function > >> + (file=0) or a file (file=1); > >> +@@ -800,24 +838,31 @@ char *ed=getenv("EDITOR"); > >> + void > >> + eppic_vi(char *fname, int file) > >> + { > >> +-int line, freeit=0; > >> ++int line=1, freeit=0, fd; > >> + char *filename; > >> ++char newline = '\n'; > >> + > >> + if(file) { > >> + > >> + filename=eppic_filempath(fname); > >> + > >> + if(!filename) { > >> +- > >> +- eppic_msg("File not found : %s\n", fname); > >> +- return; > >> +- > >> +- } > >> +- > >> +- line=1; > >> +- freeit=1; > >> +- > >> +- > >> ++ fd = creat(fname, 0644); > > > > > > I would suggest using the open(), it is better than creat(). > > > Sure, I will fix those when merge: 1) creat -> open 2) file -> file.orig > > > Other changes are fine, Otherwise: Ack. > > > > Thanks > > Lianbo > > > >> ++ if (fd < 0) { > >> ++ eppic_msg("File not found : %s\n", fname); > >> ++ return; > >> ++ } else { > >> ++ for (int i = 0; i < sizeof(example)/sizeof(char *); i++) { > >> ++ write(fd, example[i], strlen(example[i])); > >> ++ write(fd, &newline, sizeof(newline)); > >> ++ } > >> ++ close(fd); > >> ++ filename = fname; > >> ++ freeit=0; > >> ++ } > >> ++ } else { > >> ++ freeit=1; > >> ++ } > >> + } else { > >> + > >> + func *f=eppic_getfbyname(fname, 0); > >> +@@ -837,6 +882,10 @@ char *filename; > >> + > >> + eppic_exevi(filename, line); > >> + > >> ++ char *fi_name = eppic_get_func_file("main"); > >> ++ if (fi_name) > >> ++ eppic_deletefile(fi_name); > >> ++ > >> + if(freeit) eppic_free(filename); > >> + > >> + } > >> +@@ -1184,3 +1233,10 @@ eppic_runcmd(char *fname, var_t*args) > >> + return 0; > >> + } > >> + > >> ++char *eppic_get_func_file(char *funcname) > >> ++{ > >> ++ func *fn = eppic_getfbyname(funcname, 0); > >> ++ if (!fn) > >> ++ return NULL; > >> ++ return fn->file->fname; > >> ++} > >> -- > >> 2.47.0 > >> -- Crash-utility mailing list -- [email protected] To unsubscribe send an email to [email protected] https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/ Contribution Guidelines: https://github.com/crash-utility/crash/wiki
