30 #include <sys/types.h>
40 #if defined ( _MSC_VER ) && _MSC_VER >= 1400
42 #define mktemp _mktemp
44 #define fdopen _fdopen
51 #if defined ( _MSC_VER )
53 # define getcwd _getcwd
73 if ( size == 0 || nmemb == 0 )
79 fwrite( buf, size, nmemb, stream );
81 if ( ferror( stream ) )
86 plabort(
"Error writing to file" );
105 if ( size == 0 || nmemb == 0 )
107 plwarn(
"Zero length buffer size in plio_fread, returning" );
114 bytes = fread( buf, size, nmemb, stream );
116 if ( ( bytes < nmemb ) && ferror( stream ) )
119 plabort(
"Error reading from file" );
151 plwarn(
"Zero length buffer size in plio_fgets, returning" );
158 s = fgets( buf, size, stream );
160 if ( s == NULL && ferror( stream ) )
163 plabort(
"Error reading from file" );
181 PLINT ntmpdir_list = 0;
182 #if defined ( MSDOS ) || defined ( WIN32 )
183 tmpdir_list[ntmpdir_list] = getenv(
"TMP" );
184 if ( tmpdir_list[ntmpdir_list] != NULL && ntmpdir_list < max_ntmpdir_list )
187 tmpdir_list[ntmpdir_list] = getenv(
"TEMP" );
188 if ( tmpdir_list[ntmpdir_list] != NULL && ntmpdir_list < max_ntmpdir_list )
191 tmpdir_list[ntmpdir_list] = getenv(
"TMPDIR" );
192 if ( tmpdir_list[ntmpdir_list] != NULL && ntmpdir_list < max_ntmpdir_list )
197 tmpdir_list[ntmpdir_list] = P_tmpdir;
198 if ( tmpdir_list[ntmpdir_list] != NULL && ntmpdir_list < max_ntmpdir_list )
201 #endif //#if defined ( MSDOS ) || defined ( WIN32 )
205 if ( getcwd( currdir, maxcurrdir ) == NULL )
206 plexit(
"get_tmpdir_list: getcwd error" );
207 tmpdir_list[ntmpdir_list] = currdir;
208 if ( ntmpdir_list < max_ntmpdir_list )
211 #if defined ( MSDOS ) || defined ( WIN32 )
212 tmpdir_list[ntmpdir_list] =
"c:\\windows\\Temp";
214 tmpdir_list[ntmpdir_list] =
"/tmp";
216 if ( ntmpdir_list < max_ntmpdir_list )
244 char *
template = NULL;
246 #ifndef PL_HAVE_MKSTEMP
250 #define PL_MAXNTMPDIR_LIST 5
256 for ( itmpdir = 0; itmpdir < ntmpdir_list; itmpdir++ )
259 tmpdir = tmpdir_list[itmpdir];
260 pldebug(
"pl_create_tempfile",
"Attempting to create temporary file in %s directory\n", tmpdir );
264 template = (
char *) realloc(
template,
sizeof (
char ) * ( strlen( tmpdir ) + strlen( tmpname ) + 2 ) );
265 strcpy(
template, tmpdir );
266 #if defined ( MSDOS ) || defined ( WIN32 )
267 strcat(
template,
"\\" );
269 strcat(
template,
"/" );
271 strcat(
template, tmpname );
273 #ifdef PL_HAVE_MKSTEMP
274 fd = fdopen( mkstemp(
template ),
"wb+" );
275 #else //#ifdef PL_HAVE_MKSTEMP
278 #if !defined ( _S_IREAD )
281 #if !defined ( _S_IWRITE )
282 #define _S_IWRITE 128
285 flags = O_RDWR | O_CREAT | O_EXCL;
286 #if defined ( MSDOS ) || defined ( WIN32 )
288 flags = flags | O_BINARY | _O_SHORT_LIVED;
292 flags = flags | _O_TEMPORARY;
296 #endif // #ifdef PL_HAVE_MKSTEMP
304 plwarn(
"pl_create_tempfile: Unable to open temporary file - returning" );
310 #if defined ( PL_HAVE_MKSTEMP ) && defined ( PL_HAVE_UNLINK )
346 #if !defined PL_HAVE_MKDTEMP || !defined PL_HAVE_MKFIFO
347 plwarn(
"Creating fifos not supported on this platform" );
351 char *
template = NULL;
352 char *dirname = NULL;
357 #define PL_MAXNTMPDIR_LIST 5
364 for ( itmpdir = 0; itmpdir < ntmpdir_list; itmpdir++ )
367 tmpdir = tmpdir_list[itmpdir];
368 pldebug(
"pl_create_tempfifo",
"Attempting to create temporary fifo in %s directory\n", tmpdir );
372 dirname = (
char *) realloc( dirname,
sizeof (
char ) * ( strlen( tmpdir ) + strlen( tmpname ) + 2 ) );
373 strcpy( dirname, tmpdir );
374 #if defined ( MSDOS ) || defined ( WIN32 )
375 strcat( dirname,
"\\" );
377 strcat( dirname,
"/" );
379 strcat( dirname, tmpname );
381 dirname = mkdtemp( dirname );
382 if ( dirname == NULL )
389 *p_dirname = dirname;
392 template = (
char *) realloc(
template,
sizeof (
char ) * ( strlen( tmpdir ) + strlen( tmpname ) + strlen( fifoname ) + 4 ) );
393 strcpy(
template, dirname );
394 #if defined ( MSDOS ) || defined ( WIN32 )
395 strcat(
template,
"\\" );
397 strcat(
template,
"/" );
399 strcat(
template, fifoname );
400 *p_fifoname =
template;
403 mkfifo_rc = mkfifo(
template, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH );
void plexit(PLCHAR_VECTOR errormsg)
FILE * pl_create_tempfile(char **fname)
const char * PLCHAR_VECTOR
void plabort(PLCHAR_VECTOR errormsg)
void plio_fwrite(void *buf, size_t size, size_t nmemb, FILE *stream)
void plio_fgets(char *buf, int size, FILE *stream)
char * pl_create_tempfifo(const char **p_fifoname, const char **p_dirname)
void plio_fread(void *buf, size_t size, size_t nmemb, FILE *stream)
void plwarn(PLCHAR_VECTOR errormsg)
#define PL_MAXNTMPDIR_LIST
static PLINT get_tmpdir_list(PLINT max_ntmpdir_list, char **tmpdir_list, PLINT maxcurrdir, char *currdir)