00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifdef HAVE_CONFIG_H
00024 #include "config.h"
00025 #endif
00026
00027 #include <sys/types.h>
00028 #ifdef HAVE_STDLIB_H
00029 #include <stdlib.h>
00030 #endif
00031 #ifdef HAVE_STRING_H
00032 #include <string.h>
00033 #endif
00034 #include <errno.h>
00035 #include <stdio.h>
00036 #include <fcntl.h>
00037 #ifdef HAVE_UNISTD_H
00038 #include <unistd.h>
00039 #endif
00040 #ifdef HAVE_SYS_TIME_H
00041 #include <sys/time.h>
00042 #endif
00043 #include "ansidecl.h"
00044
00045
00046 #ifdef __GNUC__
00047 __extension__ typedef unsigned long long gcc_uint64_t;
00048 #else
00049 typedef unsigned long gcc_uint64_t;
00050 #endif
00051
00052 #ifndef TMP_MAX
00053 #define TMP_MAX 16384
00054 #endif
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 int
00078 mkstemps (template, suffix_len)
00079 char *template;
00080 int suffix_len;
00081 {
00082 static const char letters[]
00083 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
00084 static gcc_uint64_t value;
00085 #ifdef HAVE_GETTIMEOFDAY
00086 struct timeval tv;
00087 #endif
00088 char *XXXXXX;
00089 size_t len;
00090 int count;
00091
00092 len = strlen (template);
00093
00094 if ((int) len < 6 + suffix_len
00095 || strncmp (&template[len - 6 - suffix_len], "XXXXXX", 6))
00096 {
00097 return -1;
00098 }
00099
00100 XXXXXX = &template[len - 6 - suffix_len];
00101
00102 #ifdef HAVE_GETTIMEOFDAY
00103
00104 gettimeofday (&tv, NULL);
00105 value += ((gcc_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid ();
00106 #else
00107 value += getpid ();
00108 #endif
00109
00110 for (count = 0; count < TMP_MAX; ++count)
00111 {
00112 gcc_uint64_t v = value;
00113 int fd;
00114
00115
00116 XXXXXX[0] = letters[v % 62];
00117 v /= 62;
00118 XXXXXX[1] = letters[v % 62];
00119 v /= 62;
00120 XXXXXX[2] = letters[v % 62];
00121 v /= 62;
00122 XXXXXX[3] = letters[v % 62];
00123 v /= 62;
00124 XXXXXX[4] = letters[v % 62];
00125 v /= 62;
00126 XXXXXX[5] = letters[v % 62];
00127
00128 fd = open (template, O_RDWR|O_CREAT|O_EXCL, 0600);
00129 if (fd >= 0)
00130
00131 return fd;
00132
00133
00134
00135
00136 value += 7777;
00137 }
00138
00139
00140 template[0] = '\0';
00141 return -1;
00142 }