source: trunk/src/binutils/libiberty/mkstemps.c@ 1796

Last change on this file since 1796 was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 3.6 KB
Line 
1/* Copyright (C) 1991, 1992, 1996, 1998 Free Software Foundation, Inc.
2 This file is derived from mkstemp.c from the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If not,
16 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. */
18
19#ifdef HAVE_CONFIG_H
20#include "config.h"
21#endif
22
23#include <sys/types.h>
24#ifdef HAVE_STDLIB_H
25#include <stdlib.h>
26#endif
27#ifdef HAVE_STRING_H
28#include <string.h>
29#endif
30#include <errno.h>
31#include <stdio.h>
32#include <fcntl.h>
33#ifdef HAVE_UNISTD_H
34#include <unistd.h>
35#endif
36#ifdef HAVE_SYS_TIME_H
37#include <sys/time.h>
38#endif
39#include "ansidecl.h"
40
41/* We need to provide a type for gcc_uint64_t. */
42#ifdef __GNUC__
43__extension__ typedef unsigned long long gcc_uint64_t;
44#else
45typedef unsigned long gcc_uint64_t;
46#endif
47
48#ifndef TMP_MAX
49#define TMP_MAX 16384
50#endif
51
52/*
53
54@deftypefn Replacement int mkstemps (char *@var{template}, int @var{suffix_len})
55
56Generate a unique temporary file name from @var{template}.
57@var{template} has the form:
58
59@example
60 @var{path}/ccXXXXXX@var{suffix}
61@end example
62
63@var{suffix_len} tells us how long @var{suffix} is (it can be zero
64length). The last six characters of @var{template} before @var{suffix}
65must be @samp{XXXXXX}; they are replaced with a string that makes the
66filename unique. Returns a file descriptor open on the file for
67reading and writing.
68
69@end deftypefn
70
71*/
72
73int
74mkstemps (template, suffix_len)
75 char *template;
76 int suffix_len;
77{
78 static const char letters[]
79 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
80 static gcc_uint64_t value;
81#ifdef HAVE_GETTIMEOFDAY
82 struct timeval tv;
83#endif
84 char *XXXXXX;
85 size_t len;
86 int count;
87
88 len = strlen (template);
89
90 if ((int) len < 6 + suffix_len
91 || strncmp (&template[len - 6 - suffix_len], "XXXXXX", 6))
92 {
93 return -1;
94 }
95
96 XXXXXX = &template[len - 6 - suffix_len];
97
98#ifdef HAVE_GETTIMEOFDAY
99 /* Get some more or less random data. */
100 gettimeofday (&tv, NULL);
101 value += ((gcc_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid ();
102#else
103 value += getpid ();
104#endif
105
106 for (count = 0; count < TMP_MAX; ++count)
107 {
108 gcc_uint64_t v = value;
109 int fd;
110
111 /* Fill in the random bits. */
112 XXXXXX[0] = letters[v % 62];
113 v /= 62;
114 XXXXXX[1] = letters[v % 62];
115 v /= 62;
116 XXXXXX[2] = letters[v % 62];
117 v /= 62;
118 XXXXXX[3] = letters[v % 62];
119 v /= 62;
120 XXXXXX[4] = letters[v % 62];
121 v /= 62;
122 XXXXXX[5] = letters[v % 62];
123
124#ifdef VMS
125 fd = open (template, O_RDWR|O_CREAT|O_EXCL, 0600, "fop=tmd");
126#else
127 fd = open (template, O_RDWR|O_CREAT|O_EXCL, 0600);
128#endif
129 if (fd >= 0)
130 /* The file does not exist. */
131 return fd;
132
133 /* This is a random value. It is only necessary that the next
134 TMP_MAX values generated by adding 7777 to VALUE are different
135 with (module 2^32). */
136 value += 7777;
137 }
138
139 /* We return the null string if we can't find a unique file name. */
140 template[0] = '\0';
141 return -1;
142}
Note: See TracBrowser for help on using the repository browser.