coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Invoke a Coreutils routine from another 'main' program


From: Assaf Gordon
Subject: Re: Invoke a Coreutils routine from another 'main' program
Date: Mon, 20 Jul 2015 11:19:55 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

Hello,

On 07/20/2015 10:34 AM, Zhoulai wrote:
I am trying to invoke a coreutils function, say 'echo' from a C program. But 
because coreutils are made of 'main' function themselves, so I cannot write a 
program like

int main(int argc, char ** argv){
   //echo.main(argc,argv);
}

because it is not allowed to have two 'main' functions. Is there a workaround to invoke 
Coreutils via another "main" program? Thanks.

A recent feature by Alex Deymo allows for something very similar to what you 
need:
http://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=71e2ea773414b2316bbe6b803b9a52c38d3752e8

Try:
     ./configure --enable-single-binary
     make clean ; make

The main program is now 'src/coreutils.c', and it calls the 'main()' of each 
program based on the given parameters.
The compilation 'trick' is based on using a preprocessing flag the renames the 
'main' function to something else:

For example, compiling 'ls.c' is done with:
   gcc [....] \
    -Dmain=single_binary_main_ls (int, char **);  int single_binary_main_ls"  \
    -Dusage=_usage_ls [...] src/ls.c

Which causes the 'main' to be compiled and linked as 'single_binary_main_ls'.

I'd recommend trying the above, and studying 'src/coreutils.c' as a starting 
point (search for 'launch_program' function).

However, it's important to remember that coreutils' programs as not designed to 
be
incorporated into bigger programs. One issue is that all the programs terminate
on any errors - if there was an error in the parameters (or during runtime),
the called function  (e.g. your "echo.main()") will not return to your 'main' 
with an error code - it will terminate your program.

Alternatively,
since coreutils is GPL'd, it might be simpler to just reuse to code in your 
project instead of trying to force the programs to work the way you want 
(assuming your project is also GPL'd).

regards,
 - assaf



reply via email to

[Prev in Thread] Current Thread [Next in Thread]