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