Revert "Remove duplicate lib/util_file.c (provided by common code already)"
authorAndrew Bartlett <abartlet@samba.org>
Tue, 24 Mar 2009 00:23:10 +0000 (11:23 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 24 Mar 2009 00:23:10 +0000 (11:23 +1100)
This reverts 001cd9a0080242610dc7c60909f57893201bfd52

source3/Makefile.in
source3/lib/util_file.c [new file with mode: 0644]

index 9929973a7aaf30eadb9675bcf73145f050c2aba8..31f5298b6b6d3f4c69d2337e51cdb7e967e5f3b4 100644 (file)
@@ -364,7 +364,7 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) \
          lib/bitmap.o lib/dprintf.o $(UTIL_REG_OBJ) \
          lib/wins_srv.o \
          lib/util_str.o lib/clobber.o lib/util_sid.o lib/util_uuid.o \
-         lib/util_unistr.o ../lib/util/util_str.o \
+         lib/util_unistr.o lib/util_file.o ../lib/util/util_str.o \
          ../lib/util/charset/util_unistr.o \
          lib/util.o lib/util_sock.o lib/sock_exec.o lib/util_sec.o \
          lib/substitute.o lib/dbwrap_util.o \
diff --git a/source3/lib/util_file.c b/source3/lib/util_file.c
new file mode 100644 (file)
index 0000000..c5a9b7c
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * SMB parameters and setup
+ * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995.
+ * 
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option)
+ * any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+
+/**
+ Load from a pipe into memory.
+**/
+
+static char *file_pload(const char *syscmd, size_t *size)
+{
+       int fd, n;
+       char *p;
+       char buf[1024];
+       size_t total;
+
+       fd = sys_popen(syscmd);
+       if (fd == -1) {
+               return NULL;
+       }
+
+       p = NULL;
+       total = 0;
+
+       while ((n = read(fd, buf, sizeof(buf))) > 0) {
+               p = (char *)SMB_REALLOC(p, total + n + 1);
+               if (!p) {
+                       DEBUG(0,("file_pload: failed to expand buffer!\n"));
+                       close(fd);
+                       return NULL;
+               }
+               memcpy(p+total, buf, n);
+               total += n;
+       }
+
+       if (p) {
+               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;
+}
+
+
+
+/**
+ Load a pipe into memory and return an array of pointers to lines in the data
+ must be freed with file_lines_free(). 
+**/
+
+char **file_lines_pload(const char *syscmd, int *numlines)
+{
+       char *p;
+       size_t size;
+
+       p = file_pload(syscmd, &size);
+       if (!p) {
+               return NULL;
+       }
+
+       return file_lines_parse(p, size, numlines, NULL);
+}