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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [libiberty/] [mkstemps.c] - Diff between revs 107 and 1765

Only display areas with differences | Details | Blame | View Log

Rev 107 Rev 1765
/* Copyright (C) 1991, 1992, 1996, 1998 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1996, 1998 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., 59 Temple Place - Suite 330,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#ifdef HAVE_CONFIG_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
#endif
#endif
 
 
#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__
typedef unsigned long long gcc_uint64_t;
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
 
 
/* Generate a unique temporary file name from TEMPLATE.
/* Generate a unique temporary file name from TEMPLATE.
 
 
   TEMPLATE has the form:
   TEMPLATE has the form:
 
 
   <path>/ccXXXXXX<suffix>
   <path>/ccXXXXXX<suffix>
 
 
   SUFFIX_LEN tells us how long <suffix> is (it can be zero length).
   SUFFIX_LEN tells us how long <suffix> is (it can be zero length).
 
 
   The last six characters of TEMPLATE before <suffix> must be "XXXXXX";
   The last six characters of TEMPLATE before <suffix> must be "XXXXXX";
   they are replaced with a string that makes the filename unique.
   they are replaced with a string that makes the filename unique.
 
 
   Returns a file descriptor open on the file for reading and writing.  */
   Returns a file descriptor open on the file for reading and writing.  */
int
int
mkstemps (template, suffix_len)
mkstemps (template, suffix_len)
     char *template;
     char *template;
     int suffix_len;
     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 (template);
  len = strlen (template);
 
 
  if ((int) len < 6 + suffix_len
  if ((int) len < 6 + suffix_len
      || strncmp (&template[len - 6 - suffix_len], "XXXXXX", 6))
      || strncmp (&template[len - 6 - suffix_len], "XXXXXX", 6))
    {
    {
      return -1;
      return -1;
    }
    }
 
 
  XXXXXX = &template[len - 6 - suffix_len];
  XXXXXX = &template[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 (template, O_RDWR|O_CREAT|O_EXCL, 0600);
      fd = open (template, 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.  */
  template[0] = '\0';
  template[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.