lib: util: Add file_ploadv().
authorJeremy Allison <jra@samba.org>
Fri, 17 May 2019 04:56:13 +0000 (21:56 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 24 May 2019 19:00:05 +0000 (19:00 +0000)
Not yet used.

Duplicate code to file_pload() except uses vectored
argument list. file_pload() will be removed once all
callers are converted.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13964

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
lib/util/samba_util.h
lib/util/util_file.c

index 0722426216e358efee14dcb91ea7d536f985167f..cf8602e2015934010634e0778cd42b040733ab4b 100644 (file)
@@ -405,6 +405,7 @@ bool file_compare(const char *path1, const char *path2);
   load from a pipe into memory.
  */
 char *file_pload(const char *syscmd, size_t *size);
+char *file_ploadv(char * const argl[], size_t *size);
 
 /* The following definitions come from lib/util/util.c  */
 
index 7a8644e3f5d8ad8ab1683e72a3561bbebb1f253b..1541a08f93590c4b2a9b3d2f6802bfbaa7512c98 100644 (file)
@@ -443,3 +443,49 @@ char *file_pload(const char *syscmd, size_t *size)
 
        return p;
 }
+
+/**
+ Load from a pipe into memory.
+**/
+char *file_ploadv(char * const argl[], size_t *size)
+{
+       int fd, n;
+       char *p = NULL;
+       char buf[1024];
+       size_t total;
+
+       fd = sys_popenv(argl);
+       if (fd == -1) {
+               return NULL;
+       }
+
+       total = 0;
+
+       while ((n = sys_read(fd, buf, sizeof(buf))) > 0) {
+               p = talloc_realloc(NULL, p, char, total + n + 1);
+               if (p == NULL) {
+                       DBG_ERR("failed to expand buffer!\n");
+                       close(fd);
+                       return NULL;
+               }
+               memcpy(p+total, buf, n);
+               total += n;
+       }
+
+       if (p != NULL) {
+               p[total] = 0;
+       }
+
+       /*
+        * FIXME: Perhaps ought to check that the command completed
+        * successfully (returned 0); if not the data may be
+        * truncated.
+        */
+       sys_pclose(fd);
+
+       if (size) {
+               *size = total;
+       }
+
+       return p;
+}