1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/* { dg-do compile } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target tls } */
/* Sched1 moved {load_tp} pattern between strlen call and the copy
of the hard return value to its pseudo. This resulted in a
reload abort, since the hard register was not spillable. */
extern __thread int __libc_errno __attribute__ ((tls_model ("initial-exec")));
struct stat64
{
long dummy[4];
};
typedef __SIZE_TYPE__ size_t;
typedef unsigned long long uint64_t;
typedef int __mode_t;
extern size_t strlen (__const char *__s) __attribute__ ((__pure__));
extern int strcmp (__const char *__s1, __const char *__s2)
__attribute__ ((__pure__));
extern int __open64 (__const char *__file, int __oflag, ...);
extern int __open (__const char *__file, int __oflag, ...);
extern int __mkdir (__const char *__path, __mode_t __mode);
extern int __lxstat64 (int __ver, __const char *__filename,
struct stat64 *__stat_buf) ;
static const char letters[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int
__gen_tempname (char *tmpl, int kind)
{
int len;
char *XXXXXX;
static uint64_t value;
uint64_t random_time_bits;
unsigned long count;
int fd = -1;
int save_errno = __libc_errno;
struct stat64 st;
unsigned long attempts_min = 62L * 62L * 62L;
unsigned long attempts = attempts_min < 238328 ? 238328 : attempts_min;
len = strlen (tmpl);
if (len < 6 || strcmp(&tmpl[len - 6], "XXXXXX"))
{
(__libc_errno = (22));
return -1;
}
XXXXXX = &tmpl[len - 6];
for (count = 0; count < attempts; value += 7777, ++count)
{
uint64_t v = value;
XXXXXX[0] = letters[v % 62];
v /= 62;
XXXXXX[1] = letters[v % 62];
v /= 62;
XXXXXX[2] = letters[v % 62];
v /= 62;
XXXXXX[3] = letters[v % 62];
v /= 62;
XXXXXX[4] = letters[v % 62];
v /= 62;
XXXXXX[5] = letters[v % 62];
switch (kind)
{
case 0:
fd = __open (tmpl, 02 | 01000 | 04000, 0400 | 0200);
break;
case 1:
fd = __open64 (tmpl, 02 | 01000 | 04000, 0400 | 0200);
break;
case 2:
fd = __mkdir (tmpl, 0400 | 0200 | 0100);
break;
case 3:
if (__lxstat64 (2, tmpl, &st) < 0)
{
if (__libc_errno == 2)
{
(__libc_errno = (save_errno));
return 0;
}
else
return -1;
}
continue;
}
if (fd >= 0)
{
(__libc_errno = (save_errno));
return fd;
}
else if (__libc_errno != 17)
return -1;
}
(__libc_errno = (17));
return -1;
}
|