about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2015-09-21 10:49:07 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2015-09-21 10:49:07 +0000
commita08f7a62968c167e84bf012cb24dd8a187ae639f (patch)
treeabb362430ea28ac08310cb02e8d6c27a6da21814
parentd0996a25bd4030875fbc98cabea815dd6741dd0d (diff)
downloadexecline-a08f7a62968c167e84bf012cb24dd8a187ae639f.tar.gz
execline-a08f7a62968c167e84bf012cb24dd8a187ae639f.tar.xz
execline-a08f7a62968c167e84bf012cb24dd8a187ae639f.zip
Add the getcwd program
-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]) ;
+}