Hi Luc,

Thanks for your comments!

On Thu, Nov 13, 2025 at 4:33 AM Luc Park-Chouinard <[email protected]> wrote:
>
> Hi Tao, Lianbo,
>
> eppic.c is the glue between a release cycle for crash and ongoing changes to 
> eppic v5.0. That file is yours and you can commit to it freely.
> I can grant commit access to you guys to remove the delays due to TZ or 
> availability.

Thanks for that, please add me in, my github account is liutgnu.
>
> One could even ask the question - if eppic.c should just be on the crash repo 
> side. But I still believe there is benefit to have it be part of eppic to 
> reduce backward/forward comp issues.
>
> I like the proposed crash-dev changes. Never realized dlopen(NULL) was for 
> /proc/self... Cool.
> The more flexibility in what we can do, the better.

OK, good to know your thoughts! Then I will delete the empty
eppic.patch file in the crash repo side. And I will do the new feature
testing/developing in my eppic forked repo first. Once it is ready to
go, I will push it to your upstream eppic repo.

Thanks again for your help on this!

Thanks,
Tao Liu

>
>
>
> On Tue, Nov 11, 2025 at 8:43 PM Tao Liu <[email protected]> wrote:
>>
>> On Wed, Nov 12, 2025 at 3:50 PM lijiang <[email protected]> wrote:
>> >
>> > On Wed, Nov 12, 2025 at 9:38 AM Tao Liu <[email protected]> wrote:
>> >>
>> >> Hi Lianbo,
>> >>
>> >> On Tue, Nov 11, 2025 at 4:30 PM lijiang <[email protected]> wrote:
>> >> >
>> >> > On Mon, Nov 10, 2025 at 8:01 AM 
>> >> > <[email protected]> wrote:
>> >> >>
>> >> >> Date: Mon, 10 Nov 2025 12:59:34 +1300
>> >> >> From: Tao Liu <[email protected]>
>> >> >> Subject: [Crash-utility] [PATCH] eppic.patch: Empty the customized
>> >> >>         functions and move to eppic
>> >> >> To: [email protected]
>> >> >> Cc: Tao Liu <[email protected]>
>> >> >> Message-ID: <[email protected]>
>> >> >> Content-Type: text/plain; charset="US-ASCII"; x-default=true
>> >> >>
>> >> >> The customized functions will be moved to eppic side[1]. Let's keep
>> >> >> an empty eppic.patch here for future use.
>> >> >
>> >> >
>> >> > Do you mean to still keep the changes in the extensions/eppic.mk?
>> >> > I would tend to make a cleanup, if this has already been moved to 
>> >> > upstream Eppic git repo. The code looks more friendly.
>> >> >
>> >> Actually I'd like to keep changes for extensions/eppic.mk and the
>> >> empty eppic.patch. Because there will be further improvements to
>> >> eppic, like the ones in my crash-dev repo of the aggressive
>> >> improvements. I'm unsure if eppic maintainers like it. If I will put
>> >
>> >
>> > Given that, I would suggest discussing with eppic maintainers to see if 
>> > your improvement is needed in the eppic project, and then
>> > we can decide whether to keep it. What do you think?
>>
>> Sure, cc to lucchouina.
>>
>> Hi @lucchouina,
>>
>> For functions like calling crash functions within eppic script, I have
>> made a POC in [1], currently it is not well tested and not mature.
>> What do you think of it, do you prefer to keep it, once it is mature
>> and good to go, in the eppic repo side; or to leave it within the
>> eppic.patch of crash repo side?
>>
>> If we leave it to stay with the eppic repo side, then for crash the
>> empty eppic.patch file is no longer needed and is ready to be deleted.
>>
>> [1]: 
>> https://github.com/liutgnu/crash-dev/blob/eppic/extensions/eppic.patch#L135
>>
>> Thanks,
>> Tao Liu
>>
>>
>>
>> >
>> > Lianbo
>> >
>> >> those improvements in crash, code changes in extensions/eppic.mk and
>> >> eppic.patch are still needed.
>> >>
>> >> Thanks,
>> >> Tao Liu
>> >>
>> >> > Thanks
>> >> > Lianbo
>> >> >
>> >> >>
>> >> >>
>> >> >> [1]: https://github.com/lucchouina/eppic/pull/30
>> >> >>
>> >> >> Signed-off-by: Tao Liu <[email protected]>
>> >> >> ---
>> >> >>  extensions/eppic.patch | 210 -----------------------------------------
>> >> >>  1 file changed, 210 deletions(-)
>> >> >>
>> >> >> diff --git a/extensions/eppic.patch b/extensions/eppic.patch
>> >> >> index 6a08b09..e69de29 100644
>> >> >> --- a/extensions/eppic.patch
>> >> >> +++ b/extensions/eppic.patch
>> >> >> @@ -1,210 +0,0 @@
>> >> >> ---- eppic/applications/crash/eppic.c.orig
>> >> >> -+++ 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.orig
>> >> >> -+++ 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.orig
>> >> >> -+++ 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 = open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0644);
>> >> >> -+          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
>> >>
>>
>
>
> --
>
>      - Luc
--
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

Reply via email to