tempnam.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:2k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: tempnam.c,v 1.10 1998/09/23 17:14:24 wessels Exp $
  3.  */
  4. /* A reasonably functional tmpnam. */
  5. /* Originally by Tom Hageman, tom@basil.icce.rug.nl */
  6. /*
  7.  * This tmpnam() was changed by Gerben_Wierda@RnA.nl to serve as
  8.  * tempnam() for squid-1.1.6. It ignores the directory parameter, every
  9.  * temp file is written in /tmp.
  10.  */
  11. #include "config.h"
  12. #if HAVE_LIBC_H
  13. #include <libc.h>
  14. #endif
  15. #if HAVE_STDIO_H
  16. #include <stdio.h>
  17. #endif
  18. #if HAVE_TYPES_H
  19. #include <sys/types.h>
  20. #endif
  21. #if HAVE_LIMITS_H
  22. #include <limits.h>
  23. #endif
  24. #if HAVE_UNISTD_H
  25. #include <unistd.h>
  26. #endif
  27. #undef TMP_MAX
  28. #define _tmp "/tmp/"
  29. #define lengthof_tmp 5
  30. #ifndef LONG_BIT
  31. #define LONG_BIT (CHAR_BIT * 4) /* assume sizeof(long) == 4 */
  32. #endif
  33. #define L_tmpmin (lengthof_tmp + 5) /* 5 chars for pid. */
  34. #if (L_tmpnam > L_tmpmin)
  35. #if (L_tmpnam > L_tmpmin + LONG_BIT / 6) /* base 64 */
  36. #define TMP_MAX ULONG_MAX
  37. #else
  38. #define TMP_MAX ((1L << (6 * (L_tmpnam - L_tmpmin))) - 1)
  39. #endif
  40. #else
  41. #ifndef L_tmpnam
  42. #error "tmpnam: L_tmpnam undefined"
  43. #else
  44. #error "tmpnam: L_tmpnam too small"
  45. #endif
  46. #endif
  47. static char *
  48. _tmpnam(void)
  49. {
  50.     static const char digits[] =
  51. #if (L_tmpnam >= L_tmpmin + LONG_BIT / 4)
  52.     "0123456789abcdef";
  53. #define TMP_BASE 16
  54. #else
  55.     "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";
  56. #define TMP_BASE 64
  57. #endif
  58.     static unsigned long lastcount = 0;
  59.     static char buffer[L_tmpnam + 1];
  60.     char *s = buffer;
  61.     unsigned long count = lastcount;
  62.     pid_t pid = getpid();
  63.     if (sizeof(_tmp) - 1 != lengthof_tmp)
  64. abort(); /* Consistency error. */
  65.     for (;;) {
  66. register int i = L_tmpnam;
  67. register unsigned long c;
  68. register unsigned int p;
  69. /* Build filename. (the hard way) */
  70. s += i;
  71. *s = '';
  72. c = (count == TMP_MAX) ? 0 : ++count;
  73. do {
  74.     *--s = digits[c % TMP_BASE];
  75.     c /= TMP_BASE;
  76. } while (--i > L_tmpmin);
  77. p = (unsigned int) pid;
  78. do {
  79.     *--s = digits[p % 10];
  80.     p /= 10;
  81. } while (--i > lengthof_tmp);
  82. do {
  83.     *--s = _tmp[--i];
  84. } while (i > 0);
  85. /* Check that the file doesn't exist. */
  86. if (access(s, 0) != 0)
  87.     break;
  88. /* It exists; retry unless we tried them all. */
  89. if (count == lastcount) {
  90.     s = NULL;
  91.     break;
  92. }
  93.     }
  94.     lastcount = count;
  95.     return s;
  96. }
  97. char *
  98. tempnam(const char *dir, const char *pfx)
  99. {
  100.     return _tmpnam();
  101. }
  102. #ifdef TEST
  103. int
  104. main()
  105. {
  106.     char *t;
  107.     int n = 0;
  108.     while ((t = tempnam(NULL, NULL))) {
  109. printf("%sn", t);
  110. if (++n == 1000)
  111.     break;
  112.     }
  113.     return 1;
  114. }
  115. #endif