1
/* Various functions of utilitarian nature.
2
Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001
3
Free Software Foundation, Inc.
5
This file is part of GNU Wget.
7
GNU Wget is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or
10
(at your option) any later version.
12
GNU Wget is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with Wget; if not, write to the Free Software
19
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
In addition, as a special exception, the Free Software Foundation
22
gives permission to link the code of its release of Wget with the
23
OpenSSL project's "OpenSSL" library (or with modified versions of it
24
that use the same license as the "OpenSSL" library), and distribute
25
the linked executables. You must obey the GNU General Public License
26
in all respects for all of the code used other than "OpenSSL". If you
27
modify this file, you may extend this exception to your version of the
28
file, but you are not obligated to do so. If you do not wish to do
29
so, delete this exception statement from your version. */
37
#else /* not HAVE_STRING_H */
39
#endif /* not HAVE_STRING_H */
40
#include <sys/types.h>
45
# include <sys/mman.h>
54
#ifdef HAVE_SYS_UTIME_H
55
# include <sys/utime.h>
59
# include <libc.h> /* for access() */
64
/* For TIOCGWINSZ and friends: */
65
#ifdef HAVE_SYS_IOCTL_H
66
# include <sys/ioctl.h>
72
/* Needed for run_with_timeout. */
73
#undef USE_SIGNAL_TIMEOUT
81
#ifndef HAVE_SIGSETJMP
82
/* If sigsetjmp is a macro, configure won't pick it up. */
84
# define HAVE_SIGSETJMP
89
# ifdef HAVE_SIGSETJMP
90
# define USE_SIGNAL_TIMEOUT
93
# define USE_SIGNAL_TIMEOUT
105
/* This section implements several wrappers around the basic
106
allocation routines. This is done for two reasons: first, so that
107
the callers of these functions need not consistently check for
108
errors. If there is not enough virtual memory for running Wget,
109
something is seriously wrong, and Wget exits with an appropriate
112
The second reason why these are useful is that, if DEBUG_MALLOC is
113
defined, they also provide a handy (if crude) malloc debugging
114
interface that checks memory leaks. */
116
/* Croak the fatal memory error and bail out with non-zero exit
119
memfatal (const char *what)
121
/* Make sure we don't try to store part of the log line, and thus
123
log_set_save_context (0);
124
logprintf (LOG_ALWAYS, _("%s: %s: Not enough memory.\n"), exec_name, what);
128
/* These functions end with _real because they need to be
129
distinguished from the debugging functions, and from the macros.
132
If memory debugging is not turned on, wget.h defines these:
134
#define xmalloc xmalloc_real
135
#define xrealloc xrealloc_real
136
#define xstrdup xstrdup_real
139
In case of memory debugging, the definitions are a bit more
140
complex, because we want to provide more information, *and* we want
141
to call the debugging code. (The former is the reason why xmalloc
142
and friends need to be macros in the first place.) Then it looks
145
#define xmalloc(a) xmalloc_debug (a, __FILE__, __LINE__)
146
#define xfree(a) xfree_debug (a, __FILE__, __LINE__)
147
#define xrealloc(a, b) xrealloc_debug (a, b, __FILE__, __LINE__)
148
#define xstrdup(a) xstrdup_debug (a, __FILE__, __LINE__)
150
Each of the *_debug function does its magic and calls the real one. */
153
# define STATIC_IF_DEBUG static
155
# define STATIC_IF_DEBUG
158
STATIC_IF_DEBUG void *
159
xmalloc_real (size_t size)
161
void *ptr = malloc (size);
167
STATIC_IF_DEBUG void *
168
xrealloc_real (void *ptr, size_t newsize)
172
/* Not all Un*xes have the feature of realloc() that calling it with
173
a NULL-pointer is the same as malloc(), but it is easy to
176
newptr = realloc (ptr, newsize);
178
newptr = malloc (newsize);
180
memfatal ("realloc");
184
STATIC_IF_DEBUG char *
185
xstrdup_real (const char *s)
191
copy = malloc (l + 1);
194
memcpy (copy, s, l + 1);
195
#else /* HAVE_STRDUP */
199
#endif /* HAVE_STRDUP */
206
/* Crude home-grown routines for debugging some malloc-related
209
* Counting the number of malloc and free invocations, and reporting
210
the "balance", i.e. how many times more malloc was called than it
211
was the case with free.
213
* Making malloc store its entry into a simple array and free remove
214
stuff from that array. At the end, print the pointers which have
215
not been freed, along with the source file and the line number.
216
This also has the side-effect of detecting freeing memory that
219
Note that this kind of memory leak checking strongly depends on
220
every malloc() being followed by a free(), even if the program is
221
about to finish. Wget is careful to free the data structure it
222
allocated in init.c. */
224
static int malloc_count, free_count;
230
} malloc_debug[100000];
232
/* Both register_ptr and unregister_ptr take O(n) operations to run,
233
which can be a real problem. It would be nice to use a hash table
234
for malloc_debug, but the functions in hash.c are not suitable
235
because they can call malloc() themselves. Maybe it would work if
236
the hash table were preallocated to a huge size, and if we set the
237
rehash threshold to 1.0. */
239
/* Register PTR in malloc_debug. Abort if this is not possible
240
(presumably due to the number of current allocations exceeding the
241
size of malloc_debug.) */
244
register_ptr (void *ptr, const char *file, int line)
247
for (i = 0; i < countof (malloc_debug); i++)
248
if (malloc_debug[i].ptr == NULL)
250
malloc_debug[i].ptr = ptr;
251
malloc_debug[i].file = file;
252
malloc_debug[i].line = line;
258
/* Unregister PTR from malloc_debug. Abort if PTR is not present in
259
malloc_debug. (This catches calling free() with a bogus pointer.) */
262
unregister_ptr (void *ptr)
265
for (i = 0; i < countof (malloc_debug); i++)
266
if (malloc_debug[i].ptr == ptr)
268
malloc_debug[i].ptr = NULL;
274
/* Print the malloc debug stats that can be gathered from the above
275
information. Currently this is the count of mallocs, frees, the
276
difference between the two, and the dump of the contents of
277
malloc_debug. The last part are the memory leaks. */
280
print_malloc_debug_stats (void)
283
printf ("\nMalloc: %d\nFree: %d\nBalance: %d\n\n",
284
malloc_count, free_count, malloc_count - free_count);
285
for (i = 0; i < countof (malloc_debug); i++)
286
if (malloc_debug[i].ptr != NULL)
287
printf ("0x%08ld: %s:%d\n", (long)malloc_debug[i].ptr,
288
malloc_debug[i].file, malloc_debug[i].line);
292
xmalloc_debug (size_t size, const char *source_file, int source_line)
294
void *ptr = xmalloc_real (size);
296
register_ptr (ptr, source_file, source_line);
301
xfree_debug (void *ptr, const char *source_file, int source_line)
303
assert (ptr != NULL);
305
unregister_ptr (ptr);
310
xrealloc_debug (void *ptr, size_t newsize, const char *source_file, int source_line)
312
void *newptr = xrealloc_real (ptr, newsize);
316
register_ptr (newptr, source_file, source_line);
318
else if (newptr != ptr)
320
unregister_ptr (ptr);
321
register_ptr (newptr, source_file, source_line);
327
xstrdup_debug (const char *s, const char *source_file, int source_line)
329
char *copy = xstrdup_real (s);
331
register_ptr (copy, source_file, source_line);
335
#endif /* DEBUG_MALLOC */
337
/* Utility function: like xstrdup(), but also lowercases S. */
340
xstrdup_lower (const char *s)
342
char *copy = xstrdup (s);
349
/* Return a count of how many times CHR occurs in STRING. */
352
count_char (const char *string, char chr)
356
for (p = string; *p; p++)
362
/* Copy the string formed by two pointers (one on the beginning, other
363
on the char after the last char) to a new, malloc-ed location.
366
strdupdelim (const char *beg, const char *end)
368
char *res = (char *)xmalloc (end - beg + 1);
369
memcpy (res, beg, end - beg);
370
res[end - beg] = '\0';
374
/* Parse a string containing comma-separated elements, and return a
375
vector of char pointers with the elements. Spaces following the
376
commas are ignored. */
378
sepstring (const char *s)
392
res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
393
res[i] = strdupdelim (p, s);
396
/* Skip the blanks following the ','. */
404
res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
405
res[i] = strdupdelim (p, s);
410
/* Return pointer to a static char[] buffer in which zero-terminated
411
string-representation of TM (in form hh:mm:ss) is printed.
413
If TM is non-NULL, the current time-in-seconds will be stored
416
(#### This is misleading: one would expect TM would be used instead
417
of the current time in that case. This design was probably
418
influenced by the design time(2), and should be changed at some
419
points. No callers use non-NULL TM anyway.) */
422
time_str (time_t *tm)
424
static char output[15];
426
time_t secs = time (tm);
430
/* In case of error, return the empty string. Maybe we should
431
just abort if this happens? */
435
ptm = localtime (&secs);
436
sprintf (output, "%02d:%02d:%02d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
440
/* Like the above, but include the date: YYYY-MM-DD hh:mm:ss. */
443
datetime_str (time_t *tm)
445
static char output[20]; /* "YYYY-MM-DD hh:mm:ss" + \0 */
447
time_t secs = time (tm);
451
/* In case of error, return the empty string. Maybe we should
452
just abort if this happens? */
456
ptm = localtime (&secs);
457
sprintf (output, "%04d-%02d-%02d %02d:%02d:%02d",
458
ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,
459
ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
463
/* The Windows versions of the following two functions are defined in
468
fork_to_background (void)
471
/* Whether we arrange our own version of opt.lfilename here. */
476
opt.lfilename = unique_name (DEFAULT_LOGFILE, 0);
488
/* parent, no error */
489
printf (_("Continuing in background, pid %d.\n"), (int)pid);
491
printf (_("Output will be written to `%s'.\n"), opt.lfilename);
492
exit (0); /* #### should we use _exit()? */
495
/* child: give up the privileges and keep running. */
497
freopen ("/dev/null", "r", stdin);
498
freopen ("/dev/null", "w", stdout);
499
freopen ("/dev/null", "w", stderr);
501
#endif /* not WINDOWS */
503
/* "Touch" FILE, i.e. make its atime and mtime equal to the time
504
specified with TM. */
506
touch (const char *file, time_t tm)
508
#ifdef HAVE_STRUCT_UTIMBUF
509
struct utimbuf times;
510
times.actime = times.modtime = tm;
513
times[0] = times[1] = tm;
516
if (utime (file, ×) == -1)
517
logprintf (LOG_NOTQUIET, "utime(%s): %s\n", file, strerror (errno));
520
/* Checks if FILE is a symbolic link, and removes it if it is. Does
521
nothing under MS-Windows. */
523
remove_link (const char *file)
528
if (lstat (file, &st) == 0 && S_ISLNK (st.st_mode))
530
DEBUGP (("Unlinking %s (symlink).\n", file));
533
logprintf (LOG_VERBOSE, _("Failed to unlink symlink `%s': %s\n"),
534
file, strerror (errno));
539
/* Does FILENAME exist? This is quite a lousy implementation, since
540
it supplies no error codes -- only a yes-or-no answer. Thus it
541
will return that a file does not exist if, e.g., the directory is
542
unreadable. I don't mind it too much currently, though. The
543
proper way should, of course, be to have a third, error state,
544
other than true/false, but that would introduce uncalled-for
545
additional complexity to the callers. */
547
file_exists_p (const char *filename)
550
return access (filename, F_OK) >= 0;
553
return stat (filename, &buf) >= 0;
557
/* Returns 0 if PATH is a directory, 1 otherwise (any kind of file).
558
Returns 0 on error. */
560
file_non_directory_p (const char *path)
563
/* Use lstat() rather than stat() so that symbolic links pointing to
564
directories can be identified correctly. */
565
if (lstat (path, &buf) != 0)
567
return S_ISDIR (buf.st_mode) ? 0 : 1;
570
/* Return the size of file named by FILENAME, or -1 if it cannot be
571
opened or seeked into. */
573
file_size (const char *filename)
576
/* We use fseek rather than stat to determine the file size because
577
that way we can also verify whether the file is readable.
578
Inspired by the POST patch by Arnaud Wylie. */
579
FILE *fp = fopen (filename, "rb");
582
fseek (fp, 0, SEEK_END);
588
/* stat file names named PREFIX.1, PREFIX.2, etc., until one that
589
doesn't exist is found. Return a freshly allocated copy of the
593
unique_name_1 (const char *prefix)
596
int plen = strlen (prefix);
597
char *template = (char *)alloca (plen + 1 + 24);
598
char *template_tail = template + plen;
600
memcpy (template, prefix, plen);
601
*template_tail++ = '.';
604
number_to_string (template_tail, count++);
605
while (file_exists_p (template));
607
return xstrdup (template);
610
/* Return a unique file name, based on FILE.
612
More precisely, if FILE doesn't exist, it is returned unmodified.
613
If not, FILE.1 is tried, then FILE.2, etc. The first FILE.<number>
614
file name that doesn't exist is returned.
616
The resulting file is not created, only verified that it didn't
617
exist at the point in time when the function was called.
618
Therefore, where security matters, don't rely that the file created
619
by this function exists until you open it with O_EXCL or
622
If ALLOW_PASSTHROUGH is 0, it always returns a freshly allocated
623
string. Otherwise, it may return FILE if the file doesn't exist
624
(and therefore doesn't need changing). */
627
unique_name (const char *file, int allow_passthrough)
629
/* If the FILE itself doesn't exist, return it without
631
if (!file_exists_p (file))
632
return allow_passthrough ? (char *)file : xstrdup (file);
634
/* Otherwise, find a numeric suffix that results in unused file name
636
return unique_name_1 (file);
639
/* Create DIRECTORY. If some of the pathname components of DIRECTORY
640
are missing, create them first. In case any mkdir() call fails,
641
return its error status. Returns 0 on successful completion.
643
The behaviour of this function should be identical to the behaviour
644
of `mkdir -p' on systems where mkdir supports the `-p' option. */
646
make_directory (const char *directory)
653
/* Make a copy of dir, to be able to write to it. Otherwise, the
654
function is unsafe if called with a read-only char *argument. */
655
STRDUP_ALLOCA (dir, directory);
657
/* If the first character of dir is '/', skip it (and thus enable
658
creation of absolute-pathname directories. */
659
for (i = (*dir == '/'); 1; ++i)
661
for (; dir[i] && dir[i] != '/'; i++)
666
/* Check whether the directory already exists. Allow creation of
667
of intermediate directories to fail, as the initial path components
668
are not necessarily directories! */
669
if (!file_exists_p (dir))
670
ret = mkdir (dir, 0777);
681
/* Merge BASE with FILE. BASE can be a directory or a file name, FILE
682
should be a file name.
684
file_merge("/foo/bar", "baz") => "/foo/baz"
685
file_merge("/foo/bar/", "baz") => "/foo/bar/baz"
686
file_merge("foo", "bar") => "bar"
688
In other words, it's a simpler and gentler version of uri_merge_1. */
691
file_merge (const char *base, const char *file)
694
const char *cut = (const char *)strrchr (base, '/');
697
return xstrdup (file);
699
result = (char *)xmalloc (cut - base + 1 + strlen (file) + 1);
700
memcpy (result, base, cut - base);
701
result[cut - base] = '/';
702
strcpy (result + (cut - base) + 1, file);
707
static int in_acclist PARAMS ((const char *const *, const char *, int));
709
/* Determine whether a file is acceptable to be followed, according to
710
lists of patterns to accept/reject. */
712
acceptable (const char *s)
716
while (l && s[l] != '/')
723
return (in_acclist ((const char *const *)opt.accepts, s, 1)
724
&& !in_acclist ((const char *const *)opt.rejects, s, 1));
726
return in_acclist ((const char *const *)opt.accepts, s, 1);
728
else if (opt.rejects)
729
return !in_acclist ((const char *const *)opt.rejects, s, 1);
733
/* Compare S1 and S2 frontally; S2 must begin with S1. E.g. if S1 is
734
`/something', frontcmp() will return 1 only if S2 begins with
735
`/something'. Otherwise, 0 is returned. */
737
frontcmp (const char *s1, const char *s2)
739
for (; *s1 && *s2 && (*s1 == *s2); ++s1, ++s2);
743
/* Iterate through STRLIST, and return the first element that matches
744
S, through wildcards or front comparison (as appropriate). */
746
proclist (char **strlist, const char *s, enum accd flags)
750
for (x = strlist; *x; x++)
751
if (has_wildcards_p (*x))
753
if (fnmatch (*x, s, FNM_PATHNAME) == 0)
758
char *p = *x + ((flags & ALLABS) && (**x == '/')); /* Remove '/' */
765
/* Returns whether DIRECTORY is acceptable for download, wrt the
766
include/exclude lists.
768
If FLAGS is ALLABS, the leading `/' is ignored in paths; relative
769
and absolute paths may be freely intermixed. */
771
accdir (const char *directory, enum accd flags)
773
/* Remove starting '/'. */
774
if (flags & ALLABS && *directory == '/')
778
if (!proclist (opt.includes, directory, flags))
783
if (proclist (opt.excludes, directory, flags))
789
/* Return non-zero if STRING ends with TAIL. For instance:
791
match_tail ("abc", "bc", 0) -> 1
792
match_tail ("abc", "ab", 0) -> 0
793
match_tail ("abc", "abc", 0) -> 1
795
If FOLD_CASE_P is non-zero, the comparison will be
799
match_tail (const char *string, const char *tail, int fold_case_p)
803
/* We want this to be fast, so we code two loops, one with
804
case-folding, one without. */
808
for (i = strlen (string), j = strlen (tail); i >= 0 && j >= 0; i--, j--)
809
if (string[i] != tail[j])
814
for (i = strlen (string), j = strlen (tail); i >= 0 && j >= 0; i--, j--)
815
if (TOLOWER (string[i]) != TOLOWER (tail[j]))
819
/* If the tail was exhausted, the match was succesful. */
826
/* Checks whether string S matches each element of ACCEPTS. A list
827
element are matched either with fnmatch() or match_tail(),
828
according to whether the element contains wildcards or not.
830
If the BACKWARD is 0, don't do backward comparison -- just compare
833
in_acclist (const char *const *accepts, const char *s, int backward)
835
for (; *accepts; accepts++)
837
if (has_wildcards_p (*accepts))
839
/* fnmatch returns 0 if the pattern *does* match the
841
if (fnmatch (*accepts, s, 0) == 0)
848
if (match_tail (s, *accepts, 0))
853
if (!strcmp (s, *accepts))
861
/* Return the location of STR's suffix (file extension). Examples:
862
suffix ("foo.bar") -> "bar"
863
suffix ("foo.bar.baz") -> "baz"
864
suffix ("/foo/bar") -> NULL
865
suffix ("/foo.bar/baz") -> NULL */
867
suffix (const char *str)
871
for (i = strlen (str); i && str[i] != '/' && str[i] != '.'; i--)
875
return (char *)str + i;
880
/* Return non-zero if S contains globbing wildcards (`*', `?', `[' or
884
has_wildcards_p (const char *s)
887
if (*s == '*' || *s == '?' || *s == '[' || *s == ']')
892
/* Return non-zero if FNAME ends with a typical HTML suffix. The
893
following (case-insensitive) suffixes are presumed to be HTML files:
897
?html (`?' matches one character)
899
#### CAVEAT. This is not necessarily a good indication that FNAME
900
refers to a file that contains HTML! */
902
has_html_suffix_p (const char *fname)
906
if ((suf = suffix (fname)) == NULL)
908
if (!strcasecmp (suf, "html"))
910
if (!strcasecmp (suf, "htm"))
912
if (suf[0] && !strcasecmp (suf + 1, "html"))
917
/* Read a line from FP and return the pointer to freshly allocated
918
storage. The storage space is obtained through malloc() and should
919
be freed with free() when it is no longer needed.
921
The length of the line is not limited, except by available memory.
922
The newline character at the end of line is retained. The line is
923
terminated with a zero character.
925
After end-of-file is encountered without anything being read, NULL
926
is returned. NULL is also returned on error. To distinguish
927
between these two cases, use the stdio function ferror(). */
930
read_whole_line (FILE *fp)
934
char *line = (char *)xmalloc (bufsize);
936
while (fgets (line + length, bufsize - length, fp))
938
length += strlen (line + length);
940
/* Possible for example when reading from a binary file where
941
a line begins with \0. */
944
if (line[length - 1] == '\n')
947
/* fgets() guarantees to read the whole line, or to use up the
948
space we've given it. We can double the buffer
951
line = xrealloc (line, bufsize);
953
if (length == 0 || ferror (fp))
958
if (length + 1 < bufsize)
959
/* Relieve the memory from our exponential greediness. We say
960
`length + 1' because the terminating \0 is not included in
961
LENGTH. We don't need to zero-terminate the string ourselves,
962
though, because fgets() does that. */
963
line = xrealloc (line, length + 1);
967
/* Read FILE into memory. A pointer to `struct file_memory' are
968
returned; use struct element `content' to access file contents, and
969
the element `length' to know the file length. `content' is *not*
970
zero-terminated, and you should *not* read or write beyond the [0,
971
length) range of characters.
973
After you are done with the file contents, call read_file_free to
976
Depending on the operating system and the type of file that is
977
being read, read_file() either mmap's the file into memory, or
978
reads the file into the core using read().
980
If file is named "-", fileno(stdin) is used for reading instead.
981
If you want to read from a real file named "-", use "./-" instead. */
984
read_file (const char *file)
987
struct file_memory *fm;
989
int inhibit_close = 0;
991
/* Some magic in the finest tradition of Perl and its kin: if FILE
992
is "-", just use stdin. */
997
/* Note that we don't inhibit mmap() in this case. If stdin is
998
redirected from a regular file, mmap() will still work. */
1001
fd = open (file, O_RDONLY);
1004
fm = xmalloc (sizeof (struct file_memory));
1009
if (fstat (fd, &buf) < 0)
1011
fm->length = buf.st_size;
1012
/* NOTE: As far as I know, the callers of this function never
1013
modify the file text. Relying on this would enable us to
1014
specify PROT_READ and MAP_SHARED for a marginal gain in
1015
efficiency, but at some cost to generality. */
1016
fm->content = mmap (NULL, fm->length, PROT_READ | PROT_WRITE,
1017
MAP_PRIVATE, fd, 0);
1018
if (fm->content == (char *)MAP_FAILED)
1028
/* The most common reason why mmap() fails is that FD does not point
1029
to a plain file. However, it's also possible that mmap() doesn't
1030
work for a particular type of file. Therefore, whenever mmap()
1031
fails, we just fall back to the regular method. */
1032
#endif /* HAVE_MMAP */
1035
size = 512; /* number of bytes fm->contents can
1036
hold at any given time. */
1037
fm->content = xmalloc (size);
1041
if (fm->length > size / 2)
1043
/* #### I'm not sure whether the whole exponential-growth
1044
thing makes sense with kernel read. On Linux at least,
1045
read() refuses to read more than 4K from a file at a
1046
single chunk anyway. But other Unixes might optimize it
1047
better, and it doesn't *hurt* anything, so I'm leaving
1050
/* Normally, we grow SIZE exponentially to make the number
1051
of calls to read() and realloc() logarithmic in relation
1052
to file size. However, read() can read an amount of data
1053
smaller than requested, and it would be unreasonable to
1054
double SIZE every time *something* was read. Therefore,
1055
we double SIZE only when the length exceeds half of the
1056
entire allocated size. */
1058
fm->content = xrealloc (fm->content, size);
1060
nread = read (fd, fm->content + fm->length, size - fm->length);
1062
/* Successful read. */
1063
fm->length += nread;
1073
if (size > fm->length && fm->length != 0)
1074
/* Due to exponential growth of fm->content, the allocated region
1075
might be much larger than what is actually needed. */
1076
fm->content = xrealloc (fm->content, fm->length);
1083
xfree (fm->content);
1088
/* Release the resources held by FM. Specifically, this calls
1089
munmap() or xfree() on fm->content, depending whether mmap or
1090
malloc/read were used to read in the file. It also frees the
1091
memory needed to hold the FM structure itself. */
1094
read_file_free (struct file_memory *fm)
1099
munmap (fm->content, fm->length);
1104
xfree (fm->content);
1109
/* Free the pointers in a NULL-terminated vector of pointers, then
1110
free the pointer itself. */
1112
free_vec (char **vec)
1123
/* Append vector V2 to vector V1. The function frees V2 and
1124
reallocates V1 (thus you may not use the contents of neither
1125
pointer after the call). If V1 is NULL, V2 is returned. */
1127
merge_vecs (char **v1, char **v2)
1137
/* To avoid j == 0 */
1142
for (i = 0; v1[i]; i++);
1144
for (j = 0; v2[j]; j++);
1145
/* Reallocate v1. */
1146
v1 = (char **)xrealloc (v1, (i + j + 1) * sizeof (char **));
1147
memcpy (v1 + i, v2, (j + 1) * sizeof (char *));
1152
/* A set of simple-minded routines to store strings in a linked list.
1153
This used to also be used for searching, but now we have hash
1156
/* It's a shame that these simple things like linked lists and hash
1157
tables (see hash.c) need to be implemented over and over again. It
1158
would be nice to be able to use the routines from glib -- see
1159
www.gtk.org for details. However, that would make Wget depend on
1160
glib, and I want to avoid dependencies to external libraries for
1161
reasons of convenience and portability (I suspect Wget is more
1162
portable than anything ever written for Gnome). */
1164
/* Append an element to the list. If the list has a huge number of
1165
elements, this can get slow because it has to find the list's
1166
ending. If you think you have to call slist_append in a loop,
1167
think about calling slist_prepend() followed by slist_nreverse(). */
1170
slist_append (slist *l, const char *s)
1172
slist *newel = (slist *)xmalloc (sizeof (slist));
1175
newel->string = xstrdup (s);
1180
/* Find the last element. */
1187
/* Prepend S to the list. Unlike slist_append(), this is O(1). */
1190
slist_prepend (slist *l, const char *s)
1192
slist *newel = (slist *)xmalloc (sizeof (slist));
1193
newel->string = xstrdup (s);
1198
/* Destructively reverse L. */
1201
slist_nreverse (slist *l)
1206
slist *next = l->next;
1214
/* Is there a specific entry in the list? */
1216
slist_contains (slist *l, const char *s)
1218
for (; l; l = l->next)
1219
if (!strcmp (l->string, s))
1224
/* Free the whole slist. */
1226
slist_free (slist *l)
1237
/* Sometimes it's useful to create "sets" of strings, i.e. special
1238
hash tables where you want to store strings as keys and merely
1239
query for their existence. Here is a set of utility routines that
1240
makes that transparent. */
1243
string_set_add (struct hash_table *ht, const char *s)
1245
/* First check whether the set element already exists. If it does,
1246
do nothing so that we don't have to free() the old element and
1247
then strdup() a new one. */
1248
if (hash_table_contains (ht, s))
1251
/* We use "1" as value. It provides us a useful and clear arbitrary
1252
value, and it consumes no memory -- the pointers to the same
1253
string "1" will be shared by all the key-value pairs in all `set'
1255
hash_table_put (ht, xstrdup (s), "1");
1258
/* Synonym for hash_table_contains... */
1261
string_set_contains (struct hash_table *ht, const char *s)
1263
return hash_table_contains (ht, s);
1267
string_set_free_mapper (void *key, void *value_ignored, void *arg_ignored)
1274
string_set_free (struct hash_table *ht)
1276
hash_table_map (ht, string_set_free_mapper, NULL);
1277
hash_table_destroy (ht);
1281
free_keys_and_values_mapper (void *key, void *value, void *arg_ignored)
1288
/* Another utility function: call free() on all keys and values of HT. */
1291
free_keys_and_values (struct hash_table *ht)
1293
hash_table_map (ht, free_keys_and_values_mapper, NULL);
1297
/* Engine for legible and legible_large_int; add thousand separators
1298
to numbers printed in strings. */
1301
legible_1 (const char *repr)
1303
static char outbuf[48];
1308
/* Reset the pointers. */
1312
/* Ignore the sign for the purpose of adding thousand
1319
/* How many digits before the first separator? */
1320
mod = strlen (inptr) % 3;
1322
for (i = 0; i < mod; i++)
1323
*outptr++ = inptr[i];
1324
/* Now insert the rest of them, putting separator before every
1326
for (i1 = i, i = 0; inptr[i1]; i++, i1++)
1328
if (i % 3 == 0 && i1 != 0)
1330
*outptr++ = inptr[i1];
1332
/* Zero-terminate the string. */
1337
/* Legible -- return a static pointer to the legibly printed long. */
1343
/* Print the number into the buffer. */
1344
number_to_string (inbuf, l);
1345
return legible_1 (inbuf);
1348
/* Write a string representation of LARGE_INT NUMBER into the provided
1349
buffer. The buffer should be able to accept 24 characters,
1350
including the terminating zero.
1352
It would be dangerous to use sprintf, because the code wouldn't
1353
work on a machine with gcc-provided long long support, but without
1354
libc support for "%lld". However, such platforms will typically
1355
not have snprintf and will use our version, which does support
1356
"%lld" where long longs are available. */
1359
large_int_to_string (char *buffer, LARGE_INT number)
1361
snprintf (buffer, 24, LARGE_INT_FMT, number);
1364
/* The same as legible(), but works on LARGE_INT. */
1367
legible_large_int (LARGE_INT l)
1370
large_int_to_string (inbuf, l);
1371
return legible_1 (inbuf);
1374
/* Count the digits in a (long) integer. */
1376
numdigit (long number)
1384
while ((number /= 10) > 0)
1389
/* A half-assed implementation of INT_MAX on machines that don't
1390
bother to define one. */
1392
# define INT_MAX ((int) ~((unsigned)1 << 8 * sizeof (int) - 1))
1395
#define ONE_DIGIT(figure) *p++ = n / (figure) + '0'
1396
#define ONE_DIGIT_ADVANCE(figure) (ONE_DIGIT (figure), n %= (figure))
1398
#define DIGITS_1(figure) ONE_DIGIT (figure)
1399
#define DIGITS_2(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_1 ((figure) / 10)
1400
#define DIGITS_3(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_2 ((figure) / 10)
1401
#define DIGITS_4(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_3 ((figure) / 10)
1402
#define DIGITS_5(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_4 ((figure) / 10)
1403
#define DIGITS_6(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_5 ((figure) / 10)
1404
#define DIGITS_7(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_6 ((figure) / 10)
1405
#define DIGITS_8(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_7 ((figure) / 10)
1406
#define DIGITS_9(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_8 ((figure) / 10)
1407
#define DIGITS_10(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_9 ((figure) / 10)
1409
/* DIGITS_<11-20> are only used on machines with 64-bit longs. */
1411
#define DIGITS_11(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_10 ((figure) / 10)
1412
#define DIGITS_12(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_11 ((figure) / 10)
1413
#define DIGITS_13(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_12 ((figure) / 10)
1414
#define DIGITS_14(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_13 ((figure) / 10)
1415
#define DIGITS_15(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_14 ((figure) / 10)
1416
#define DIGITS_16(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_15 ((figure) / 10)
1417
#define DIGITS_17(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_16 ((figure) / 10)
1418
#define DIGITS_18(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_17 ((figure) / 10)
1419
#define DIGITS_19(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_18 ((figure) / 10)
1421
/* Print NUMBER to BUFFER in base 10. This should be completely
1422
equivalent to `sprintf(buffer, "%ld", number)', only much faster.
1424
The speedup may make a difference in programs that frequently
1425
convert numbers to strings. Some implementations of sprintf,
1426
particularly the one in GNU libc, have been known to be extremely
1427
slow compared to this function.
1429
Return the pointer to the location where the terminating zero was
1430
printed. (Equivalent to calling buffer+strlen(buffer) after the
1433
BUFFER should be big enough to accept as many bytes as you expect
1434
the number to take up. On machines with 64-bit longs the maximum
1435
needed size is 24 bytes. That includes the digits needed for the
1436
largest 64-bit number, the `-' sign in case it's negative, and the
1437
terminating '\0'. */
1440
number_to_string (char *buffer, long number)
1445
#if (SIZEOF_LONG != 4) && (SIZEOF_LONG != 8)
1446
/* We are running in a strange or misconfigured environment. Let
1447
sprintf cope with it. */
1448
sprintf (buffer, "%ld", n);
1449
p += strlen (buffer);
1450
#else /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1456
/* We cannot print a '-' and assign -n to n because -n would
1457
overflow. Let sprintf deal with this border case. */
1458
sprintf (buffer, "%ld", n);
1459
p += strlen (buffer);
1467
if (n < 10) { DIGITS_1 (1); }
1468
else if (n < 100) { DIGITS_2 (10); }
1469
else if (n < 1000) { DIGITS_3 (100); }
1470
else if (n < 10000) { DIGITS_4 (1000); }
1471
else if (n < 100000) { DIGITS_5 (10000); }
1472
else if (n < 1000000) { DIGITS_6 (100000); }
1473
else if (n < 10000000) { DIGITS_7 (1000000); }
1474
else if (n < 100000000) { DIGITS_8 (10000000); }
1475
else if (n < 1000000000) { DIGITS_9 (100000000); }
1476
#if SIZEOF_LONG == 4
1477
/* ``if (1)'' serves only to preserve editor indentation. */
1478
else if (1) { DIGITS_10 (1000000000); }
1479
#else /* SIZEOF_LONG != 4 */
1480
else if (n < 10000000000L) { DIGITS_10 (1000000000L); }
1481
else if (n < 100000000000L) { DIGITS_11 (10000000000L); }
1482
else if (n < 1000000000000L) { DIGITS_12 (100000000000L); }
1483
else if (n < 10000000000000L) { DIGITS_13 (1000000000000L); }
1484
else if (n < 100000000000000L) { DIGITS_14 (10000000000000L); }
1485
else if (n < 1000000000000000L) { DIGITS_15 (100000000000000L); }
1486
else if (n < 10000000000000000L) { DIGITS_16 (1000000000000000L); }
1487
else if (n < 100000000000000000L) { DIGITS_17 (10000000000000000L); }
1488
else if (n < 1000000000000000000L) { DIGITS_18 (100000000000000000L); }
1489
else { DIGITS_19 (1000000000000000000L); }
1490
#endif /* SIZEOF_LONG != 4 */
1493
#endif /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1499
#undef ONE_DIGIT_ADVANCE
1521
/* Support for timers. */
1523
#undef TIMER_WINDOWS
1524
#undef TIMER_GETTIMEOFDAY
1527
/* Depending on the OS and availability of gettimeofday(), one and
1528
only one of the above constants will be defined. Virtually all
1529
modern Unix systems will define TIMER_GETTIMEOFDAY; Windows will
1530
use TIMER_WINDOWS. TIMER_TIME is a catch-all method for
1531
non-Windows systems without gettimeofday.
1533
#### Perhaps we should also support ftime(), which exists on old
1534
BSD 4.2-influenced systems? (It also existed under MS DOS Borland
1535
C, if memory serves me.) */
1538
# define TIMER_WINDOWS
1539
#else /* not WINDOWS */
1540
# ifdef HAVE_GETTIMEOFDAY
1541
# define TIMER_GETTIMEOFDAY
1545
#endif /* not WINDOWS */
1547
#ifdef TIMER_GETTIMEOFDAY
1548
typedef struct timeval wget_sys_time;
1552
typedef time_t wget_sys_time;
1555
#ifdef TIMER_WINDOWS
1556
typedef ULARGE_INTEGER wget_sys_time;
1560
/* The starting point in time which, subtracted from the current
1561
time, yields elapsed time. */
1562
wget_sys_time start;
1564
/* The most recent elapsed time, calculated by wtimer_elapsed().
1565
Measured in milliseconds. */
1566
double elapsed_last;
1568
/* Approximately, the time elapsed between the true start of the
1569
measurement and the time represented by START. */
1570
double elapsed_pre_start;
1573
/* Allocate a timer. It is not legal to do anything with a freshly
1574
allocated timer, except call wtimer_reset() or wtimer_delete(). */
1577
wtimer_allocate (void)
1579
struct wget_timer *wt =
1580
(struct wget_timer *)xmalloc (sizeof (struct wget_timer));
1584
/* Allocate a new timer and reset it. Return the new timer. */
1589
struct wget_timer *wt = wtimer_allocate ();
1594
/* Free the resources associated with the timer. Its further use is
1598
wtimer_delete (struct wget_timer *wt)
1603
/* Store system time to WST. */
1606
wtimer_sys_set (wget_sys_time *wst)
1608
#ifdef TIMER_GETTIMEOFDAY
1609
gettimeofday (wst, NULL);
1616
#ifdef TIMER_WINDOWS
1617
/* We use GetSystemTime to get the elapsed time. MSDN warns that
1618
system clock adjustments can skew the output of GetSystemTime
1619
when used as a timer and gives preference to GetTickCount and
1620
high-resolution timers. But GetTickCount can overflow, and hires
1621
timers are typically used for profiling, not for regular time
1622
measurement. Since we handle clock skew anyway, we just use
1626
GetSystemTime (&st);
1628
/* As recommended by MSDN, we convert SYSTEMTIME to FILETIME, copy
1629
FILETIME to ULARGE_INTEGER, and use regular 64-bit integer
1630
arithmetic on that. */
1631
SystemTimeToFileTime (&st, &ft);
1632
wst->HighPart = ft.dwHighDateTime;
1633
wst->LowPart = ft.dwLowDateTime;
1637
/* Reset timer WT. This establishes the starting point from which
1638
wtimer_elapsed() will return the number of elapsed
1639
milliseconds. It is allowed to reset a previously used timer. */
1642
wtimer_reset (struct wget_timer *wt)
1644
/* Set the start time to the current time. */
1645
wtimer_sys_set (&wt->start);
1646
wt->elapsed_last = 0;
1647
wt->elapsed_pre_start = 0;
1651
wtimer_sys_diff (wget_sys_time *wst1, wget_sys_time *wst2)
1653
#ifdef TIMER_GETTIMEOFDAY
1654
return ((double)(wst1->tv_sec - wst2->tv_sec) * 1000
1655
+ (double)(wst1->tv_usec - wst2->tv_usec) / 1000);
1659
return 1000 * (*wst1 - *wst2);
1663
/* VC++ 6 doesn't support direct cast of uint64 to double. To work
1664
around this, we subtract, then convert to signed, then finally to
1666
return (double)(signed __int64)(wst1->QuadPart - wst2->QuadPart) / 10000;
1670
/* Return the number of milliseconds elapsed since the timer was last
1671
reset. It is allowed to call this function more than once to get
1672
increasingly higher elapsed values. These timers handle clock
1676
wtimer_elapsed (struct wget_timer *wt)
1681
wtimer_sys_set (&now);
1682
elapsed = wt->elapsed_pre_start + wtimer_sys_diff (&now, &wt->start);
1684
/* Ideally we'd just return the difference between NOW and
1685
wt->start. However, the system timer can be set back, and we
1686
could return a value smaller than when we were last called, even
1687
a negative value. Both of these would confuse the callers, which
1688
expect us to return monotonically nondecreasing values.
1690
Therefore: if ELAPSED is smaller than its previous known value,
1691
we reset wt->start to the current time and effectively start
1692
measuring from this point. But since we don't want the elapsed
1693
value to start from zero, we set elapsed_pre_start to the last
1694
elapsed time and increment all future calculations by that
1697
if (elapsed < wt->elapsed_last)
1700
wt->elapsed_pre_start = wt->elapsed_last;
1701
elapsed = wt->elapsed_last;
1704
wt->elapsed_last = elapsed;
1708
/* Return the assessed granularity of the timer implementation, in
1709
milliseconds. This is used by code that tries to substitute a
1710
better value for timers that have returned zero. */
1713
wtimer_granularity (void)
1715
#ifdef TIMER_GETTIMEOFDAY
1716
/* Granularity of gettimeofday varies wildly between architectures.
1717
However, it appears that on modern machines it tends to be better
1718
than 1ms. Assume 100 usecs. (Perhaps the configure process
1719
could actually measure this?) */
1727
#ifdef TIMER_WINDOWS
1728
/* According to MSDN, GetSystemTime returns a broken-down time
1729
structure the smallest member of which are milliseconds. */
1734
/* This should probably be at a better place, but it doesn't really
1735
fit into html-parse.c. */
1737
/* The function returns the pointer to the malloc-ed quoted version of
1738
string s. It will recognize and quote numeric and special graphic
1739
entities, as per RFC1866:
1747
No other entities are recognized or replaced. */
1749
html_quote_string (const char *s)
1755
/* Pass through the string, and count the new size. */
1756
for (i = 0; *s; s++, i++)
1759
i += 4; /* `amp;' */
1760
else if (*s == '<' || *s == '>')
1761
i += 3; /* `lt;' and `gt;' */
1762
else if (*s == '\"')
1763
i += 5; /* `quot;' */
1767
res = (char *)xmalloc (i + 1);
1769
for (p = res; *s; s++)
1782
*p++ = (*s == '<' ? 'l' : 'g');
1809
/* Determine the width of the terminal we're running on. If that's
1810
not possible, return 0. */
1813
determine_screen_width (void)
1815
/* If there's a way to get the terminal size using POSIX
1816
tcgetattr(), somebody please tell me. */
1819
#else /* TIOCGWINSZ */
1823
if (opt.lfilename != NULL)
1826
fd = fileno (stderr);
1827
if (ioctl (fd, TIOCGWINSZ, &wsz) < 0)
1828
return 0; /* most likely ENOTTY */
1831
#endif /* TIOCGWINSZ */
1834
/* Return a random number between 0 and MAX-1, inclusive.
1836
If MAX is greater than the value of RAND_MAX+1 on the system, the
1837
returned value will be in the range [0, RAND_MAX]. This may be
1838
fixed in a future release.
1840
The random number generator is seeded automatically the first time
1843
This uses rand() for portability. It has been suggested that
1844
random() offers better randomness, but this is not required for
1845
Wget, so I chose to go for simplicity and use rand
1848
DO NOT use this for cryptographic purposes. It is only meant to be
1849
used in situations where quality of the random numbers returned
1850
doesn't really matter. */
1853
random_number (int max)
1861
srand (time (NULL));
1866
/* On systems that don't define RAND_MAX, assume it to be 2**15 - 1,
1867
and enforce that assumption by masking other bits. */
1869
# define RAND_MAX 32767
1873
/* This is equivalent to rand() % max, but uses the high-order bits
1874
for better randomness on architecture where rand() is implemented
1875
using a simple congruential generator. */
1877
bounded = (double)max * rnd / (RAND_MAX + 1.0);
1878
return (int)bounded;
1881
/* Return a random uniformly distributed floating point number in the
1882
[0, 1) range. The precision of returned numbers is 9 digits.
1884
Modify this to use erand48() where available! */
1889
/* We can't rely on any specific value of RAND_MAX, but I'm pretty
1890
sure it's greater than 1000. */
1891
int rnd1 = random_number (1000);
1892
int rnd2 = random_number (1000);
1893
int rnd3 = random_number (1000);
1894
return rnd1 / 1000.0 + rnd2 / 1000000.0 + rnd3 / 1000000000.0;
1898
/* A debugging function for checking whether an MD5 library works. */
1900
#include "gen-md5.h"
1903
debug_test_md5 (char *buf)
1905
unsigned char raw[16];
1906
static char res[33];
1910
ALLOCA_MD5_CONTEXT (ctx);
1913
gen_md5_update ((unsigned char *)buf, strlen (buf), ctx);
1914
gen_md5_finish (ctx, raw);
1921
*p2++ = XNUM_TO_digit (*p1 >> 4);
1922
*p2++ = XNUM_TO_digit (*p1 & 0xf);
1931
/* Implementation of run_with_timeout, a generic timeout-forcing
1932
routine for systems with Unix-like signal handling. */
1934
#ifdef USE_SIGNAL_TIMEOUT
1935
# ifdef HAVE_SIGSETJMP
1936
# define SETJMP(env) sigsetjmp (env, 1)
1938
static sigjmp_buf run_with_timeout_env;
1941
abort_run_with_timeout (int sig)
1943
assert (sig == SIGALRM);
1944
siglongjmp (run_with_timeout_env, -1);
1946
# else /* not HAVE_SIGSETJMP */
1947
# define SETJMP(env) setjmp (env)
1949
static jmp_buf run_with_timeout_env;
1952
abort_run_with_timeout (int sig)
1954
assert (sig == SIGALRM);
1955
/* We don't have siglongjmp to preserve the set of blocked signals;
1956
if we longjumped out of the handler at this point, SIGALRM would
1957
remain blocked. We must unblock it manually. */
1958
int mask = siggetmask ();
1959
mask &= ~sigmask (SIGALRM);
1962
/* Now it's safe to longjump. */
1963
longjmp (run_with_timeout_env, -1);
1965
# endif /* not HAVE_SIGSETJMP */
1967
/* Arrange for SIGALRM to be delivered in TIMEOUT seconds. This uses
1968
setitimer where available, alarm otherwise.
1970
TIMEOUT should be non-zero. If the timeout value is so small that
1971
it would be rounded to zero, it is rounded to the least legal value
1972
instead (1us for setitimer, 1s for alarm). That ensures that
1973
SIGALRM will be delivered in all cases. */
1976
alarm_set (double timeout)
1979
/* Use the modern itimer interface. */
1980
struct itimerval itv;
1981
memset (&itv, 0, sizeof (itv));
1982
itv.it_value.tv_sec = (long) timeout;
1983
itv.it_value.tv_usec = 1000000L * (timeout - (long)timeout);
1984
if (itv.it_value.tv_sec == 0 && itv.it_value.tv_usec == 0)
1985
/* Ensure that we wait for at least the minimum interval.
1986
Specifying zero would mean "wait forever". */
1987
itv.it_value.tv_usec = 1;
1988
setitimer (ITIMER_REAL, &itv, NULL);
1989
#else /* not ITIMER_REAL */
1990
/* Use the old alarm() interface. */
1991
int secs = (int) timeout;
1993
/* Round TIMEOUTs smaller than 1 to 1, not to zero. This is
1994
because alarm(0) means "never deliver the alarm", i.e. "wait
1995
forever", which is not what someone who specifies a 0.5s
1996
timeout would expect. */
1999
#endif /* not ITIMER_REAL */
2002
/* Cancel the alarm set with alarm_set. */
2008
struct itimerval disable;
2009
memset (&disable, 0, sizeof (disable));
2010
setitimer (ITIMER_REAL, &disable, NULL);
2011
#else /* not ITIMER_REAL */
2013
#endif /* not ITIMER_REAL */
2016
/* Call FUN(ARG), but don't allow it to run for more than TIMEOUT
2017
seconds. Returns non-zero if the function was interrupted with a
2018
timeout, zero otherwise.
2020
This works by setting up SIGALRM to be delivered in TIMEOUT seconds
2021
using setitimer() or alarm(). The timeout is enforced by
2022
longjumping out of the SIGALRM handler. This has several
2023
advantages compared to the traditional approach of relying on
2024
signals causing system calls to exit with EINTR:
2026
* The callback function is *forcibly* interrupted after the
2027
timeout expires, (almost) regardless of what it was doing and
2028
whether it was in a syscall. For example, a calculation that
2029
takes a long time is interrupted as reliably as an IO
2032
* It works with both SYSV and BSD signals because it doesn't
2033
depend on the default setting of SA_RESTART.
2035
* It doesn't special handler setup beyond a simple call to
2036
signal(). (It does use sigsetjmp/siglongjmp, but they're
2039
The only downside is that, if FUN allocates internal resources that
2040
are normally freed prior to exit from the functions, they will be
2041
lost in case of timeout. */
2044
run_with_timeout (double timeout, void (*fun) (void *), void *arg)
2054
signal (SIGALRM, abort_run_with_timeout);
2055
if (SETJMP (run_with_timeout_env) != 0)
2057
/* Longjumped out of FUN with a timeout. */
2058
signal (SIGALRM, SIG_DFL);
2061
alarm_set (timeout);
2064
/* Preserve errno in case alarm() or signal() modifies it. */
2065
saved_errno = errno;
2067
signal (SIGALRM, SIG_DFL);
2068
errno = saved_errno;
2073
#else /* not USE_SIGNAL_TIMEOUT */
2076
/* A stub version of run_with_timeout that just calls FUN(ARG). Don't
2077
define it under Windows, because Windows has its own version of
2078
run_with_timeout that uses threads. */
2081
run_with_timeout (double timeout, void (*fun) (void *), void *arg)
2086
#endif /* not WINDOWS */
2087
#endif /* not USE_SIGNAL_TIMEOUT */