diff options
-rw-r--r-- | doc/getcwd.html | 52 | ||||
-rw-r--r-- | doc/index.html | 1 | ||||
-rw-r--r-- | doc/upgrade.html | 3 | ||||
-rw-r--r-- | package/deps.mak | 3 | ||||
-rw-r--r-- | package/modes | 1 | ||||
-rw-r--r-- | package/targets.mak | 1 | ||||
-rw-r--r-- | src/execline/deps-exe/getcwd | 1 | ||||
-rw-r--r-- | src/execline/getcwd.c | 24 |
8 files changed, 85 insertions, 1 deletions
diff --git a/doc/getcwd.html b/doc/getcwd.html new file mode 100644 index 0000000..ffd89a8 --- /dev/null +++ b/doc/getcwd.html @@ -0,0 +1,52 @@ +<html> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <meta http-equiv="Content-Language" content="en" /> + <title>execline: the getcwd program</title> + <meta name="Description" content="execline: the getcwd program" /> + <meta name="Keywords" content="execline command getcwd current working directory variable pwd" /> + <!-- <link rel="stylesheet" type="text/css" href="http://skarnet.org/default.css" /> --> + </head> +<body> + +<p> +<a href="index.html">execline</a><br /> +<a href="http://skarnet.org/software/">Software</a><br /> +<a href="http://skarnet.org/">skarnet.org</a> +</p> + +<h1> The <tt>getcwd</tt> program </h1> + +<p> +<tt>getcwd</tt> stores its current working directory +into a given environment variable, +then executes a program. +</p> + +<h2> Interface </h2> + +<pre> + getcwd <em>var</em> <em>prog...</em> +</pre> + +<p> +<tt>getcwd</tt> stores a fully resolved absolute path (i.e. without any +<tt>..</t> or symbolic link components) to its current working directory +into the <em>var</em> variable, then +execs into <em>prog</em> with its arguments. +</p> + +<h2> Notes </h2> + +<ul> + <li> <em>var</em> must be given without a dollar ! </li> + <li> <em>var</em> must not contain <tt>=</tt>. </li> + <li> Unlike the +<a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pwd.html">pwd</a> +POSIX command, <tt>getcwd</tt> does not depend on the PWD environment +variable and will always exhibit the same behaviour. </li> +</ul> + +</body> +</html> diff --git a/doc/index.html b/doc/index.html index 1b61375..a5b5974 100644 --- a/doc/index.html +++ b/doc/index.html @@ -132,6 +132,7 @@ to your installation: the shebang lines for your system might be something like <li><a href="piperw.html">The <tt>piperw</tt> program</a></li> <li><a href="heredoc.html">The <tt>heredoc</tt> program</a></li> <li><a href="wait.html">The <tt>wait</tt> program</a></li> +<li><a href="getcwd.html">The <tt>getpid</tt> program</a></li> <li><a href="getpid.html">The <tt>getpid</tt> program</a></li> <li><a href="exec.html">The <tt>exec</tt> program</a></li> <li><a href="tryexec.html">The <tt>tryexec</tt> program</a></li> diff --git a/doc/upgrade.html b/doc/upgrade.html index 6013a41..0b39ea2 100644 --- a/doc/upgrade.html +++ b/doc/upgrade.html @@ -24,7 +24,8 @@ <li> New <tt>EXECLINE_BLOCK_END_STRING</tt> and <tt>EXECLINE_BLOCK_QUOTE_STRING</tt> macros </li> <li> New command: <a href="withstdinas.html">withstdinas</a>. It's a simplification of <a href="backtick.html">backtick</a>, which is now implemented as a combination of -<a href="pipeline.html">pipeline</a> and <a href="withstdinas.html">withstdinas</a>. </li> +<a href="pipeline.html">pipeline</a> and <a href="withstdinas.html">withstdinas</a>. + <li> Also new command: <a href="getcwd.html">getcwd</a>. </li> </ul> <h2> in 2.1.3.1 </h2> diff --git a/package/deps.mak b/package/deps.mak index d5b5fe9..715a661 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -24,6 +24,7 @@ src/execline/forbacktickx.o src/execline/forbacktickx.lo: src/execline/forbackti src/execline/foreground.o src/execline/foreground.lo: src/execline/foreground.c src/include/execline/execline.h src/execline/forstdin.o src/execline/forstdin.lo: src/execline/forstdin.c src/include/execline/config.h src/include/execline/execline.h src/execline/forx.o src/execline/forx.lo: src/execline/forx.c src/include/execline/config.h src/include/execline/execline.h +src/execline/getcwd.o src/execline/getcwd.lo: src/execline/getcwd.c src/execline/getpid.o src/execline/getpid.lo: src/execline/getpid.c src/execline/heredoc.o src/execline/heredoc.lo: src/execline/heredoc.c src/execline/homeof.o src/execline/homeof.lo: src/execline/homeof.c @@ -115,6 +116,8 @@ forstdin: private EXTRA_LIBS := forstdin: src/execline/forstdin.o ${LIBEXECLINE} -lskarnet forx: private EXTRA_LIBS := forx: src/execline/forx.o ${LIBEXECLINE} -lskarnet +getcwd: private EXTRA_LIBS := +getcwd: src/execline/getcwd.o -lskarnet getpid: private EXTRA_LIBS := getpid: src/execline/getpid.o -lskarnet heredoc: private EXTRA_LIBS := diff --git a/package/modes b/package/modes index 29a5813..adf455e 100644 --- a/package/modes +++ b/package/modes @@ -22,6 +22,7 @@ forbacktickx 0755 foreground 0755 forstdin 0755 forx 0755 +getcwd 0755 getpid 0755 heredoc 0755 homeof 0755 diff --git a/package/targets.mak b/package/targets.mak index 09ad2f1..ca8275d 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -21,6 +21,7 @@ forbacktickx \ foreground \ forstdin \ forx \ +getcwd \ getpid \ heredoc \ homeof \ diff --git a/src/execline/deps-exe/getcwd b/src/execline/deps-exe/getcwd new file mode 100644 index 0000000..e7187fe --- /dev/null +++ b/src/execline/deps-exe/getcwd @@ -0,0 +1 @@ +-lskarnet diff --git a/src/execline/getcwd.c b/src/execline/getcwd.c new file mode 100644 index 0000000..116acab --- /dev/null +++ b/src/execline/getcwd.c @@ -0,0 +1,24 @@ +/* ISC license. */ + +#include <skalibs/bytestr.h> +#include <skalibs/strerr2.h> +#include <skalibs/env.h> +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +#define USAGE "getcwd variable prog..." + +int main (int argc, char const *const *argv, char const *const *envp) +{ + stralloc sa = STRALLOC_ZERO ; + PROG = "getcwd" ; + if (argc < 3) strerr_dieusage(100, USAGE) ; + if (argv[1][str_chr(argv[1], '=')]) + strerr_dief2x(100, "invalid variable name: ", argv[1]) ; + if (!stralloc_cats(&sa, argv[1]) || !stralloc_catb(&sa, "=", 1)) + strerr_diefu1sys(111, "stralloc_catb") ; + if (sagetcwd(&sa) < 0) strerr_diefu1sys(111, "getcwd") ; + if (!stralloc_0(&sa)) strerr_diefu1sys(111, "stralloc_catb") ; + pathexec_r(argv + 2, envp, env_len(envp), sa.s, sa.len) ; + strerr_dieexec(111, argv[2]) ; +} |