diff options
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/libbib/linear.cc | 2 | ||||
-rw-r--r-- | src/libs/libbib/map.c | 2 | ||||
-rw-r--r-- | src/libs/libbib/search.cc | 2 | ||||
-rw-r--r-- | src/libs/libgroff/Makefile.sub | 5 | ||||
-rw-r--r-- | src/libs/libgroff/fontfile.cc | 2 | ||||
-rw-r--r-- | src/libs/libgroff/mksdir.cc | 34 | ||||
-rw-r--r-- | src/libs/libgroff/mkstemp.cc | 34 | ||||
-rw-r--r-- | src/libs/libgroff/new.cc | 2 | ||||
-rw-r--r-- | src/libs/libgroff/tmpfile.cc | 16 | ||||
-rw-r--r-- | src/libs/libgroff/tmpname.cc | 107 |
10 files changed, 185 insertions, 21 deletions
diff --git a/src/libs/libbib/linear.cc b/src/libs/libbib/linear.cc index a8c2a553..1b631085 100644 --- a/src/libs/libbib/linear.cc +++ b/src/libs/libbib/linear.cc @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2000 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. diff --git a/src/libs/libbib/map.c b/src/libs/libbib/map.c index ee5d0087..531d8670 100644 --- a/src/libs/libbib/map.c +++ b/src/libs/libbib/map.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2000 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. diff --git a/src/libs/libbib/search.cc b/src/libs/libbib/search.cc index 1e027c60..dde55d57 100644 --- a/src/libs/libbib/search.cc +++ b/src/libs/libbib/search.cc @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2000 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. diff --git a/src/libs/libgroff/Makefile.sub b/src/libs/libgroff/Makefile.sub index ff5c655c..007102c7 100644 --- a/src/libs/libgroff/Makefile.sub +++ b/src/libs/libgroff/Makefile.sub @@ -19,6 +19,7 @@ OBJS=\ lineno.o \ macropath.o \ maxfilename.o \ + mksdir.o \ nametoindex.o \ new.o \ prime.o \ @@ -28,6 +29,7 @@ OBJS=\ string.o \ strsave.o \ tmpfile.o \ + tmpname.o \ iftoa.o \ itoa.o \ matherr.o \ @@ -51,6 +53,8 @@ CCSRCS=\ $(srcdir)/lineno.cc \ $(srcdir)/macropath.cc \ $(srcdir)/maxfilename.cc \ + $(srcdir)/mksdir.cc \ + $(srcdir)/mkstemp.cc \ $(srcdir)/nametoindex.cc \ $(srcdir)/new.cc \ $(srcdir)/prime.cc \ @@ -60,6 +64,7 @@ CCSRCS=\ $(srcdir)/string.cc \ $(srcdir)/strsave.cc \ $(srcdir)/tmpfile.cc \ + $(srcdir)/tmpname.cc \ version.cc CSRCS=\ $(srcdir)/fmod.c \ diff --git a/src/libs/libgroff/fontfile.cc b/src/libs/libgroff/fontfile.cc index cc1ad2c4..95cf6551 100644 --- a/src/libs/libgroff/fontfile.cc +++ b/src/libs/libgroff/fontfile.cc @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2000 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. diff --git a/src/libs/libgroff/mksdir.cc b/src/libs/libgroff/mksdir.cc new file mode 100644 index 00000000..bf4d300b --- /dev/null +++ b/src/libs/libgroff/mksdir.cc @@ -0,0 +1,34 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + Written by Werner Lemberg (wl@gnu.org) + +This file is part of groff. + +groff is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +groff is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with groff; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +/* This file is heavily based on the file mkstemp.c which is part of the + fileutils package. */ + + +extern int gen_tempname(char *, int = 0); + +/* Generate a unique temporary directory name from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the filename unique. + Then open the directory and return a fd. */ +int mksdir(char *tmpl) +{ + return gen_tempname(tmpl, 1); +} diff --git a/src/libs/libgroff/mkstemp.cc b/src/libs/libgroff/mkstemp.cc new file mode 100644 index 00000000..cd2717c3 --- /dev/null +++ b/src/libs/libgroff/mkstemp.cc @@ -0,0 +1,34 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + Written by Werner Lemberg (wl@gnu.org) + +This file is part of groff. + +groff is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +groff is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with groff; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +/* This file is heavily based on the file mkstemp.c which is part of the + fileutils package. */ + + +extern int gen_tempname(char *, int); + +/* Generate a unique temporary file name from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the filename unique. + Then open the file and return a fd. */ +int mkstemp(char *tmpl) +{ + return gen_tempname(tmpl, 0); +} diff --git a/src/libs/libgroff/new.cc b/src/libs/libgroff/new.cc index 8d98591a..9933cc45 100644 --- a/src/libs/libgroff/new.cc +++ b/src/libs/libgroff/new.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2001 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. diff --git a/src/libs/libgroff/tmpfile.cc b/src/libs/libgroff/tmpfile.cc index 4a53a06b..fdce09ee 100644 --- a/src/libs/libgroff/tmpfile.cc +++ b/src/libs/libgroff/tmpfile.cc @@ -30,12 +30,6 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "error.h" #include "nonposix.h" -#ifndef HAVE_MKSTEMP_PROTO -extern "C" { - extern int mkstemp (char *); -} -#endif - // If this is set, create temporary files there #define GROFF_TMPDIR_ENVVAR "GROFF_TMPDIR" // otherwise if this is set, create temporary files there @@ -161,8 +155,6 @@ FILE *xtmpfile(char **namep, int do_unlink) { char *templ = xtmptemplate(postfix_long, postfix_short); - -#ifdef HAVE_MKSTEMP errno = 0; int fd = mkstemp(templ); if (fd < 0) @@ -171,14 +163,6 @@ FILE *xtmpfile(char **namep, FILE *fp = fdopen(fd, FOPEN_RWB); // many callers of xtmpfile use binary I/O if (!fp) fatal("fdopen: %1", strerror(errno)); -#else /* not HAVE_MKSTEMP */ - if (!mktemp(templ) || !templ[0]) - fatal("cannot create file name for temporary file"); - errno = 0; - FILE *fp = fopen(templ, FOPEN_RWB); - if (!fp) - fatal("cannot open `%1': %2", templ, strerror(errno)); -#endif /* not HAVE_MKSTEMP */ if (do_unlink) add_tmp_file(templ); if (namep) diff --git a/src/libs/libgroff/tmpname.cc b/src/libs/libgroff/tmpname.cc new file mode 100644 index 00000000..bd0e3a07 --- /dev/null +++ b/src/libs/libgroff/tmpname.cc @@ -0,0 +1,107 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + Written by Werner Lemberg (wl@gnu.org) + +This file is part of groff. + +groff is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +groff is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with groff; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +/* This file is heavily based on the function __gen_tempname() in the + file tempname.c which is part of the fileutils package. */ + + +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <stdio.h> + +#include "posix.h" +#include "nonposix.h" + +#ifndef TMP_MAX +# define TMP_MAX 238328 +#endif + +#if HAVE_SYS_TIME_H +# include <sys/time.h> +#endif + +#if HAVE_STDINT_H +# include <stdint.h> +#endif + +/* Use the widest available unsigned type if uint64_t is not + available. The algorithm below extracts a number less than 62**6 + (approximately 2**35.725) from uint64_t, so ancient hosts where + uintmax_t is only 32 bits lose about 3.725 bits of randomness, + which is better than not having mkstemp at all. */ +#if !defined UINT64_MAX && !defined uint64_t +# define uint64_t uintmax_t +#endif + +/* These are the characters used in temporary filenames. */ +static const char letters[] = +"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + +int gen_tempname(char *tmpl, int dir) +{ + static uint64_t value; + + size_t len = strlen(tmpl); + if (len < 6 || strcmp(&tmpl[len - 6], "XXXXXX")) + return -1; /* EINVAL */ + + /* This is where the Xs start. */ + char *XXXXXX = &tmpl[len - 6]; + + /* Get some more or less random data. */ +#if HAVE_GETTIMEOFDAY + timeval tv; + gettimeofday(&tv, NULL); + uint64_t random_time_bits = ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec; +#else + uint64_t random_time_bits = time(NULL); +#endif + value += random_time_bits ^ getpid(); + + for (int count = 0; count < TMP_MAX; value += 7777, ++count) { + uint64_t v = value; + + /* Fill in the random bits. */ + XXXXXX[0] = letters[v % 62]; + v /= 62; + XXXXXX[1] = letters[v % 62]; + v /= 62; + XXXXXX[2] = letters[v % 62]; + v /= 62; + XXXXXX[3] = letters[v % 62]; + v /= 62; + XXXXXX[4] = letters[v % 62]; + v /= 62; + XXXXXX[5] = letters[v % 62]; + + int fd = dir ? mkdir(tmpl, S_IRUSR | S_IWUSR | S_IXUSR) + : open(tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); + + if (fd >= 0) + return fd; + else if (errno != EEXIST) + return -1; + } + + /* We got out of the loop because we ran out of combinations to try. */ + return -1; /* EEXIST */ +} |