diff -up unix2dos-2.2/unix2dos.c.tmppath unix2dos-2.2/unix2dos.c --- unix2dos-2.2/unix2dos.c.tmppath 2008-09-08 10:14:30.000000000 +0100 +++ unix2dos-2.2/unix2dos.c 2008-09-08 10:14:30.000000000 +0100 @@ -57,7 +57,10 @@ #ifdef __MSDOS__ # include +#else +# include #endif __MSDOS +#include #include #include #include @@ -195,6 +198,40 @@ int ConvertUnixToDos(FILE* ipInF, FILE* } +static int MakeTempFileFrom(const char *OutFN, char **fname_ret) +{ + char *cpy = strdup(OutFN); + char *dir = NULL; + size_t fname_len = 0; + char *fname_str = NULL; + int fd = -1; + + *fname_ret = NULL; + + if (!cpy) + goto make_failed; + + dir = dirname(cpy); + + fname_len = strlen(dir) + strlen("/u2dtmpXXXXXX") + sizeof (char); + if (!(fname_str = malloc(fname_len))) + goto make_failed; + sprintf(fname_str, "%s%s", dir, "/u2dtmpXXXXXX"); + *fname_ret = fname_str; + + free(cpy); + + if ((fd = mkstemp(fname_str)) == -1) + goto make_failed; + + return (fd); + + make_failed: + free(*fname_ret); + *fname_ret = NULL; + return (-1); +} + /* convert file ipInFN to DOS format text and write to file ipOutFN * RetVal: 0 if success * -1 otherwise @@ -204,7 +241,7 @@ int ConvertUnixToDosNewFile(char *ipInFN int RetVal = 0; FILE *InF = NULL; FILE *TempF = NULL; - char TempPath[16]; + char *TempPath; struct stat StatBuf; struct utimbuf UTimeBuf; int fd; @@ -213,8 +250,7 @@ int ConvertUnixToDosNewFile(char *ipInFN if ((ipFlag->KeepDate) && stat(ipInFN, &StatBuf)) RetVal = -1; - strcpy (TempPath, "./u2dtmpXXXXXX"); - if((fd=mkstemp (TempPath)) < 0) { + if((fd = MakeTempFileFrom (ipOutFN, &TempPath)) < 0) { perror("Can't open output temp file"); RetVal = -1; } @@ -231,6 +267,7 @@ int ConvertUnixToDosNewFile(char *ipInFN if ((!RetVal) && (InF) && ((TempF=OpenOutFile(fd)) == NULL)) { fclose (InF); + InF = NULL; RetVal = -1; } @@ -265,9 +302,6 @@ int ConvertUnixToDosNewFile(char *ipInFN /* can rename temp file to out file? */ if (!RetVal) { - if (stat(ipOutFN, &StatBuf) == 0) - unlink(ipOutFN); - if ((rename(TempPath, ipOutFN) == -1) && (!ipFlag->Quiet)) { fprintf(stderr, "unix2dos: problems renaming '%s' to '%s'\n", TempPath, ipOutFN); @@ -275,6 +309,7 @@ int ConvertUnixToDosNewFile(char *ipInFN RetVal = -1; } } + free(TempPath); return RetVal; } @@ -289,7 +324,7 @@ int ConvertUnixToDosOldFile(char* ipInFN int RetVal = 0; FILE *InF = NULL; FILE *TempF = NULL; - char TempPath[16]; + char *TempPath; struct stat StatBuf; struct utimbuf UTimeBuf; mode_t mode = S_IRUSR | S_IWUSR; @@ -301,8 +336,7 @@ int ConvertUnixToDosOldFile(char* ipInFN else mode = StatBuf.st_mode; - strcpy (TempPath, "./u2dtmpXXXXXX"); - if((fd=mkstemp (TempPath)) < 0) { + if((fd = MakeTempFileFrom(ipInFN, &TempPath)) < 0) { perror("Can't open output temp file"); RetVal = -1; } @@ -322,6 +356,7 @@ int ConvertUnixToDosOldFile(char* ipInFN if ((!RetVal) && (InF) && ((TempF=OpenOutFile(fd)) == NULL)) { fclose (InF); + InF = NULL; RetVal = -1; } @@ -349,10 +384,6 @@ int ConvertUnixToDosOldFile(char* ipInFN RetVal = -1; } - /* can delete in file? */ - if ((!RetVal) && (unlink(ipInFN) == -1)) - RetVal = -1; - /* any error? */ if ((RetVal) && (unlink(TempPath))) RetVal = -1; @@ -367,6 +398,7 @@ int ConvertUnixToDosOldFile(char* ipInFN } RetVal = -1; } + free(TempPath); return RetVal; }