summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/getcwd.html52
-rw-r--r--doc/index.html1
-rw-r--r--doc/upgrade.html3
-rw-r--r--package/deps.mak3
-rw-r--r--package/modes1
-rw-r--r--package/targets.mak1
-rw-r--r--src/execline/deps-exe/getcwd1
-rw-r--r--src/execline/getcwd.c24
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&nbsp;! </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]) ;
+}