source: trunk/essentials/app-arch/tar/lib/system.h

Last change on this file was 3347, checked in by bird, 18 years ago

setmode(,O_BINARY) for OS/2 please.

File size: 10.7 KB
Line 
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
431/* Prototypes for external functions. */
432
433#if HAVE_LOCALE_H
434# include <locale.h>
435#endif
436#if !HAVE_SETLOCALE
437# define setlocale(category, locale) /* empty */
438#endif
439
440#include <time.h>
441#ifdef TIME_WITH_SYS_TIME
442# include <sys/time.h>
443#endif
444
445/* Library modules. */
446
447#include <dirname.h>
448#include <error.h>
449#include <savedir.h>
450#include <unlocked-io.h>
451#include <xalloc.h>
452
453#include <gettext.h>
454#define _(msgid) gettext (msgid)
455#define N_(msgid) msgid
456
457#if MSDOS
458# include <process.h>
459# define SET_BINARY_MODE(arc) setmode(arc, O_BINARY)
460# define ERRNO_IS_EACCES errno == EACCES
461# define mkdir(file, mode) (mkdir) (file)
462# define TTY_NAME "con"
463# define sys_reset_uid_gid()
464#else
465# include <pwd.h>
466# include <grp.h>
467# if defined __OS2__
468# define SET_BINARY_MODE(arc) setmode(arc, O_BINARY)
469# else
470# define SET_BINARY_MODE(arc)
471# endif
472# define ERRNO_IS_EACCES 0
473# define TTY_NAME "/dev/tty"
474# define sys_reset_uid_gid() \
475 do { setuid (getuid ()); setgid (getgid ()); } while (0)
476#endif
477
478#if XENIX
479# include <sys/inode.h>
480#endif
Note: See TracBrowser for help on using the repository browser.