OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [libiberty/] [mkstemps.c] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
/* Copyright (C) 1991, 1992, 1996, 1998, 2004 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1996, 1998, 2004 Free Software Foundation, Inc.
   This file is derived from mkstemp.c from the GNU C Library.
   This file is derived from mkstemp.c from the GNU C Library.
 
 
   The GNU C Library is free software; you can redistribute it and/or
   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.
   License, or (at your option) any later version.
 
 
   The GNU C Library is distributed in the hope that it will be useful,
   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.
   Library General Public License for more details.
 
 
   You should have received a copy of the GNU Library General Public
   You should have received a copy of the GNU Library General Public
   License along with the GNU C Library; see the file COPYING.LIB.  If not,
   License along with the GNU C Library; see the file COPYING.LIB.  If not,
   write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
   write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
   Boston, MA 02110-1301, USA.  */
   Boston, MA 02110-1301, USA.  */
 
 
#ifdef HAVE_CONFIG_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
#endif
#endif
 
 
#include <sys/types.h>
#include <sys/types.h>
#ifdef HAVE_STDLIB_H
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#include <stdlib.h>
#endif
#endif
#ifdef HAVE_STRING_H
#ifdef HAVE_STRING_H
#include <string.h>
#include <string.h>
#endif
#endif
#include <errno.h>
#include <errno.h>
#include <stdio.h>
#include <stdio.h>
#include <fcntl.h>
#include <fcntl.h>
#ifdef HAVE_UNISTD_H
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#include <unistd.h>
#endif
#endif
#ifdef HAVE_SYS_TIME_H
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#include <sys/time.h>
#endif
#endif
#include "ansidecl.h"
#include "ansidecl.h"
 
 
/* We need to provide a type for gcc_uint64_t.  */
/* We need to provide a type for gcc_uint64_t.  */
#ifdef __GNUC__
#ifdef __GNUC__
__extension__ typedef unsigned long long gcc_uint64_t;
__extension__ typedef unsigned long long gcc_uint64_t;
#else
#else
typedef unsigned long gcc_uint64_t;
typedef unsigned long gcc_uint64_t;
#endif
#endif
 
 
#ifndef TMP_MAX
#ifndef TMP_MAX
#define TMP_MAX 16384
#define TMP_MAX 16384
#endif
#endif
 
 
#ifndef O_BINARY
#ifndef O_BINARY
# define O_BINARY 0
# define O_BINARY 0
#endif
#endif
 
 
/*
/*
 
 
@deftypefn Replacement int mkstemps (char *@var{pattern}, int @var{suffix_len})
@deftypefn Replacement int mkstemps (char *@var{pattern}, int @var{suffix_len})
 
 
Generate a unique temporary file name from @var{pattern}.
Generate a unique temporary file name from @var{pattern}.
@var{pattern} has the form:
@var{pattern} has the form:
 
 
@example
@example
   @var{path}/ccXXXXXX@var{suffix}
   @var{path}/ccXXXXXX@var{suffix}
@end example
@end example
 
 
@var{suffix_len} tells us how long @var{suffix} is (it can be zero
@var{suffix_len} tells us how long @var{suffix} is (it can be zero
length).  The last six characters of @var{pattern} before @var{suffix}
length).  The last six characters of @var{pattern} before @var{suffix}
must be @samp{XXXXXX}; they are replaced with a string that makes the
must be @samp{XXXXXX}; they are replaced with a string that makes the
filename unique.  Returns a file descriptor open on the file for
filename unique.  Returns a file descriptor open on the file for
reading and writing.
reading and writing.
 
 
@end deftypefn
@end deftypefn
 
 
*/
*/
 
 
int
int
mkstemps (char *pattern, int suffix_len)
mkstemps (char *pattern, int suffix_len)
{
{
  static const char letters[]
  static const char letters[]
    = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  static gcc_uint64_t value;
  static gcc_uint64_t value;
#ifdef HAVE_GETTIMEOFDAY
#ifdef HAVE_GETTIMEOFDAY
  struct timeval tv;
  struct timeval tv;
#endif
#endif
  char *XXXXXX;
  char *XXXXXX;
  size_t len;
  size_t len;
  int count;
  int count;
 
 
  len = strlen (pattern);
  len = strlen (pattern);
 
 
  if ((int) len < 6 + suffix_len
  if ((int) len < 6 + suffix_len
      || strncmp (&pattern[len - 6 - suffix_len], "XXXXXX", 6))
      || strncmp (&pattern[len - 6 - suffix_len], "XXXXXX", 6))
    {
    {
      return -1;
      return -1;
    }
    }
 
 
  XXXXXX = &pattern[len - 6 - suffix_len];
  XXXXXX = &pattern[len - 6 - suffix_len];
 
 
#ifdef HAVE_GETTIMEOFDAY
#ifdef HAVE_GETTIMEOFDAY
  /* Get some more or less random data.  */
  /* Get some more or less random data.  */
  gettimeofday (&tv, NULL);
  gettimeofday (&tv, NULL);
  value += ((gcc_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid ();
  value += ((gcc_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid ();
#else
#else
  value += getpid ();
  value += getpid ();
#endif
#endif
 
 
  for (count = 0; count < TMP_MAX; ++count)
  for (count = 0; count < TMP_MAX; ++count)
    {
    {
      gcc_uint64_t v = value;
      gcc_uint64_t v = value;
      int fd;
      int fd;
 
 
      /* Fill in the random bits.  */
      /* Fill in the random bits.  */
      XXXXXX[0] = letters[v % 62];
      XXXXXX[0] = letters[v % 62];
      v /= 62;
      v /= 62;
      XXXXXX[1] = letters[v % 62];
      XXXXXX[1] = letters[v % 62];
      v /= 62;
      v /= 62;
      XXXXXX[2] = letters[v % 62];
      XXXXXX[2] = letters[v % 62];
      v /= 62;
      v /= 62;
      XXXXXX[3] = letters[v % 62];
      XXXXXX[3] = letters[v % 62];
      v /= 62;
      v /= 62;
      XXXXXX[4] = letters[v % 62];
      XXXXXX[4] = letters[v % 62];
      v /= 62;
      v /= 62;
      XXXXXX[5] = letters[v % 62];
      XXXXXX[5] = letters[v % 62];
 
 
      fd = open (pattern, O_BINARY|O_RDWR|O_CREAT|O_EXCL, 0600);
      fd = open (pattern, O_BINARY|O_RDWR|O_CREAT|O_EXCL, 0600);
      if (fd >= 0)
      if (fd >= 0)
        /* The file does not exist.  */
        /* The file does not exist.  */
        return fd;
        return fd;
 
 
      /* This is a random value.  It is only necessary that the next
      /* This is a random value.  It is only necessary that the next
         TMP_MAX values generated by adding 7777 to VALUE are different
         TMP_MAX values generated by adding 7777 to VALUE are different
         with (module 2^32).  */
         with (module 2^32).  */
      value += 7777;
      value += 7777;
    }
    }
 
 
  /* We return the null string if we can't find a unique file name.  */
  /* We return the null string if we can't find a unique file name.  */
  pattern[0] = '\0';
  pattern[0] = '\0';
  return -1;
  return -1;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.