87e998c
--- dos2unix-3.1/dos2unix.c.tmppath	2004-10-20 16:00:00.342561008 +0200
87e998c
+++ dos2unix-3.1/dos2unix.c	2004-10-20 16:01:42.210074792 +0200
87e998c
@@ -69,6 +69,7 @@
87e998c
 #ifdef __MSDOS__
87e998c
 #  include <dir.h>
87e998c
 #endif __MSDOS__
87e998c
+#include <libgen.h>
87e998c
 #include <stdio.h>
87e998c
 #include <stdlib.h>
87e998c
 #include <string.h>
87e998c
@@ -267,6 +268,39 @@
87e998c
     return RetVal;
87e998c
 }
87e998c
 
87e998c
+static int MakeTempFileFrom(const char *OutFN, char **fname_ret)
87e998c
+{
87e998c
+  char *cpy = strdup(OutFN);
87e998c
+  char *dir = NULL;
87e998c
+  size_t fname_len = 0;
87e998c
+  char  *fname_str = NULL;
87e998c
+  int fd = -1;
87e998c
+  
87e998c
+  *fname_ret = NULL;
87e998c
+  
87e998c
+  if (!cpy)
87e998c
+    goto make_failed;
87e998c
+  
87e998c
+  dir = dirname(cpy);
87e998c
+  
7305cf8
+  fname_len = strlen(dir) + strlen("/d2utmpXXXXXX") + sizeof (char);
87e998c
+  if (!(fname_str = malloc(fname_len)))
87e998c
+    goto make_failed;
87e998c
+  sprintf(fname_str, "%s%s", dir, "/d2utmpXXXXXX");
87e998c
+  *fname_ret = fname_str;
87e998c
+  
87e998c
+  free(cpy);
87e998c
+  
87e998c
+  if ((fd = mkstemp(fname_str)) == -1)
87e998c
+    goto make_failed;
87e998c
+  
87e998c
+  return (fd);
87e998c
+  
87e998c
+ make_failed:
87e998c
+  free(*fname_ret);
87e998c
+  *fname_ret = NULL;
87e998c
+  return (-1);
87e998c
+}
87e998c
 
87e998c
 /* convert file ipInFN to UNIX format text and write to file ipOutFN
87e998c
  * RetVal: 0 if success
87e998c
@@ -277,7 +311,7 @@
87e998c
   int RetVal = 0;
87e998c
   FILE *InF = NULL;
87e998c
   FILE *TempF = NULL;
87e998c
-  char TempPath[16];
87e998c
+  char *TempPath;
87e998c
   struct stat StatBuf;
87e998c
   struct utimbuf UTimeBuf;
87e998c
   int fd;
87e998c
@@ -286,8 +320,7 @@
87e998c
   if ((ipFlag->KeepDate) && stat(ipInFN, &StatBuf))
87e998c
     RetVal = -1;
87e998c
 
87e998c
-  strcpy (TempPath, "./d2utmpXXXXXX");
87e998c
-  if((fd=mkstemp (TempPath))<0) {
87e998c
+  if((fd = MakeTempFileFrom(ipOutFN, &TempPath))<0) {
87e998c
 	  perror("Failed to open output temp file");
87e998c
 	  RetVal = -1;
87e998c
   }
87e998c
@@ -304,6 +337,7 @@
87e998c
   if ((!RetVal) && (InF) && ((TempF=OpenOutFile(fd)) == NULL))
87e998c
   {
87e998c
     fclose (InF);
87e998c
+    InF = NULL;
87e998c
     RetVal = -1;
87e998c
   }
87e998c
 
87e998c
@@ -337,9 +371,6 @@
87e998c
   /* can rename temp file to out file? */
87e998c
   if (!RetVal)
87e998c
   {
87e998c
-    if (stat(ipOutFN, &StatBuf) == 0)
87e998c
-      unlink(ipOutFN);
87e998c
-
87e998c
     if ((rename(TempPath, ipOutFN) == -1) && (!ipFlag->Quiet))
87e998c
     {
87e998c
       fprintf(stderr, "dos2unix: problems renaming '%s' to '%s'\n", TempPath, ipOutFN);
87e998c
@@ -347,6 +378,7 @@
87e998c
       RetVal = -1;
87e998c
     }
87e998c
   }
87e998c
+  free(TempPath);
87e998c
   return RetVal;
87e998c
 }
87e998c
 
87e998c
@@ -362,7 +394,7 @@
87e998c
   int RetVal = 0;
87e998c
   FILE *InF = NULL;
87e998c
   FILE *TempF = NULL;
87e998c
-  char TempPath[16];
87e998c
+  char *TempPath;
87e998c
   struct stat StatBuf;
87e998c
   struct utimbuf UTimeBuf;
87e998c
   mode_t mode = S_IRUSR | S_IWUSR;
87e998c
@@ -374,8 +406,7 @@
87e998c
   else
87e998c
     mode = StatBuf.st_mode;
87e998c
 
87e998c
-  strcpy (TempPath, "./u2dtmpXXXXXX");
87e998c
-  if((fd=mkstemp (TempPath))<0) {
87e998c
+  if((fd = MakeTempFileFrom(ipInFN, &TempPath))<0) {
87e998c
 	  perror("Failed to open output temp file");
87e998c
 	  RetVal = -1;
87e998c
   }
87e998c
@@ -395,6 +426,7 @@
87e998c
   if ((!RetVal) && (InF) && ((TempF=OpenOutFile(fd)) == NULL))
87e998c
   {
87e998c
     fclose (InF);
87e998c
+    InF = NULL;
87e998c
     RetVal = -1;
87e998c
   }
87e998c
 
87e998c
@@ -422,10 +454,6 @@
87e998c
       RetVal = -1;
87e998c
   }
87e998c
 
87e998c
-  /* can delete in file? */
87e998c
-  if ((!RetVal) && (unlink(ipInFN) == -1))
87e998c
-    RetVal = -1;
87e998c
-
87e998c
   /* any error? */
87e998c
   if ((RetVal) && (unlink(TempPath)))
87e998c
     RetVal = -1;
87e998c
@@ -440,6 +468,7 @@
87e998c
     }
87e998c
     RetVal = -1;
87e998c
   }
87e998c
+  free(TempPath);
87e998c
   return RetVal;
87e998c
 }
87e998c