about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/index.html3
-rw-r--r--doc/s6-dumpenv.html55
-rw-r--r--doc/upgrade.html6
-rw-r--r--package/deps.mak3
-rw-r--r--package/info2
-rw-r--r--package/modes1
-rw-r--r--package/targets.mak1
-rw-r--r--src/skaembutils/deps-exe/s6-dumpenv1
-rw-r--r--src/skaembutils/s6-dumpenv.c63
9 files changed, 133 insertions, 2 deletions
diff --git a/doc/index.html b/doc/index.html
index 95b4372..6f18572 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -76,7 +76,7 @@ library. </li>
 
 <ul>
  <li> The current released version of s6-portable-utils is
-<a href="s6-portable-utils-2.0.2.0.tar.gz">2.0.2.0</a>. </li>
+<a href="s6-portable-utils-2.0.3.0.tar.gz">2.0.3.0</a>. </li>
  <li> Alternatively, you can checkout a copy of the s6-portable-utils git repository:
 <pre> git clone git://git.skarnet.org/s6-portable-utils </pre> </li>
 </ul>
@@ -113,6 +113,7 @@ the previous versions of s6-portable-utils and the current one. </li>
  <li> The <a href="s6-clock.html"><tt>s6-clock</tt></a> program </li>
  <li> The <a href="s6-cut.html"><tt>s6-cut</tt></a> program </li>
  <li> The <a href="s6-dirname.html"><tt>s6-dirname</tt></a> program </li>
+ <li> The <a href="s6-dumpenv.html"><tt>s6-dumpenv</tt></a> program </li>
  <li> The <a href="s6-echo.html"><tt>s6-echo</tt></a> program </li>
  <li> The <a href="s6-env.html"><tt>s6-env</tt></a> program </li>
  <li> The <a href="s6-expr.html"><tt>s6-expr</tt></a> program </li>
diff --git a/doc/s6-dumpenv.html b/doc/s6-dumpenv.html
new file mode 100644
index 0000000..7de65ae
--- /dev/null
+++ b/doc/s6-dumpenv.html
@@ -0,0 +1,55 @@
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <meta http-equiv="Content-Language" content="en" />
+    <title>s6-portable-utils: the s6-dumpenv program</title>
+    <meta name="Description" content="s6-portable-utils: the s6-dumpenv program" />
+    <meta name="Keywords" content="s6-portable-utils command s6-dumpenv environment variables" />
+    <!-- <link rel="stylesheet" type="text/css" href="http://skarnet.org/default.css" /> -->
+  </head>
+<body>
+
+<p>
+<a href="index.html">s6-portable-utils</a><br />
+<a href="http://skarnet.org/software/">Software</a><br />
+<a href="http://skarnet.org/">skarnet.org</a>
+</p>
+
+<h1> The <tt>s6-dumpenv</tt> program </h1>
+
+<p>
+ s6-dumpenv stores its environment variables into a directory.
+</p>
+
+<h2> Interface </h2>
+
+<pre>
+     s6-dumpenv [ -m <em>mode</em> ] <em>dir</em>
+</pre>
+
+<ul>
+ <li> s6-dumpenv creates the directory <em>dir</em> if it does not exist
+yet. </li>
+ <li> For every environment variable <em>x</em> with value <em>y</em>
+that it has, it creates a file <em>dir</em>/<em>x</em> containing
+<em>y</em>. </li>
+ <li> It then exits 0. </li>
+</ul>
+
+<h2> Options </h2>
+
+<ul>
+ <li> <tt>-m</tt>&nbsp;<em>mode</em>&nbsp;: create <em>dir</em> with
+mode <em>mode</em> if it doesn't exist yet. Default is 0755. </li>
+</ul>
+
+<h2> Notes </h2>
+
+<ul>
+ <li> A program <em>prog</em> can be run with the environment in dir
+by using <tt><a href="http://skarnet.org/software/s6/s6-envdir.html">s6-envdir</a>
+-fn -- <em>dir</em> <em>prog</em></tt>. </li>
+</ul>
+
+</body>
+</html>
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 26bb1a8..1b5cdbb 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -17,6 +17,12 @@
 
 <h1> What has changed in s6-portable-utils </h1>
 
+<h2> in 2.0.3.0 </h2>
+
+<ul>
+ <li> New command: <a href="s6-dumpenv.html">s6-dumpenv</a>. </li>
+</ul>
+
 <h2> in 2.0.2.0 </h2>
 
 <ul>
diff --git a/package/deps.mak b/package/deps.mak
index 8ea0be0..d5b641d 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -9,6 +9,7 @@ src/skaembutils/s6-chown.o src/skaembutils/s6-chown.lo: src/skaembutils/s6-chown
 src/skaembutils/s6-clock.o src/skaembutils/s6-clock.lo: src/skaembutils/s6-clock.c
 src/skaembutils/s6-cut.o src/skaembutils/s6-cut.lo: src/skaembutils/s6-cut.c
 src/skaembutils/s6-dirname.o src/skaembutils/s6-dirname.lo: src/skaembutils/s6-dirname.c
+src/skaembutils/s6-dumpenv.o src/skaembutils/s6-dumpenv.lo: src/skaembutils/s6-dumpenv.c
 src/skaembutils/s6-echo.o src/skaembutils/s6-echo.lo: src/skaembutils/s6-echo.c
 src/skaembutils/s6-env.o src/skaembutils/s6-env.lo: src/skaembutils/s6-env.c src/include/s6-portable-utils/config.h
 src/skaembutils/s6-expr.o src/skaembutils/s6-expr.lo: src/skaembutils/s6-expr.c
@@ -58,6 +59,8 @@ s6-cut: private EXTRA_LIBS :=
 s6-cut: src/skaembutils/s6-cut.o -lskarnet
 s6-dirname: private EXTRA_LIBS :=
 s6-dirname: src/skaembutils/s6-dirname.o -lskarnet
+s6-dumpenv: private EXTRA_LIBS :=
+s6-dumpenv: src/skaembutils/s6-dumpenv.o -lskarnet
 s6-echo: private EXTRA_LIBS :=
 s6-echo: src/skaembutils/s6-echo.o -lskarnet
 s6-env: private EXTRA_LIBS :=
diff --git a/package/info b/package/info
index 150bf47..5eb0354 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
 package=s6-portable-utils
-version=2.0.2.0
+version=2.0.3.0
 category=admin
 package_macro_name=S6_PORTABLE_UTILS
diff --git a/package/modes b/package/modes
index 2704081..325eb60 100644
--- a/package/modes
+++ b/package/modes
@@ -5,6 +5,7 @@ s6-chown		0755
 s6-clock		0755
 s6-cut			0755
 s6-dirname		0755
+s6-dumpenv		0755
 s6-echo			0755
 s6-env			0755
 s6-expr			0755
diff --git a/package/targets.mak b/package/targets.mak
index ffdd6f0..f7b3869 100644
--- a/package/targets.mak
+++ b/package/targets.mak
@@ -6,6 +6,7 @@ s6-chown \
 s6-clock \
 s6-cut \
 s6-dirname \
+s6-dumpenv \
 s6-echo \
 s6-env \
 s6-expr \
diff --git a/src/skaembutils/deps-exe/s6-dumpenv b/src/skaembutils/deps-exe/s6-dumpenv
new file mode 100644
index 0000000..e7187fe
--- /dev/null
+++ b/src/skaembutils/deps-exe/s6-dumpenv
@@ -0,0 +1 @@
+-lskarnet
diff --git a/src/skaembutils/s6-dumpenv.c b/src/skaembutils/s6-dumpenv.c
new file mode 100644
index 0000000..4bed6c8
--- /dev/null
+++ b/src/skaembutils/s6-dumpenv.c
@@ -0,0 +1,63 @@
+/* ISC license. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <skalibs/uint.h>
+#include <skalibs/bytestr.h>
+#include <skalibs/sgetopt.h>
+#include <skalibs/strerr2.h>
+#include <skalibs/djbunix.h>
+
+#define USAGE "s6-dumpenv [ -m mode ] envdir"
+#define dieusage() strerr_dieusage(100, USAGE)
+
+int main (int argc, char const *const *argv, char const *const *envp)
+{
+  mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH ;
+  unsigned int dirlen ;
+
+  PROG = "s6-printenv" ;
+  {
+    subgetopt_t l = SUBGETOPT_ZERO ;
+    for (;;)
+    {
+      register int opt = subgetopt_r(argc, argv, "m:", &l) ;
+      if (opt == -1) break ;
+      switch (opt)
+      {
+        case 'm' : if (!uint0_oscan(l.arg, &mode)) dieusage() ; break ;
+        default : dieusage() ;
+      }
+    }
+    argc -= l.ind ; argv += l.ind ;
+  }
+  if (!argc) dieusage() ;
+
+  if (mkdir(argv[0], mode) < 0)
+  {
+    struct stat st ;
+    if (errno != EEXIST) strerr_diefu2sys(111, "mkdir ", argv[0]) ;
+    if (stat(argv[0], &st) < 0)
+      strerr_diefu2sys(111, "stat ", argv[0]) ;
+    if (!S_ISDIR(st.st_mode))
+    {
+      errno = ENOTDIR ;
+      strerr_diefu2sys(111, "mkdir ", argv[0]) ;
+    }
+  }
+  dirlen = str_len(argv[0]) ;
+    
+  for (; *envp ; envp++)
+  {
+    unsigned int varlen = str_chr(*envp, '=') ;
+    char fn[dirlen + varlen + 2] ;
+    byte_copy(fn, dirlen, argv[0]) ;
+    fn[dirlen] = '/' ;
+    byte_copy(fn + dirlen + 1, varlen, *envp) ;
+    fn[dirlen + 1 + varlen] = 0 ;
+    if (!openwritenclose_suffix(fn, *envp + varlen + 1, str_len(*envp + varlen + 1), "=.tmp"))
+      strerr_diefu2sys(111, "open ", fn) ;
+  }
+  return 0 ;
+}