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