LibOFX
win32.cpp
1 /***************************************************************************
2  $RCSfile: win32.cpp,v $
3  -------------------
4  cvs : $Id: win32.cpp,v 1.3 2007-10-27 12:15:58 aquamaniac Exp $
5  begin : Sat Oct 27 2007
6  copyright : (C) 2007 by Martin Preuss
7  email : martin@libchipcard.de
8 
9  ***************************************************************************
10  * This file is part of the project "LibOfx". *
11  * Please see toplevel file COPYING of that project for license details. *
12  ***************************************************************************/
13 
14 
15 #include "win32.hh"
16 
17 #include <errno.h>
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21 #ifdef HAVE_UNISTD_H
22 #include <unistd.h>
23 #endif
24 #include <sys/stat.h>
25 #include <fcntl.h>
26 #include <assert.h>
27 
28 
29 
30 #ifdef _WIN32
31 
32 #ifdef _MSC_VER
33 #include <Windows.h>
34 #include <io.h>
35 #define strcasecmp strcmpi
36 #define snprintf _snprintf
37 #define open _open
38 #endif
39 
40 int mkstemp_win32(char *tmpl)
41 {
42  int fd = -1;
43  int len;
44  char *nf;
45  int i;
46 
47  len = strlen(tmpl);
48  if (len < 6)
49  {
50  /* bad template */
51  errno = EINVAL;
52  return -1;
53  }
54  if (strcasecmp(tmpl + (len - 7), "XXXXXX"))
55  {
56  /* bad template, last 6 chars must be "X" */
57  errno = EINVAL;
58  return -1;
59  }
60 
61  nf = strdup(tmpl);
62 
63  for (i = 0; i < 10; i++)
64  {
65  int rnd;
66  char numbuf[16];
67 
68  rnd = rand();
69  snprintf(numbuf, sizeof(numbuf) - 1, "%06x", rnd);
70  memmove(nf + (len - 7), numbuf, 6);
71  fd = open(nf, O_RDWR | O_BINARY | O_CREAT, 0444);
72  if (fd >= 0)
73  {
74  memmove(tmpl, nf, len);
75  free(nf);
76  return fd;
77  }
78  }
79  free(nf);
80  errno = EEXIST;
81  return -1;
82 }
83 
84 
85 #endif
86 
87