factor out time_t-to-string conversion idiom
[platform/upstream/coreutils.git] / src / system.h
1 /* system-dependent definitions for coreutils
2    Copyright (C) 1989, 1991-2008 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 #include <alloca.h>
18
19 /* Include sys/types.h before this file.  */
20
21 #if 2 <= __GLIBC__ && 2 <= __GLIBC_MINOR__
22 # if ! defined _SYS_TYPES_H
23 you must include <sys/types.h> before including this file
24 # endif
25 #endif
26
27 #include <sys/stat.h>
28
29 #if !defined HAVE_MKFIFO
30 # define mkfifo(name, mode) mknod (name, (mode) | S_IFIFO, 0)
31 #endif
32
33 #if HAVE_SYS_PARAM_H
34 # include <sys/param.h>
35 #endif
36
37 #include <unistd.h>
38
39 #ifndef STDIN_FILENO
40 # define STDIN_FILENO 0
41 #endif
42
43 #ifndef STDOUT_FILENO
44 # define STDOUT_FILENO 1
45 #endif
46
47 #ifndef STDERR_FILENO
48 # define STDERR_FILENO 2
49 #endif
50
51
52 /* limits.h must come before pathmax.h because limits.h on some systems
53    undefs PATH_MAX, whereas pathmax.h sets PATH_MAX.  */
54 #include <limits.h>
55
56 #include "pathmax.h"
57
58 #include "configmake.h"
59
60 #if TIME_WITH_SYS_TIME
61 # include <sys/time.h>
62 # include <time.h>
63 #else
64 # if HAVE_SYS_TIME_H
65 #  include <sys/time.h>
66 # else
67 #  include <time.h>
68 # endif
69 #endif
70
71 /* Since major is a function on SVR4, we can't use `ifndef major'.  */
72 #if MAJOR_IN_MKDEV
73 # include <sys/mkdev.h>
74 # define HAVE_MAJOR
75 #endif
76 #if MAJOR_IN_SYSMACROS
77 # include <sys/sysmacros.h>
78 # define HAVE_MAJOR
79 #endif
80 #ifdef major                    /* Might be defined in sys/types.h.  */
81 # define HAVE_MAJOR
82 #endif
83
84 #ifndef HAVE_MAJOR
85 # define major(dev)  (((dev) >> 8) & 0xff)
86 # define minor(dev)  ((dev) & 0xff)
87 # define makedev(maj, min)  (((maj) << 8) | (min))
88 #endif
89 #undef HAVE_MAJOR
90
91 #if ! defined makedev && defined mkdev
92 # define makedev(maj, min)  mkdev (maj, min)
93 #endif
94
95 /* Don't use bcopy!  Use memmove if source and destination may overlap,
96    memcpy otherwise.  */
97
98 #include <string.h>
99
100 #include <errno.h>
101
102 /* Some systems don't define the following symbols.  */
103 #ifndef EDQUOT
104 # define EDQUOT (-1)
105 #endif
106 #ifndef EISDIR
107 # define EISDIR (-1)
108 #endif
109 #ifndef ENOSYS
110 # define ENOSYS (-1)
111 #endif
112 #ifndef ENODATA
113 # define ENODATA (-1)
114 #endif
115
116 #include <stdbool.h>
117 #include <stdlib.h>
118
119 /* Exit statuses for programs like 'env' that exec other programs.  */
120 enum
121 {
122   EXIT_CANNOT_INVOKE = 126,
123   EXIT_ENOENT = 127
124 };
125
126 #include "exitfail.h"
127
128 /* Set exit_failure to STATUS if that's not the default already.  */
129 static inline void
130 initialize_exit_failure (int status)
131 {
132   if (status != EXIT_FAILURE)
133     exit_failure = status;
134 }
135
136 #include <fcntl.h>
137
138 #ifndef F_OK
139 # define F_OK 0
140 # define X_OK 1
141 # define W_OK 2
142 # define R_OK 4
143 #endif
144
145 #include <dirent.h>
146 #ifndef _D_EXACT_NAMLEN
147 # define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
148 #endif
149
150 enum
151 {
152   NOT_AN_INODE_NUMBER = 0
153 };
154
155 #ifdef D_INO_IN_DIRENT
156 # define D_INO(dp) (dp)->d_ino
157 #else
158 /* Some systems don't have inodes, so fake them to avoid lots of ifdefs.  */
159 # define D_INO(dp) NOT_AN_INODE_NUMBER
160 #endif
161
162 /* Get or fake the disk device blocksize.
163    Usually defined by sys/param.h (if at all).  */
164 #if !defined DEV_BSIZE && defined BSIZE
165 # define DEV_BSIZE BSIZE
166 #endif
167 #if !defined DEV_BSIZE && defined BBSIZE /* SGI */
168 # define DEV_BSIZE BBSIZE
169 #endif
170 #ifndef DEV_BSIZE
171 # define DEV_BSIZE 4096
172 #endif
173
174 /* Extract or fake data from a `struct stat'.
175    ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes.
176    ST_NBLOCKS: Number of blocks in the file, including indirect blocks.
177    ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS.  */
178 #ifndef HAVE_STRUCT_STAT_ST_BLOCKS
179 # define ST_BLKSIZE(statbuf) DEV_BSIZE
180 # if defined _POSIX_SOURCE || !defined BSIZE /* fileblocks.c uses BSIZE.  */
181 #  define ST_NBLOCKS(statbuf) \
182   ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
183 # else /* !_POSIX_SOURCE && BSIZE */
184 #  define ST_NBLOCKS(statbuf) \
185   (S_ISREG ((statbuf).st_mode) \
186    || S_ISDIR ((statbuf).st_mode) \
187    ? st_blocks ((statbuf).st_size) : 0)
188 # endif /* !_POSIX_SOURCE && BSIZE */
189 #else /* HAVE_STRUCT_STAT_ST_BLOCKS */
190 /* Some systems, like Sequents, return st_blksize of 0 on pipes.
191    Also, when running `rsh hpux11-system cat any-file', cat would
192    determine that the output stream had an st_blksize of 2147421096.
193    Conversely st_blksize can be 2 GiB (or maybe even larger) with XFS
194    on 64-bit hosts.  Somewhat arbitrarily, limit the `optimal' block
195    size to SIZE_MAX / 8 + 1.  (Dividing SIZE_MAX by only 4 wouldn't
196    suffice, since "cat" sometimes multiplies the result by 4.)  If
197    anyone knows of a system for which this limit is too small, please
198    report it as a bug in this code.  */
199 # define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
200                                && (statbuf).st_blksize <= SIZE_MAX / 8 + 1) \
201                               ? (statbuf).st_blksize : DEV_BSIZE)
202 # if defined hpux || defined __hpux__ || defined __hpux
203 /* HP-UX counts st_blocks in 1024-byte units.
204    This loses when mixing HP-UX and BSD file systems with NFS.  */
205 #  define ST_NBLOCKSIZE 1024
206 # else /* !hpux */
207 #  if defined _AIX && defined _I386
208 /* AIX PS/2 counts st_blocks in 4K units.  */
209 #   define ST_NBLOCKSIZE (4 * 1024)
210 #  else /* not AIX PS/2 */
211 #   if defined _CRAY
212 #    define ST_NBLOCKS(statbuf) \
213   (S_ISREG ((statbuf).st_mode) \
214    || S_ISDIR ((statbuf).st_mode) \
215    ? (statbuf).st_blocks * ST_BLKSIZE(statbuf)/ST_NBLOCKSIZE : 0)
216 #   endif /* _CRAY */
217 #  endif /* not AIX PS/2 */
218 # endif /* !hpux */
219 #endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
220
221 #ifndef ST_NBLOCKS
222 # define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
223 #endif
224
225 #ifndef ST_NBLOCKSIZE
226 # ifdef S_BLKSIZE
227 #  define ST_NBLOCKSIZE S_BLKSIZE
228 # else
229 #  define ST_NBLOCKSIZE 512
230 # endif
231 #endif
232
233 /* Redirection and wildcarding when done by the utility itself.
234    Generally a noop, but used in particular for native VMS. */
235 #ifndef initialize_main
236 # define initialize_main(ac, av)
237 #endif
238
239 #include "stat-macros.h"
240
241 #include "timespec.h"
242
243 #include <inttypes.h>
244
245 #include <ctype.h>
246
247 #if ! (defined isblank || HAVE_DECL_ISBLANK)
248 # define isblank(c) ((c) == ' ' || (c) == '\t')
249 #endif
250
251 /* ISDIGIT differs from isdigit, as follows:
252    - Its arg may be any int or unsigned int; it need not be an unsigned char
253      or EOF.
254    - It's typically faster.
255    POSIX says that only '0' through '9' are digits.  Prefer ISDIGIT to
256    isdigit unless it's important to use the locale's definition
257    of `digit' even when the host does not conform to POSIX.  */
258 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
259
260 /* Convert a possibly-signed character to an unsigned character.  This is
261    a bit safer than casting to unsigned char, since it catches some type
262    errors that the cast doesn't.  */
263 static inline unsigned char to_uchar (char ch) { return ch; }
264
265 #include <locale.h>
266
267 /* Take care of NLS matters.  */
268
269 #include "gettext.h"
270 #if ! ENABLE_NLS
271 # undef textdomain
272 # define textdomain(Domainname) /* empty */
273 # undef bindtextdomain
274 # define bindtextdomain(Domainname, Dirname) /* empty */
275 #endif
276
277 #define _(msgid) gettext (msgid)
278 #define N_(msgid) msgid
279
280 /* Return a value that pluralizes the same way that N does, in all
281    languages we know of.  */
282 static inline unsigned long int
283 select_plural (uintmax_t n)
284 {
285   /* Reduce by a power of ten, but keep it away from zero.  The
286      gettext manual says 1000000 should be safe.  */
287   enum { PLURAL_REDUCER = 1000000 };
288   return (n <= ULONG_MAX ? n : n % PLURAL_REDUCER + PLURAL_REDUCER);
289 }
290
291 #define STREQ(a, b) (strcmp (a, b) == 0)
292
293 #if !HAVE_DECL_FREE
294 void free ();
295 #endif
296
297 #if !HAVE_DECL_MALLOC
298 char *malloc ();
299 #endif
300
301 #if !HAVE_DECL_MEMCHR
302 char *memchr ();
303 #endif
304
305 #if !HAVE_DECL_REALLOC
306 char *realloc ();
307 #endif
308
309 #if !HAVE_DECL_GETENV
310 char *getenv ();
311 #endif
312
313 #if !HAVE_DECL_LSEEK
314 off_t lseek ();
315 #endif
316
317 #if !HAVE_DECL_GETLOGIN
318 char *getlogin ();
319 #endif
320
321 #if !HAVE_DECL_TTYNAME
322 char *ttyname ();
323 #endif
324
325 #if !HAVE_DECL_GETEUID
326 uid_t geteuid ();
327 #endif
328
329 #if !HAVE_DECL_GETPWUID
330 struct passwd *getpwuid ();
331 #endif
332
333 #if !HAVE_DECL_GETGRGID
334 struct group *getgrgid ();
335 #endif
336
337 #if !HAVE_DECL_GETUID
338 uid_t getuid ();
339 #endif
340
341 #include "xalloc.h"
342 #include "verify.h"
343
344 /* This is simply a shorthand for the common case in which
345    the third argument to x2nrealloc would be `sizeof *(P)'.
346    Ensure that sizeof *(P) is *not* 1.  In that case, it'd be
347    better to use X2REALLOC, although not strictly necessary.  */
348 #define X2NREALLOC(P, PN) ((void) verify_true (sizeof *(P) != 1), \
349                            x2nrealloc (P, PN, sizeof *(P)))
350
351 /* Using x2realloc (when appropriate) usually makes your code more
352    readable than using x2nrealloc, but it also makes it so your
353    code will malfunction if sizeof *(P) ever becomes 2 or greater.
354    So use this macro instead of using x2realloc directly.  */
355 #define X2REALLOC(P, PN) ((void) verify_true (sizeof *(P) == 1), \
356                           x2realloc (P, PN))
357
358 #include "unlocked-io.h"
359 #include "same-inode.h"
360
361 #include "dirname.h"
362 #include "openat.h"
363
364 static inline bool
365 dot_or_dotdot (char const *file_name)
366 {
367   if (file_name[0] == '.')
368     {
369       char sep = file_name[(file_name[1] == '.') + 1];
370       return (! sep || ISSLASH (sep));
371     }
372   else
373     return false;
374 }
375
376 /* A wrapper for readdir so that callers don't see entries for `.' or `..'.  */
377 static inline struct dirent const *
378 readdir_ignoring_dot_and_dotdot (DIR *dirp)
379 {
380   while (1)
381     {
382       struct dirent const *dp = readdir (dirp);
383       if (dp == NULL || ! dot_or_dotdot (dp->d_name))
384         return dp;
385     }
386 }
387
388 /* Return true if DIR is determined to be an empty directory.  */
389 static inline bool
390 is_empty_dir (int fd_cwd, char const *dir)
391 {
392   DIR *dirp;
393   struct dirent const *dp;
394   int saved_errno;
395   int fd = openat (fd_cwd, dir,
396                    (O_RDONLY | O_DIRECTORY
397                     | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK));
398
399   if (fd < 0)
400     return false;
401
402   dirp = fdopendir (fd);
403   if (dirp == NULL)
404     {
405       close (fd);
406       return false;
407     }
408
409   errno = 0;
410   dp = readdir_ignoring_dot_and_dotdot (dirp);
411   saved_errno = errno;
412   closedir (dirp);
413   if (dp != NULL)
414     return false;
415   return saved_errno == 0 ? true : false;
416 }
417
418 /* Factor out some of the common --help and --version processing code.  */
419
420 /* These enum values cannot possibly conflict with the option values
421    ordinarily used by commands, including CHAR_MAX + 1, etc.  Avoid
422    CHAR_MIN - 1, as it may equal -1, the getopt end-of-options value.  */
423 enum
424 {
425   GETOPT_HELP_CHAR = (CHAR_MIN - 2),
426   GETOPT_VERSION_CHAR = (CHAR_MIN - 3)
427 };
428
429 #define GETOPT_HELP_OPTION_DECL \
430   "help", no_argument, NULL, GETOPT_HELP_CHAR
431 #define GETOPT_VERSION_OPTION_DECL \
432   "version", no_argument, NULL, GETOPT_VERSION_CHAR
433 #define GETOPT_SELINUX_CONTEXT_OPTION_DECL \
434   "context", required_argument, NULL, 'Z'
435
436 #define case_GETOPT_HELP_CHAR                   \
437   case GETOPT_HELP_CHAR:                        \
438     usage (EXIT_SUCCESS);                       \
439     break;
440
441 /* Program_name must be a literal string.
442    Usually it is just PROGRAM_NAME.  */
443 #define USAGE_BUILTIN_WARNING \
444   _("\n" \
445 "NOTE: your shell may have its own version of %s, which usually supersedes\n" \
446 "the version described here.  Please refer to your shell's documentation\n" \
447 "for details about the options it supports.\n")
448
449 #define HELP_OPTION_DESCRIPTION \
450   _("      --help     display this help and exit\n")
451 #define VERSION_OPTION_DESCRIPTION \
452   _("      --version  output version information and exit\n")
453
454 #include "closein.h"
455 #include "closeout.h"
456 #include "version-etc.h"
457 #include "propername.h"
458 /* Define away proper_name (leaving proper_name_utf8, which affects far
459    fewer programs), since it's not worth the cost of adding ~17KB to
460    the x86_64 text size of every single program.  This avoids a 40%
461    (almost ~2MB) increase in the on-disk space utilization for the set
462    of the 100 binaries. */
463 #define proper_name(x) (x)
464
465 #include "progname.h"
466
467 #define case_GETOPT_VERSION_CHAR(Program_name, Authors)                 \
468   case GETOPT_VERSION_CHAR:                                             \
469     version_etc (stdout, Program_name, PACKAGE_NAME, VERSION, Authors,  \
470                  (char *) NULL);                                        \
471     exit (EXIT_SUCCESS);                                                \
472     break;
473
474 #ifndef MAX
475 # define MAX(a, b) ((a) > (b) ? (a) : (b))
476 #endif
477
478 #ifndef MIN
479 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
480 #endif
481
482 #include "intprops.h"
483
484 #ifndef SSIZE_MAX
485 # define SSIZE_MAX TYPE_MAXIMUM (ssize_t)
486 #endif
487
488 #ifndef OFF_T_MIN
489 # define OFF_T_MIN TYPE_MINIMUM (off_t)
490 #endif
491
492 #ifndef OFF_T_MAX
493 # define OFF_T_MAX TYPE_MAXIMUM (off_t)
494 #endif
495
496 #ifndef UID_T_MAX
497 # define UID_T_MAX TYPE_MAXIMUM (uid_t)
498 #endif
499
500 #ifndef GID_T_MAX
501 # define GID_T_MAX TYPE_MAXIMUM (gid_t)
502 #endif
503
504 #ifndef PID_T_MAX
505 # define PID_T_MAX TYPE_MAXIMUM (pid_t)
506 #endif
507
508 /* Use this to suppress gcc's `...may be used before initialized' warnings. */
509 #ifdef lint
510 # define IF_LINT(Code) Code
511 #else
512 # define IF_LINT(Code) /* empty */
513 #endif
514
515 #ifndef __attribute__
516 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
517 #  define __attribute__(x) /* empty */
518 # endif
519 #endif
520
521 #ifndef ATTRIBUTE_NORETURN
522 # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
523 #endif
524
525 #ifndef ATTRIBUTE_UNUSED
526 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
527 #endif
528
529 #if defined strdupa
530 # define ASSIGN_STRDUPA(DEST, S)                \
531   do { DEST = strdupa (S); } while (0)
532 #else
533 # define ASSIGN_STRDUPA(DEST, S)                \
534   do                                            \
535     {                                           \
536       const char *s_ = (S);                     \
537       size_t len_ = strlen (s_) + 1;            \
538       char *tmp_dest_ = alloca (len_);          \
539       DEST = memcpy (tmp_dest_, s_, len_);      \
540     }                                           \
541   while (0)
542 #endif
543
544 #ifndef EOVERFLOW
545 # define EOVERFLOW EINVAL
546 #endif
547
548 #if ! HAVE_SYNC
549 # define sync() /* empty */
550 #endif
551
552 /* Compute the greatest common divisor of U and V using Euclid's
553    algorithm.  U and V must be nonzero.  */
554
555 static inline size_t
556 gcd (size_t u, size_t v)
557 {
558   do
559     {
560       size_t t = u % v;
561       u = v;
562       v = t;
563     }
564   while (v);
565
566   return u;
567 }
568
569 /* Compute the least common multiple of U and V.  U and V must be
570    nonzero.  There is no overflow checking, so callers should not
571    specify outlandish sizes.  */
572
573 static inline size_t
574 lcm (size_t u, size_t v)
575 {
576   return u * (v / gcd (u, v));
577 }
578
579 /* Return PTR, aligned upward to the next multiple of ALIGNMENT.
580    ALIGNMENT must be nonzero.  The caller must arrange for ((char *)
581    PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
582    locations.  */
583
584 static inline void *
585 ptr_align (void const *ptr, size_t alignment)
586 {
587   char const *p0 = ptr;
588   char const *p1 = p0 + alignment - 1;
589   return (void *) (p1 - (size_t) p1 % alignment);
590 }
591
592 /* If 10*Accum + Digit_val is larger than the maximum value for Type,
593    then don't update Accum and return false to indicate it would
594    overflow.  Otherwise, set Accum to that new value and return true.
595    Verify at compile-time that Type is Accum's type, and that Type is
596    unsigned.  Accum must be an object, so that we can take its
597    address.  Accum and Digit_val may be evaluated multiple times.
598
599    The "Added check" below is not strictly required, but it causes GCC
600    to return a nonzero exit status instead of merely a warning
601    diagnostic, and that is more useful.  */
602
603 #define DECIMAL_DIGIT_ACCUMULATE(Accum, Digit_val, Type)                \
604   (                                                                     \
605    (void) (&(Accum) == (Type *) NULL),  /* The type matches.  */        \
606    (void) verify_true (! TYPE_SIGNED (Type)), /* The type is unsigned.  */ \
607    (void) verify_true (sizeof (Accum) == sizeof (Type)), /* Added check.  */ \
608    (((Type) -1 / 10 < (Accum)                                           \
609      || (Type) ((Accum) * 10 + (Digit_val)) < (Accum))                  \
610     ? false : (((Accum) = (Accum) * 10 + (Digit_val)), true))           \
611   )
612
613 static inline void
614 emit_bug_reporting_address (void)
615 {
616   /* TRANSLATORS: The placeholder indicates the bug-reporting address
617      for this package.  Please add _another line_ saying
618      "Report translation bugs to <...>\n" with the address for translation
619      bugs (typically your translation team's web or email address).  */
620   printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
621 }
622
623 #include "inttostr.h"
624
625 static inline char *
626 timetostr (time_t t, char *buf)
627 {
628   return (TYPE_SIGNED (time_t)
629           ? imaxtostr (t, buf)
630           : umaxtostr (t, buf));
631 }