1/* System dependent definitions for GNU tar.
2
3   Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
4   2004, 2005, 2006 Free Software Foundation, Inc.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software Foundation,
18   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19
20#if HAVE_CONFIG_H
21# include <config.h>
22#endif
23
24#include <alloca.h>
25
26#ifndef __attribute__
27/* This feature is available in gcc versions 2.5 and later.  */
28# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
29#  define __attribute__(spec) /* empty */
30# endif
31#endif
32
33#include <sys/types.h>
34#include <ctype.h>
35
36/* IN_CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given
37   as an argument to <ctype.h> macros like `isspace'.  */
38#if STDC_HEADERS
39# define IN_CTYPE_DOMAIN(c) 1
40#else
41# define IN_CTYPE_DOMAIN(c) ((unsigned) (c) <= 0177)
42#endif
43
44#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
45#define ISODIGIT(c) ((unsigned) (c) - '0' <= 7)
46#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
47#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
48
49/* Declare string and memory handling routines.  Take care that an ANSI
50   string.h and pre-ANSI memory.h might conflict, and that memory.h and
51   strings.h conflict on some systems.  */
52
53#if STDC_HEADERS || HAVE_STRING_H
54# include <string.h>
55# if !STDC_HEADERS && HAVE_MEMORY_H
56#  include <memory.h>
57# endif
58#else
59# include <strings.h>
60# ifndef strchr
61#  define strchr index
62# endif
63# ifndef strrchr
64#  define strrchr rindex
65# endif
66# ifndef memcpy
67#  define memcpy(d, s, n) bcopy ((char const *) (s), (char *) (d), n)
68# endif
69# ifndef memcmp
70#  define memcmp(a, b, n) bcmp ((char const *) (a), (char const *) (b), n)
71# endif
72#endif
73
74/* Declare errno.  */
75
76#include <errno.h>
77#ifndef errno
78extern int errno;
79#endif
80
81/* Declare open parameters.  */
82
83#if HAVE_FCNTL_H
84# include <fcntl.h>
85#else
86# include <sys/file.h>
87#endif
88				/* Pick only one of the next three: */
89#ifndef O_RDONLY
90# define O_RDONLY	0	/* only allow read */
91#endif
92#ifndef O_WRONLY
93# define O_WRONLY	1	/* only allow write */
94#endif
95#ifndef O_RDWR
96# define O_RDWR		2	/* both are allowed */
97#endif
98#ifndef O_ACCMODE
99# define O_ACCMODE (O_RDONLY | O_RDWR | O_WRONLY)
100#endif
101				/* The rest can be OR-ed in to the above: */
102#ifndef O_CREAT
103# define O_CREAT	8	/* create file if needed */
104#endif
105#ifndef O_EXCL
106# define O_EXCL		16	/* file cannot already exist */
107#endif
108#ifndef O_TRUNC
109# define O_TRUNC	32	/* truncate file on open */
110#endif
111
112#ifndef O_BINARY
113# define O_BINARY 0
114#endif
115#ifndef O_DIRECTORY
116# define O_DIRECTORY 0
117#endif
118#ifndef O_NOATIME
119# define O_NOATIME 0
120#endif
121#ifndef O_NONBLOCK
122# define O_NONBLOCK 0
123#endif
124
125/* Declare file status routines and bits.  */
126
127#include <sys/stat.h>
128
129#if !HAVE_LSTAT && !defined lstat
130# define lstat stat
131#endif
132
133#if STX_HIDDEN && !_LARGE_FILES /* AIX */
134# ifdef stat
135#  undef stat
136# endif
137# define stat(file_name, buf) statx (file_name, buf, STATSIZE, STX_HIDDEN)
138# ifdef lstat
139#  undef lstat
140# endif
141# define lstat(file_name, buf) statx (file_name, buf, STATSIZE, STX_HIDDEN | STX_LINK)
142#endif
143
144#if STAT_MACROS_BROKEN
145# undef S_ISBLK
146# undef S_ISCHR
147# undef S_ISCTG
148# undef S_ISDIR
149# undef S_ISFIFO
150# undef S_ISLNK
151# undef S_ISREG
152# undef S_ISSOCK
153#endif
154
155/* On MSDOS, there are missing things from <sys/stat.h>.  */
156#if MSDOS
157# define S_ISUID 0
158# define S_ISGID 0
159# define S_ISVTX 0
160#endif
161
162#ifndef S_ISDIR
163# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
164#endif
165#ifndef S_ISREG
166# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
167#endif
168
169#ifndef S_ISBLK
170# ifdef S_IFBLK
171#  define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
172# else
173#  define S_ISBLK(mode) 0
174# endif
175#endif
176#ifndef S_ISCHR
177# ifdef S_IFCHR
178#  define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
179# else
180#  define S_ISCHR(mode) 0
181# endif
182#endif
183#ifndef S_ISCTG
184# ifdef S_IFCTG
185#  define S_ISCTG(mode) (((mode) & S_IFMT) == S_IFCTG)
186# else
187#  define S_ISCTG(mode) 0
188# endif
189#endif
190#ifndef S_ISDOOR
191# define S_ISDOOR(mode) 0
192#endif
193#ifndef S_ISFIFO
194# ifdef S_IFIFO
195#  define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
196# else
197#  define S_ISFIFO(mode) 0
198# endif
199#endif
200#ifndef S_ISLNK
201# ifdef S_IFLNK
202#  define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
203# else
204#  define S_ISLNK(mode) 0
205# endif
206#endif
207#ifndef S_ISSOCK
208# ifdef S_IFSOCK
209#  define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
210# else
211#  define S_ISSOCK(mode) 0
212# endif
213#endif
214
215#if !HAVE_MKFIFO && !defined mkfifo && defined S_IFIFO
216# define mkfifo(file_name, mode) (mknod (file_name, (mode) | S_IFIFO, 0))
217#endif
218
219#ifndef S_ISUID
220# define S_ISUID 0004000
221#endif
222#ifndef S_ISGID
223# define S_ISGID 0002000
224#endif
225#ifndef S_ISVTX
226# define S_ISVTX 0001000
227#endif
228#ifndef S_IRUSR
229# define S_IRUSR 0000400
230#endif
231#ifndef S_IWUSR
232# define S_IWUSR 0000200
233#endif
234#ifndef S_IXUSR
235# define S_IXUSR 0000100
236#endif
237#ifndef S_IRGRP
238# define S_IRGRP 0000040
239#endif
240#ifndef S_IWGRP
241# define S_IWGRP 0000020
242#endif
243#ifndef S_IXGRP
244# define S_IXGRP 0000010
245#endif
246#ifndef S_IROTH
247# define S_IROTH 0000004
248#endif
249#ifndef S_IWOTH
250# define S_IWOTH 0000002
251#endif
252#ifndef S_IXOTH
253# define S_IXOTH 0000001
254#endif
255
256#define MODE_WXUSR	(S_IWUSR | S_IXUSR)
257#define MODE_R		(S_IRUSR | S_IRGRP | S_IROTH)
258#define MODE_RW		(S_IWUSR | S_IWGRP | S_IWOTH | MODE_R)
259#define MODE_RWX	(S_IXUSR | S_IXGRP | S_IXOTH | MODE_RW)
260#define MODE_ALL	(S_ISUID | S_ISGID | S_ISVTX | MODE_RWX)
261
262/* Include <unistd.h> before any preprocessor test of _POSIX_VERSION.  */
263#include <unistd.h>
264
265#ifndef SEEK_SET
266# define SEEK_SET 0
267#endif
268#ifndef SEEK_CUR
269# define SEEK_CUR 1
270#endif
271#ifndef SEEK_END
272# define SEEK_END 2
273#endif
274
275#ifndef STDIN_FILENO
276# define STDIN_FILENO 0
277#endif
278#ifndef STDOUT_FILENO
279# define STDOUT_FILENO 1
280#endif
281#ifndef STDERR_FILENO
282# define STDERR_FILENO 2
283#endif
284
285/* Declare make device, major and minor.  Since major is a function on
286   SVR4, we have to resort to GOT_MAJOR instead of just testing if
287   major is #define'd.  */
288
289#if MAJOR_IN_MKDEV
290# include <sys/mkdev.h>
291# if !defined(makedev) && defined(mkdev)
292#  define makedev(a,b) mkdev((a),(b))
293# endif
294# define GOT_MAJOR
295#endif
296
297#if MAJOR_IN_SYSMACROS
298# include <sys/sysmacros.h>
299# define GOT_MAJOR
300#endif
301
302/* Some <sys/types.h> defines the macros. */
303#ifdef major
304# define GOT_MAJOR
305#endif
306
307#ifndef GOT_MAJOR
308# if MSDOS
309#  define major(device)		(device)
310#  define minor(device)		(device)
311#  define makedev(major, minor)	(((major) << 8) | (minor))
312#  define GOT_MAJOR
313# endif
314#endif
315
316/* For HP-UX before HP-UX 8, major/minor are not in <sys/sysmacros.h>.  */
317#ifndef GOT_MAJOR
318# if defined(hpux) || defined(__hpux__) || defined(__hpux)
319#  include <sys/mknod.h>
320#  define GOT_MAJOR
321# endif
322#endif
323
324#ifndef GOT_MAJOR
325# define major(device)		(((device) >> 8) & 0xff)
326# define minor(device)		((device) & 0xff)
327# define makedev(major, minor)	(((major) << 8) | (minor))
328#endif
329
330#undef GOT_MAJOR
331
332/* Declare wait status.  */
333
334#if HAVE_SYS_WAIT_H
335# include <sys/wait.h>
336#endif
337#ifndef WEXITSTATUS
338# define WEXITSTATUS(s)	(((s) >> 8) & 0xff)
339#endif
340#ifndef WIFSIGNALED
341# define WIFSIGNALED(s)	(((s) & 0xffff) - 1 < (unsigned) 0xff)
342#endif
343#ifndef WTERMSIG
344# define WTERMSIG(s)	((s) & 0x7f)
345#endif
346
347/* FIXME: It is wrong to use BLOCKSIZE for buffers when the logical block
348   size is greater than 512 bytes; so ST_BLKSIZE code below, in preparation
349   for some cleanup in this area, later.  */
350
351/* Extract or fake data from a `struct stat'.  ST_BLKSIZE gives the
352   optimal I/O blocksize for the file, in bytes.  Some systems, like
353   Sequents, return st_blksize of 0 on pipes.  */
354
355#define DEFAULT_ST_BLKSIZE 512
356
357#if !HAVE_ST_BLKSIZE
358# define ST_BLKSIZE(statbuf) DEFAULT_ST_BLKSIZE
359#else
360# define ST_BLKSIZE(statbuf) \
361    ((statbuf).st_blksize > 0 ? (statbuf).st_blksize : DEFAULT_ST_BLKSIZE)
362#endif
363
364/* Extract or fake data from a `struct stat'.  ST_NBLOCKS gives the
365   number of ST_NBLOCKSIZE-byte blocks in the file (including indirect blocks).
366   HP-UX counts st_blocks in 1024-byte units,
367   this loses when mixing HP-UX and BSD filesystems with NFS.  AIX PS/2
368   counts st_blocks in 4K units.  */
369
370#if !HAVE_ST_BLOCKS
371# if defined(_POSIX_SOURCE) || !defined(BSIZE)
372#  define ST_NBLOCKS(statbuf) ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
373# else
374   off_t st_blocks ();
375#  define ST_NBLOCKS(statbuf) (st_blocks ((statbuf).st_size))
376# endif
377#else
378# define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
379# if defined(hpux) || defined(__hpux__) || defined(__hpux)
380#  define ST_NBLOCKSIZE 1024
381# else
382#  if defined(_AIX) && defined(_I386)
383#   define ST_NBLOCKSIZE (4 * 1024)
384#  endif
385# endif
386#endif
387
388#ifndef ST_NBLOCKSIZE
389# define ST_NBLOCKSIZE 512
390#endif
391
392#define ST_IS_SPARSE(st)                                  \
393  (ST_NBLOCKS (st)                                        \
394    < ((st).st_size / ST_NBLOCKSIZE + ((st).st_size % ST_NBLOCKSIZE != 0)))
395
396/* Declare standard functions.  */
397
398#if STDC_HEADERS
399# include <stdlib.h>
400#else
401void *malloc ();
402char *getenv ();
403#endif
404
405#include <stdbool.h>
406#include <stddef.h>
407
408#include <stdio.h>
409#if !defined _POSIX_VERSION && MSDOS
410# include <io.h>
411#endif
412
413#if WITH_DMALLOC
414# define DMALLOC_FUNC_CHECK
415# include <dmalloc.h>
416#endif
417
418#include <limits.h>
419
420#ifndef MB_LEN_MAX
421# define MB_LEN_MAX 1
422#endif
423
424#include <inttypes.h>
425
426#include <intprops.h>
427
428#define UINTMAX_STRSIZE_BOUND INT_BUFSIZE_BOUND (uintmax_t)
429
430/* Prototypes for external functions.  */
431
432#if HAVE_LOCALE_H
433# include <locale.h>
434#endif
435#if !HAVE_SETLOCALE
436# define setlocale(category, locale) /* empty */
437#endif
438
439#include <time.h>
440#ifdef TIME_WITH_SYS_TIME
441# include <sys/time.h>
442#endif
443
444/* Library modules.  */
445
446#include <dirname.h>
447#include <error.h>
448#include <savedir.h>
449#include <unlocked-io.h>
450#include <xalloc.h>
451
452#include <gettext.h>
453#define _(msgid) gettext (msgid)
454#define N_(msgid) msgid
455
456#if MSDOS
457# include <process.h>
458# define SET_BINARY_MODE(arc) setmode(arc, O_BINARY)
459# define ERRNO_IS_EACCES errno == EACCES
460# define mkdir(file, mode) (mkdir) (file)
461# define TTY_NAME "con"
462# define sys_reset_uid_gid()
463#else
464# include <pwd.h>
465# include <grp.h>
466# define SET_BINARY_MODE(arc)
467# define ERRNO_IS_EACCES 0
468# define TTY_NAME "/dev/tty"
469# define sys_reset_uid_gid() \
470 do { setuid (getuid ()); setgid (getgid ()); } while (0)
471#endif
472
473#if XENIX
474# include <sys/inode.h>
475#endif
476