Skip to content
Snippets Groups Projects
Commit 99d44f1b authored by Eric Vidal's avatar Eric Vidal :speech_balloon:
Browse files

pass to oblibs library

parent c171c622
No related branches found
No related tags found
No related merge requests found
...@@ -25,11 +25,11 @@ ...@@ -25,11 +25,11 @@
<h2> Interface </h2> <h2> Interface </h2>
<pre> <pre>
execl-envfile [ -h ] [ -f <em>file</em> ] [ -l ] <em>dir</em> <em>prog</em> execl-envfile [ -h ] [ -l ] <em>src</em> <em>prog</em>
</pre> </pre>
<p> <p>
This tool expects to find a regular file(s) in <em>dir</em> containing one or multiple <tt>key=value</tt> pair. For each files found: it will parse the file, import the <tt>key=value</tt> then execs <em>prog</em> with the modified environment. This tool expects to find a regular file(s) or directory as <em>src</em> containing one or multiple <tt>key=value</tt> pair. For each files found: it will parse the file, import the <tt>key=value</tt> then execs <em>prog</em> with the modified environment.
</p> </p>
<ul> <ul>
<li>It opens and reads the file.</li> <li>It opens and reads the file.</li>
...@@ -39,21 +39,22 @@ ...@@ -39,21 +39,22 @@
<li>It unexports the variable if requested.</li> <li>It unexports the variable if requested.</li>
<li>It execs <em>prog</em> with the modified environment.</li> <li>It execs <em>prog</em> with the modified environment.</li>
</ul> </ul>
<p>In case as <em>src</em> is a directory, the same processus is made for each files found in <em>src</em>. <em>src</em> can be absolute or relative path. In case of relative path only <tt>'../'</tt>,<tt>'./'</tt>, <tt>'.'</tt> or <tt>'..'</tt> are accepted as valid format.</p>
<h2> Options </h2> <h2> Options </h2>
<ul> <ul>
<li> <tt>-h&nbsp;</tt>&nbsp;: prints this help. </li> <li> <tt>-h&nbsp;</tt>&nbsp;: prints this help. </li>
<li> <li>
<tt>-f&nbsp;<em>file</em>&nbsp;</tt>&nbsp;: only parses the <em>file</em> found in <em>dir</em>. <tt>-f&nbsp;<em>file</em>&nbsp;</tt>&nbsp;: only parses the <em>file</em> found in <em>src</em>.<strong>deprecated</strong>
</li> </li>
<li> <li>
<tt>-l&nbsp;</tt>&nbsp;: loose. does nothing and executes <em>prog</em> directly if <em>dir</em> does not contain any regular file(s) or <em>dir</em> doesn't exist. <tt>-l&nbsp;</tt>&nbsp;: loose. does nothing and executes <em>prog</em> directly if <em>src</em> does not contain any regular file(s) or <em>src</em> doesn't exist.
</li> </li>
</ul> </ul>
<h2> File syntax </h2> <h2> <em>File</em> syntax </h2>
<p><em>file</em> is a text file containing lines of the form <tt>key = value</tt>. Whitespace is permitted before and after <em>key</em>, and before or after <em>value</em>, <p><em>file</em> is a text file containing lines of the form <tt>key=value</tt>. Whitespace is permitted before and after <em>key</em>, and before or after <em>value</em>,
Quoting is also possible. In this case, the quoting field is treated as one word. Quoting is also possible. In this case, the quoting field is treated as one word.
</p> </p>
<p>Empty lines, or lines containing only whitespace, are ignored. Lines beginning with <tt>#</tt> (possibly after some whitespace) are ignored (and typically used for comments). Comments are <strong>not</strong> possible at the end of lines: <p>Empty lines, or lines containing only whitespace, are ignored. Lines beginning with <tt>#</tt> (possibly after some whitespace) are ignored (and typically used for comments). Comments are <strong>not</strong> possible at the end of lines:
...@@ -61,11 +62,13 @@ ...@@ -61,11 +62,13 @@
</p> </p>
<p>Empty <em>value</em> is <strong>not</strong> permitted.</p> <p>Empty <em>value</em> is <strong>not</strong> permitted.</p>
<p>If <tt>key</tt> begin by a <tt>'!'</tt> character: <tt>!key=value</tt> the <tt>key</tt> will be removed from the environment after the substitution.</p> <p>If <tt>key</tt> begin by a <tt>'!'</tt> character: <tt>!key=value</tt> the <tt>key</tt> will be removed from the environment after the substitution.</p>
<p>If the same <tt>key=value</tt> pair is found multiple time, only the first one definition is keepts.</p>
<p>It must be terminated by an <strong>empty new line</strong>.</p>
<h2> Example of use </h2> <h2> Example of use </h2>
<pre> <pre>
#!/usr/bin/execlineb -P #!/usr/bin/execlineb -P
fdmove -c 2 1 fdmove -c 2 1
execl-envfile -f ntpd /etc/66/conf/ execl-envfile /etc/66/conf/ntpd
foreground { mkdir -p -m 0755 ${RUNDIR} } foreground { mkdir -p -m 0755 ${RUNDIR} }
execl-cmdline -s { ntpd ${CMD_ARGS} } execl-cmdline -s { ntpd ${CMD_ARGS} }
</pre> </pre>
...@@ -82,6 +85,6 @@ ...@@ -82,6 +85,6 @@
</pre> </pre>
<p>where <tt>/etc/66/conf</tt> directory contains two named files <tt>RUNDIR</tt> and <tt>CMD_ARGS</tt> written with <tt>/run/openntpd</tt> and <tt>-d -s</tt> respectively.</p> <p>where <tt>/etc/66/conf</tt> directory contains two named files <tt>RUNDIR</tt> and <tt>CMD_ARGS</tt> written with <tt>/run/openntpd</tt> and <tt>-d -s</tt> respectively.</p>
<h2> limits</h2> <h2> limits</h2>
<p><em>dir</em> cannot exceed more than 100 files. Each file cannot contain more than 4095 bytes or more than 50 <em>key=value</em> pairs.</p> <p><em>src</em> cannot exceed more than 100 files. Each file cannot contain more than 4095 bytes or more than 50 <em>key=value</em> pairs.</p>
</body> </body>
</html> </html>
...@@ -15,10 +15,12 @@ ...@@ -15,10 +15,12 @@
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include <stdio.h>
#include <oblibs/string.h> #include <oblibs/string.h>
#include <oblibs/stralist.h> #include <oblibs/stralist.h>
#include <oblibs/error2.h> #include <oblibs/error2.h>
#include <oblibs/types.h>
#include <oblibs/obgetopt.h> #include <oblibs/obgetopt.h>
#include <oblibs/directory.h> #include <oblibs/directory.h>
#include <oblibs/files.h> #include <oblibs/files.h>
...@@ -37,20 +39,19 @@ ...@@ -37,20 +39,19 @@
#include <66/parser.h> #include <66/parser.h>
#include <66/environ.h> #include <66/environ.h>
unsigned int VERBOSITY = 1 ;
static stralloc SAENV = STRALLOC_ZERO ; static stralloc SAENV = STRALLOC_ZERO ;
static genalloc GAENV = GENALLOC_ZERO ; //diuint32, pos in senv static genalloc GAENV = GENALLOC_ZERO ; //diuint32, pos in senv
#define USAGE "execl-envfile [ -h help ] [ -f file ] [ -l ] dir prog" #define USAGE "execl-envfile [ -h help ] [ -l ] src prog"
static inline void info_help (void) static inline void info_help (void)
{ {
static char const *help = static char const *help =
"execl-envfile <options> dir prog\n" "execl-envfile <options> src prog\n"
"\n" "\n"
"options :\n" "options :\n"
" -h: print this help\n" " -h: print this help\n"
" -f: file to parse\n" " -f: file to parse(deprecated)\n"
" -l: loose\n" " -l: loose\n"
; ;
...@@ -58,14 +59,24 @@ static inline void info_help (void) ...@@ -58,14 +59,24 @@ static inline void info_help (void)
strerr_diefu1sys(111, "write to stdout") ; strerr_diefu1sys(111, "write to stdout") ;
} }
int loop_stra(stralloc *sa,char const *search)
{
size_t i = 0, len = sa->len ;
for (;i < len; i += strlen(sa->s + i) + 1)
if (!strcmp(sa->s+i,search)) return 1 ;
return 0 ;
}
int main (int argc, char const *const *argv, char const *const *envp) int main (int argc, char const *const *argv, char const *const *envp)
{ {
int r, i, one, unexport ; int r, i, unexport ;
int insist = 1 ; int insist = 1 ;
size_t pathlen ;
char const *path = 0 ; char const *path = 0 ;
char const *file = 0 ; char const *file = 0 ;
char tpath[MAXENV + 1] ;
char tfile[MAXENV+1] ;
stralloc src = STRALLOC_ZERO ; stralloc src = STRALLOC_ZERO ;
stralloc modifs = STRALLOC_ZERO ; stralloc modifs = STRALLOC_ZERO ;
stralloc dst = STRALLOC_ZERO ; stralloc dst = STRALLOC_ZERO ;
...@@ -73,7 +84,7 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -73,7 +84,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
exlsn_t info = EXLSN_ZERO ; exlsn_t info = EXLSN_ZERO ;
r = i = one = unexport = 0 ; r = i = unexport = 0 ;
insist = 1 ; insist = 1 ;
PROG = "execl-envfile" ; PROG = "execl-envfile" ;
...@@ -88,7 +99,7 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -88,7 +99,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
switch (opt) switch (opt)
{ {
case 'h' : info_help(); return 0 ; case 'h' : info_help(); return 0 ;
case 'f' : file = l.arg ; one = 1 ; break ; case 'f' : file = l.arg ; break ;
case 'l' : insist = 0 ; break ; case 'l' : insist = 0 ; break ;
default : exitusage(USAGE) ; default : exitusage(USAGE) ;
} }
...@@ -101,7 +112,44 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -101,7 +112,44 @@ int main (int argc, char const *const *argv, char const *const *envp)
path = *argv ; path = *argv ;
argv++; argv++;
argc--; argc--;
if (path[0] != '/') strerr_dief3x(111,"directory: ",path," must be an absolute path") ;
/** Mark -f as deprecated */
if (file)
{
strerr_warnw1x("-f options is deprecated") ;
if (path[0] != '/') strerr_dief3x(111,"path of: ",path,": must be absolute") ;
}
else
{
r = scan_mode(path,S_IFREG) ;
if (!r) strerr_diefu2sys(111,"find: ",path) ;
if (r < 0)
{
r = scan_mode(path,S_IFDIR) ;
if (!r) strerr_diefu2sys(111,"find: ",path) ;
if (r < 0) strerr_dief2x(111,"invalid format of: ", path) ;
if (path[0] == '.')
{
if (!dir_beabsolute(tpath,path))
strerr_diefu2sys(111,"find absolute path of: ",path) ;
}
else if (path[0] != '/') strerr_dief3x(111,"path of: ",path,": must be absolute") ;
else
{
pathlen = strlen(path) ;
memcpy(tpath,path,pathlen);
tpath[pathlen] = 0 ;
}
path = tpath ;
}
else
{
if (!basename(tfile,path)) strerr_diefu2x(111,"get file name of: ",path) ;
file = tfile ;
if (!dirname(tpath,path)) strerr_diefu2x(111,"get parent path of: ",path) ;
path = tpath ;
}
}
r = dir_get(&toparse,path,"",S_IFREG) ; r = dir_get(&toparse,path,"",S_IFREG) ;
if (!r && insist) strerr_diefu2sys(111,"get file from: ",path) ; if (!r && insist) strerr_diefu2sys(111,"get file from: ",path) ;
...@@ -110,7 +158,7 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -110,7 +158,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
xpathexec_run(argv[0],argv,envp) ; xpathexec_run(argv[0],argv,envp) ;
} }
if (one) if (file)
{ {
r = stra_findidx(&toparse,file) ; r = stra_findidx(&toparse,file) ;
if (r < 0) if (r < 0)
...@@ -130,10 +178,12 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -130,10 +178,12 @@ int main (int argc, char const *const *argv, char const *const *envp)
for (i = 0 ; i < genalloc_len(stralist,&toparse) ; i++) for (i = 0 ; i < genalloc_len(stralist,&toparse) ; i++)
{ {
src.len = 0 ; src.len = 0 ;
size_t n = i + MAXVAR ;
if (i > MAXFILE) strerr_dief2x(111,"to many file to parse in: ",path) ; if (i > MAXFILE) strerr_dief2x(111,"to many file to parse in: ",path) ;
if (!file_readputsa(&src,path,gaistr(&toparse,i))) strerr_diefu4sys(111,"read file: ",path,"/",gaistr(&toparse,i)) ; if (!file_readputsa(&src,path,gaistr(&toparse,i))) strerr_diefu4sys(111,"read file: ",path,"/",gaistr(&toparse,i)) ;
if (!env_parsenclean(&modifs,&src)) strerr_diefu4x(111,"parse and clean environment of: ",path,"/",gaistr(&toparse,i)) ; if (!env_parsenclean(&modifs,&src)) strerr_diefu4x(111,"parse and clean environment of: ",path,"/",gaistr(&toparse,i)) ;
if (!env_split(&GAENV,&SAENV,&src)) strerr_diefu4x(111,"split environment of: ",path,"/",gaistr(&toparse,i)) ; if (!env_split(&GAENV,&SAENV,&src)) strerr_diefu4x(111,"split environment of: ",path,"/",gaistr(&toparse,i)) ;
if (genalloc_len(stralist,&toparse) > n) strerr_dief4x(111,"to many variables in file: ",path,"/",gaistr(&toparse,i)) ;
} }
} }
genalloc_deepfree(stralist,&toparse,stra_free) ; genalloc_deepfree(stralist,&toparse,stra_free) ;
...@@ -151,7 +201,6 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -151,7 +201,6 @@ int main (int argc, char const *const *argv, char const *const *envp)
for (i = 0 ; i < genalloc_len(diuint32,&GAENV) ; i++) for (i = 0 ; i < genalloc_len(diuint32,&GAENV) ; i++)
{ {
if (i > MAXVAR) strerr_dief1x(111,"to many variables") ;
unexport = 0 ; unexport = 0 ;
int key = genalloc_s(diuint32,&GAENV)[i].left ; int key = genalloc_s(diuint32,&GAENV)[i].left ;
int val = genalloc_s(diuint32,&GAENV)[i].right ; int val = genalloc_s(diuint32,&GAENV)[i].right ;
...@@ -160,7 +209,9 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -160,7 +209,9 @@ int main (int argc, char const *const *argv, char const *const *envp)
key++ ; key++ ;
unexport = 1 ; unexport = 1 ;
} }
if (!env_substitute(SAENV.s + key,SAENV.s + val,&info,newenv,unexport)) strerr_diefu4x(111,"substitute value of: ",SAENV.s + key," by: ",SAENV.s + val) ; if(!loop_stra(&info.vars,SAENV.s + key))
if (!env_substitute(SAENV.s + key,SAENV.s + val,&info,newenv,unexport))
strerr_diefu4x(111,"substitute value of: ",SAENV.s + key," by: ",SAENV.s + val) ;
} }
genalloc_free(diuint32,&GAENV) ; genalloc_free(diuint32,&GAENV) ;
stralloc_free(&SAENV) ; stralloc_free(&SAENV) ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment