about summary refs log tree commit diff
path: root/lib/pmfileio.c
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2007-12-31 02:48:03 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2007-12-31 02:48:03 +0000
commit9e4f4c5e1fba64c1139ebd19927203b357303b16 (patch)
tree84947fa5612bc820ff77df7947c07f9b47a61f62 /lib/pmfileio.c
parentcca1e4c6e2a1104b7f26e05a8aa9a568f648978c (diff)
downloadnetpbm-mirror-9e4f4c5e1fba64c1139ebd19927203b357303b16.tar.gz
netpbm-mirror-9e4f4c5e1fba64c1139ebd19927203b357303b16.tar.xz
netpbm-mirror-9e4f4c5e1fba64c1139ebd19927203b357303b16.zip
Add pm_tmpfile_fd(), pm_make_tmpfile_fd()
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@520 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'lib/pmfileio.c')
-rw-r--r--lib/pmfileio.c101
1 files changed, 79 insertions, 22 deletions
diff --git a/lib/pmfileio.c b/lib/pmfileio.c
index e2cd3d06..12581b8d 100644
--- a/lib/pmfileio.c
+++ b/lib/pmfileio.c
@@ -192,7 +192,7 @@ mkstemp2(char * const filenameBuffer) {
 
 static void
 makeTmpfileWithTemplate(const char *  const filenameTemplate,
-                        FILE **       const filePP,
+                        int *         const fdP,
                         const char ** const filenameP,
                         const char ** const errorP) {
     
@@ -214,24 +214,9 @@ makeTmpfileWithTemplate(const char *  const filenameTemplate,
                       "pattern '%s'.  mkstemp() failed with errno %d (%s)",
                       filenameTemplate, errno, strerror(errno));
         else {
-            int const fd = rc;
-            
-            FILE * fileP;
-            fileP = fdopen(fd, "w+b");
-            
-            if (fileP == NULL)
-                asprintfN(errorP, "Unable to create temporary file.  "
-                          "fdopen() failed with errno %d (%s)",
-                          errno, strerror(errno));
-            else {
-                *errorP = NULL;
-                *filePP = fileP;
-                *filenameP = filenameBuffer;
-            }
-            if (*errorP) {
-                unlink(filenameBuffer);
-                close(fd);
-            }
+            *fdP = rc;
+            *filenameP = filenameBuffer;
+            *errorP = NULL;
         }
         if (*errorP)
             strfree(filenameBuffer);
@@ -240,9 +225,41 @@ makeTmpfileWithTemplate(const char *  const filenameTemplate,
 
 
 
+static void
+fMakeTmpfileWithTemplate(const char *  const filenameTemplate,
+                         FILE **       const filePP,
+                         const char ** const filenameP,
+                         const char ** const errorP) {
+    
+    int fd;
+
+    makeTmpfileWithTemplate(filenameTemplate, &fd, filenameP, errorP);
+
+    if (!*errorP) {
+        FILE * fileP;
+        fileP = fdopen(fd, "w+b");
+            
+        if (fileP == NULL)
+            asprintfN(errorP, "Unable to create temporary file.  "
+                      "fdopen() failed with errno %d (%s)",
+                      errno, strerror(errno));
+        else {
+            *errorP = NULL;
+            *filePP = fileP;
+        }
+        if (*errorP) {
+            unlink(*filenameP);
+            strfree(*filenameP);
+            close(fd);
+        }
+    }
+}
+
+
+
 void
-pm_make_tmpfile(FILE **       const filePP,
-                const char ** const filenameP) {
+pm_make_tmpfile_fd(int *         const fdP,
+                   const char ** const filenameP) {
 
     const char * filenameTemplate;
     unsigned int fnamelen;
@@ -266,7 +283,7 @@ pm_make_tmpfile(FILE **       const filePP,
         asprintfN(&error,
                   "Unable to allocate storage for temporary file name");
     else {
-        makeTmpfileWithTemplate(filenameTemplate, filePP, filenameP, &error);
+        makeTmpfileWithTemplate(filenameTemplate, fdP, filenameP, &error);
 
         strfree(filenameTemplate);
     }
@@ -279,6 +296,29 @@ pm_make_tmpfile(FILE **       const filePP,
 
 
 
+void
+pm_make_tmpfile(FILE **       const filePP,
+                const char ** const filenameP) {
+
+    int fd;
+
+    pm_make_tmpfile_fd(&fd, filenameP);
+
+    *filePP = fdopen(fd, "w+b");
+    
+    if (*filePP == NULL) {
+        close(fd);
+        unlink(*filenameP);
+        strfree(*filenameP);
+
+        pm_error("Unable to create temporary file.  "
+                 "fdopen() failed with errno %d (%s)",
+                 errno, strerror(errno));
+    }
+}
+
+
+
 FILE * 
 pm_tmpfile(void) {
 
@@ -296,6 +336,23 @@ pm_tmpfile(void) {
 
 
 
+int
+pm_tmpfile_fd(void) {
+
+    int fd;
+    const char * tmpfile;
+
+    pm_make_tmpfile_fd(&fd, &tmpfile);
+
+    unlink(tmpfile);
+
+    strfree(tmpfile);
+
+    return fd;
+}
+
+
+
 FILE *
 pm_openr_seekable(const char name[]) {
 /*----------------------------------------------------------------------------