| 1 | /* general.h -- defines that everybody likes to use. */ | 
|---|
| 2 |  | 
|---|
| 3 | /* Copyright (C) 1993-2004 Free Software Foundation, Inc. | 
|---|
| 4 |  | 
|---|
| 5 | This file is part of GNU Bash, the Bourne Again SHell. | 
|---|
| 6 |  | 
|---|
| 7 | Bash is free software; you can redistribute it and/or modify it under | 
|---|
| 8 | the terms of the GNU General Public License as published by the Free | 
|---|
| 9 | Software Foundation; either version 2, or (at your option) any later | 
|---|
| 10 | version. | 
|---|
| 11 |  | 
|---|
| 12 | Bash is distributed in the hope that it will be useful, but WITHOUT ANY | 
|---|
| 13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|---|
| 14 | FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|---|
| 15 | for more details. | 
|---|
| 16 |  | 
|---|
| 17 | You should have received a copy of the GNU General Public License along | 
|---|
| 18 | with Bash; see the file COPYING.  If not, write to the Free Software | 
|---|
| 19 | Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ | 
|---|
| 20 |  | 
|---|
| 21 | #if !defined (_GENERAL_H_) | 
|---|
| 22 | #define _GENERAL_H_ | 
|---|
| 23 |  | 
|---|
| 24 | #include "stdc.h" | 
|---|
| 25 |  | 
|---|
| 26 | #include "bashtypes.h" | 
|---|
| 27 | #include "chartypes.h" | 
|---|
| 28 |  | 
|---|
| 29 | #if defined (HAVE_SYS_RESOURCE_H) && defined (RLIMTYPE) | 
|---|
| 30 | #  if defined (HAVE_SYS_TIME_H) | 
|---|
| 31 | #    include <sys/time.h> | 
|---|
| 32 | #  endif | 
|---|
| 33 | #  include <sys/resource.h> | 
|---|
| 34 | #endif | 
|---|
| 35 |  | 
|---|
| 36 | #if defined (HAVE_STRING_H) | 
|---|
| 37 | #  include <string.h> | 
|---|
| 38 | #else | 
|---|
| 39 | #  include <strings.h> | 
|---|
| 40 | #endif /* !HAVE_STRING_H */ | 
|---|
| 41 |  | 
|---|
| 42 | #if defined (HAVE_LIMITS_H) | 
|---|
| 43 | #  include <limits.h> | 
|---|
| 44 | #endif | 
|---|
| 45 |  | 
|---|
| 46 | #include "xmalloc.h" | 
|---|
| 47 |  | 
|---|
| 48 | /* NULL pointer type. */ | 
|---|
| 49 | #if !defined (NULL) | 
|---|
| 50 | #  if defined (__STDC__) | 
|---|
| 51 | #    define NULL ((void *) 0) | 
|---|
| 52 | #  else | 
|---|
| 53 | #    define NULL 0x0 | 
|---|
| 54 | #  endif /* !__STDC__ */ | 
|---|
| 55 | #endif /* !NULL */ | 
|---|
| 56 |  | 
|---|
| 57 | /* Hardly used anymore */ | 
|---|
| 58 | #define pointer_to_int(x)       (int)((char *)x - (char *)0) | 
|---|
| 59 |  | 
|---|
| 60 | #if defined (alpha) && defined (__GNUC__) && !defined (strchr) && !defined (__STDC__) | 
|---|
| 61 | extern char *strchr (), *strrchr (); | 
|---|
| 62 | #endif | 
|---|
| 63 |  | 
|---|
| 64 | #if !defined (strcpy) && (defined (HAVE_DECL_STRCPY) && !HAVE_DECL_STRCPY) | 
|---|
| 65 | extern char *strcpy __P((char *, const char *)); | 
|---|
| 66 | #endif | 
|---|
| 67 |  | 
|---|
| 68 | #if !defined (savestring) | 
|---|
| 69 | #  define savestring(x) (char *)strcpy (xmalloc (1 + strlen (x)), (x)) | 
|---|
| 70 | #endif | 
|---|
| 71 |  | 
|---|
| 72 | #ifndef member | 
|---|
| 73 | #  define member(c, s) ((c) ? ((char *)xstrchr ((s), (c)) != (char *)NULL) : 0) | 
|---|
| 74 | #endif | 
|---|
| 75 |  | 
|---|
| 76 | #ifndef whitespace | 
|---|
| 77 | #define whitespace(c) (((c) == ' ') || ((c) == '\t')) | 
|---|
| 78 | #endif | 
|---|
| 79 |  | 
|---|
| 80 | #ifndef CHAR_MAX | 
|---|
| 81 | #  ifdef __CHAR_UNSIGNED__ | 
|---|
| 82 | #    define CHAR_MAX    0xff | 
|---|
| 83 | #  else | 
|---|
| 84 | #    define CHAR_MAX    0x7f | 
|---|
| 85 | #  endif | 
|---|
| 86 | #endif | 
|---|
| 87 |  | 
|---|
| 88 | #ifndef CHAR_BIT | 
|---|
| 89 | #  define CHAR_BIT 8 | 
|---|
| 90 | #endif | 
|---|
| 91 |  | 
|---|
| 92 | /* Nonzero if the integer type T is signed.  */ | 
|---|
| 93 | #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) | 
|---|
| 94 |  | 
|---|
| 95 | /* Bound on length of the string representing an integer value of type T. | 
|---|
| 96 | Subtract one for the sign bit if T is signed; | 
|---|
| 97 | 302 / 1000 is log10 (2) rounded up; | 
|---|
| 98 | add one for integer division truncation; | 
|---|
| 99 | add one more for a minus sign if t is signed.  */ | 
|---|
| 100 | #define INT_STRLEN_BOUND(t) \ | 
|---|
| 101 | ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \ | 
|---|
| 102 | + 1 + TYPE_SIGNED (t)) | 
|---|
| 103 |  | 
|---|
| 104 |  | 
|---|
| 105 | /* Define exactly what a legal shell identifier consists of. */ | 
|---|
| 106 | #define legal_variable_starter(c) (ISALPHA(c) || (c == '_')) | 
|---|
| 107 | #define legal_variable_char(c)  (ISALNUM(c) || c == '_') | 
|---|
| 108 |  | 
|---|
| 109 | /* Definitions used in subst.c and by the `read' builtin for field | 
|---|
| 110 | splitting. */ | 
|---|
| 111 | #define spctabnl(c)     ((c) == ' ' || (c) == '\t' || (c) == '\n') | 
|---|
| 112 |  | 
|---|
| 113 | /* All structs which contain a `next' field should have that field | 
|---|
| 114 | as the first field in the struct.  This means that functions | 
|---|
| 115 | can be written to handle the general case for linked lists. */ | 
|---|
| 116 | typedef struct g_list { | 
|---|
| 117 | struct g_list *next; | 
|---|
| 118 | } GENERIC_LIST; | 
|---|
| 119 |  | 
|---|
| 120 | /* Here is a generic structure for associating character strings | 
|---|
| 121 | with integers.  It is used in the parser for shell tokenization. */ | 
|---|
| 122 | typedef struct { | 
|---|
| 123 | char *word; | 
|---|
| 124 | int token; | 
|---|
| 125 | } STRING_INT_ALIST; | 
|---|
| 126 |  | 
|---|
| 127 | /* A macro to avoid making an uneccessary function call. */ | 
|---|
| 128 | #define REVERSE_LIST(list, type) \ | 
|---|
| 129 | ((list && list->next) ? (type)list_reverse ((GENERIC_LIST *)list) \ | 
|---|
| 130 | : (type)(list)) | 
|---|
| 131 |  | 
|---|
| 132 | #if __GNUC__ > 1 | 
|---|
| 133 | #  define FASTCOPY(s, d, n)  __builtin_memcpy ((d), (s), (n)) | 
|---|
| 134 | #else /* !__GNUC__ */ | 
|---|
| 135 | #  if !defined (HAVE_BCOPY) | 
|---|
| 136 | #    if !defined (HAVE_MEMMOVE) | 
|---|
| 137 | #      define FASTCOPY(s, d, n)  memcpy ((d), (s), (n)) | 
|---|
| 138 | #    else | 
|---|
| 139 | #      define FASTCOPY(s, d, n)  memmove ((d), (s), (n)) | 
|---|
| 140 | #    endif /* !HAVE_MEMMOVE */ | 
|---|
| 141 | #  else /* HAVE_BCOPY */ | 
|---|
| 142 | #    define FASTCOPY(s, d, n)  bcopy ((s), (d), (n)) | 
|---|
| 143 | #  endif /* HAVE_BCOPY */ | 
|---|
| 144 | #endif /* !__GNUC__ */ | 
|---|
| 145 |  | 
|---|
| 146 | /* String comparisons that possibly save a function call each. */ | 
|---|
| 147 | #define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0) | 
|---|
| 148 | #define STREQN(a, b, n) ((n == 0) ? (1) \ | 
|---|
| 149 | : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)) | 
|---|
| 150 |  | 
|---|
| 151 | /* More convenience definitions that possibly save system or libc calls. */ | 
|---|
| 152 | #define STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0) | 
|---|
| 153 | #define FREE(s)  do { if (s) free (s); } while (0) | 
|---|
| 154 | #define MEMBER(c, s) (((c) && c == (s)[0] && !(s)[1]) || (member(c, s))) | 
|---|
| 155 |  | 
|---|
| 156 | /* A fairly hairy macro to check whether an allocated string has more room, | 
|---|
| 157 | and to resize it using xrealloc if it does not. | 
|---|
| 158 | STR is the string (char *) | 
|---|
| 159 | CIND is the current index into the string (int) | 
|---|
| 160 | ROOM is the amount of additional room we need in the string (int) | 
|---|
| 161 | CSIZE is the currently-allocated size of STR (int) | 
|---|
| 162 | SINCR is how much to increment CSIZE before calling xrealloc (int) */ | 
|---|
| 163 |  | 
|---|
| 164 | #define RESIZE_MALLOCED_BUFFER(str, cind, room, csize, sincr) \ | 
|---|
| 165 | do { \ | 
|---|
| 166 | if ((cind) + (room) >= csize) \ | 
|---|
| 167 | { \ | 
|---|
| 168 | while ((cind) + (room) >= csize) \ | 
|---|
| 169 | csize += (sincr); \ | 
|---|
| 170 | str = xrealloc (str, csize); \ | 
|---|
| 171 | } \ | 
|---|
| 172 | } while (0) | 
|---|
| 173 |  | 
|---|
| 174 | /* Function pointers can be declared as (Function *)foo. */ | 
|---|
| 175 | #if !defined (_FUNCTION_DEF) | 
|---|
| 176 | #  define _FUNCTION_DEF | 
|---|
| 177 | typedef int Function (); | 
|---|
| 178 | typedef void VFunction (); | 
|---|
| 179 | typedef char *CPFunction ();            /* no longer used */ | 
|---|
| 180 | typedef char **CPPFunction ();          /* no longer used */ | 
|---|
| 181 | #endif /* _FUNCTION_DEF */ | 
|---|
| 182 |  | 
|---|
| 183 | #ifndef SH_FUNCTION_TYPEDEF | 
|---|
| 184 | #  define SH_FUNCTION_TYPEDEF | 
|---|
| 185 |  | 
|---|
| 186 | /* Shell function typedefs with prototypes */ | 
|---|
| 187 | /* `Generic' function pointer typedefs */ | 
|---|
| 188 |  | 
|---|
| 189 | typedef int sh_intfunc_t __P((int)); | 
|---|
| 190 | typedef int sh_ivoidfunc_t __P((void)); | 
|---|
| 191 | typedef int sh_icpfunc_t __P((char *)); | 
|---|
| 192 | typedef int sh_icppfunc_t __P((char **)); | 
|---|
| 193 | typedef int sh_iptrfunc_t __P((PTR_T)); | 
|---|
| 194 |  | 
|---|
| 195 | typedef void sh_voidfunc_t __P((void)); | 
|---|
| 196 | typedef void sh_vintfunc_t __P((int)); | 
|---|
| 197 | typedef void sh_vcpfunc_t __P((char *)); | 
|---|
| 198 | typedef void sh_vcppfunc_t __P((char **)); | 
|---|
| 199 | typedef void sh_vptrfunc_t __P((PTR_T)); | 
|---|
| 200 |  | 
|---|
| 201 | typedef int sh_wdesc_func_t __P((WORD_DESC *)); | 
|---|
| 202 | typedef int sh_wlist_func_t __P((WORD_LIST *)); | 
|---|
| 203 |  | 
|---|
| 204 | typedef int sh_glist_func_t __P((GENERIC_LIST *)); | 
|---|
| 205 |  | 
|---|
| 206 | typedef char *sh_string_func_t __P((char *));   /* like savestring, et al. */ | 
|---|
| 207 |  | 
|---|
| 208 | typedef int sh_msg_func_t __P((const char *, ...));     /* printf(3)-like */ | 
|---|
| 209 | typedef void sh_vmsg_func_t __P((const char *, ...));   /* printf(3)-like */ | 
|---|
| 210 |  | 
|---|
| 211 | /* Specific function pointer typedefs.  Most of these could be done | 
|---|
| 212 | with #defines. */ | 
|---|
| 213 | typedef void sh_sv_func_t __P((char *));        /* sh_vcpfunc_t */ | 
|---|
| 214 | typedef void sh_free_func_t __P((PTR_T));       /* sh_vptrfunc_t */ | 
|---|
| 215 | typedef void sh_resetsig_func_t __P((int));     /* sh_vintfunc_t */ | 
|---|
| 216 |  | 
|---|
| 217 | typedef int sh_ignore_func_t __P((const char *));       /* sh_icpfunc_t */ | 
|---|
| 218 |  | 
|---|
| 219 | typedef int sh_assign_func_t __P((const char *));       /* sh_icpfunc_t */ | 
|---|
| 220 | typedef int sh_wassign_func_t __P((WORD_DESC *)); | 
|---|
| 221 |  | 
|---|
| 222 | typedef int sh_builtin_func_t __P((WORD_LIST *)); /* sh_wlist_func_t */ | 
|---|
| 223 |  | 
|---|
| 224 | #endif /* SH_FUNCTION_TYPEDEF */ | 
|---|
| 225 |  | 
|---|
| 226 | #define NOW     ((time_t) time ((time_t *) 0)) | 
|---|
| 227 |  | 
|---|
| 228 | /* Some defines for calling file status functions. */ | 
|---|
| 229 | #define FS_EXISTS         0x1 | 
|---|
| 230 | #define FS_EXECABLE       0x2 | 
|---|
| 231 | #define FS_EXEC_PREFERRED 0x4 | 
|---|
| 232 | #define FS_EXEC_ONLY      0x8 | 
|---|
| 233 | #define FS_DIRECTORY      0x10 | 
|---|
| 234 | #define FS_NODIRS         0x20 | 
|---|
| 235 | #define FS_READABLE       0x40 | 
|---|
| 236 |  | 
|---|
| 237 | /* Default maximum for move_to_high_fd */ | 
|---|
| 238 | #define HIGH_FD_MAX     256 | 
|---|
| 239 |  | 
|---|
| 240 | /* The type of function passed as the fourth argument to qsort(3). */ | 
|---|
| 241 | #ifdef __STDC__ | 
|---|
| 242 | typedef int QSFUNC (const void *, const void *); | 
|---|
| 243 | #else | 
|---|
| 244 | typedef int QSFUNC (); | 
|---|
| 245 | #endif | 
|---|
| 246 |  | 
|---|
| 247 | /* Some useful definitions for Unix pathnames.  Argument convention: | 
|---|
| 248 | x == string, c == character */ | 
|---|
| 249 |  | 
|---|
| 250 | #if !defined (__CYGWIN__) | 
|---|
| 251 | #  define ABSPATH(x)    ((x)[0] == '/') | 
|---|
| 252 | #  define RELPATH(x)    ((x)[0] != '/') | 
|---|
| 253 | #else /* __CYGWIN__ */ | 
|---|
| 254 | #  define ABSPATH(x)    (((x)[0] && ISALPHA((unsigned char)(x)[0]) && (x)[1] == ':') || ISDIRSEP((x)[0])) | 
|---|
| 255 | #  define RELPATH(x)    (ABSPATH(x) == 0) | 
|---|
| 256 | #endif /* __CYGWIN__ */ | 
|---|
| 257 |  | 
|---|
| 258 | #define ROOTEDPATH(x)   (ABSPATH(x)) | 
|---|
| 259 |  | 
|---|
| 260 | #define DIRSEP  '/' | 
|---|
| 261 | #if !defined (__CYGWIN__) | 
|---|
| 262 | #  define ISDIRSEP(c)   ((c) == '/') | 
|---|
| 263 | #else | 
|---|
| 264 | #  define ISDIRSEP(c)   ((c) == '/' || (c) == '\\') | 
|---|
| 265 | #endif /* __CYGWIN__ */ | 
|---|
| 266 | #define PATHSEP(c)      (ISDIRSEP(c) || (c) == 0) | 
|---|
| 267 |  | 
|---|
| 268 | #if 0 | 
|---|
| 269 | /* Declarations for functions defined in xmalloc.c */ | 
|---|
| 270 | extern PTR_T xmalloc __P((size_t)); | 
|---|
| 271 | extern PTR_T xrealloc __P((void *, size_t)); | 
|---|
| 272 | extern void xfree __P((void *)); | 
|---|
| 273 | #endif | 
|---|
| 274 |  | 
|---|
| 275 | /* Declarations for functions defined in general.c */ | 
|---|
| 276 | extern void posix_initialize __P((int)); | 
|---|
| 277 |  | 
|---|
| 278 | #if defined (RLIMTYPE) | 
|---|
| 279 | extern RLIMTYPE string_to_rlimtype __P((char *)); | 
|---|
| 280 | extern void print_rlimtype __P((RLIMTYPE, int)); | 
|---|
| 281 | #endif | 
|---|
| 282 |  | 
|---|
| 283 | extern int all_digits __P((char *)); | 
|---|
| 284 | extern int legal_number __P((char *, intmax_t *)); | 
|---|
| 285 | extern int legal_identifier __P((char *)); | 
|---|
| 286 | extern int check_identifier __P((WORD_DESC *, int)); | 
|---|
| 287 | extern int legal_alias_name __P((char *, int)); | 
|---|
| 288 | extern int assignment __P((const char *, int)); | 
|---|
| 289 |  | 
|---|
| 290 | extern int sh_unset_nodelay_mode __P((int)); | 
|---|
| 291 | extern int sh_validfd __P((int)); | 
|---|
| 292 | extern void check_dev_tty __P((void)); | 
|---|
| 293 | extern int move_to_high_fd __P((int, int, int)); | 
|---|
| 294 | extern int check_binary_file __P((char *, int)); | 
|---|
| 295 |  | 
|---|
| 296 | #ifdef _POSIXSTAT_H_ | 
|---|
| 297 | extern int same_file __P((char *, char *, struct stat *, struct stat *)); | 
|---|
| 298 | #endif | 
|---|
| 299 |  | 
|---|
| 300 | extern int file_isdir __P((char  *)); | 
|---|
| 301 | extern int file_iswdir __P((char  *)); | 
|---|
| 302 | extern int absolute_pathname __P((const char *)); | 
|---|
| 303 | extern int absolute_program __P((const char *)); | 
|---|
| 304 |  | 
|---|
| 305 | extern char *make_absolute __P((char *, char *)); | 
|---|
| 306 | extern char *base_pathname __P((char *)); | 
|---|
| 307 | extern char *full_pathname __P((char *)); | 
|---|
| 308 | extern char *polite_directory_format __P((char *)); | 
|---|
| 309 |  | 
|---|
| 310 | extern char *extract_colon_unit __P((char *, int *)); | 
|---|
| 311 |  | 
|---|
| 312 | extern void tilde_initialize __P((void)); | 
|---|
| 313 | extern char *bash_tilde_find_word __P((const char *, int, int *)); | 
|---|
| 314 | extern char *bash_tilde_expand __P((const char *, int)); | 
|---|
| 315 |  | 
|---|
| 316 | extern int group_member __P((gid_t)); | 
|---|
| 317 | extern char **get_group_list __P((int *)); | 
|---|
| 318 | extern int *get_group_array __P((int *)); | 
|---|
| 319 |  | 
|---|
| 320 | #endif  /* _GENERAL_H_ */ | 
|---|