1#ifndef _INCLUDES_H 2#define _INCLUDES_H 3/* 4 Unix SMB/CIFS implementation. 5 Machine customisation and include handling 6 Copyright (C) Andrew Tridgell 1994-1998 7 Copyright (C) 2002 by Martin Pool <mbp@samba.org> 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 2 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22*/ 23 24#ifndef NO_CONFIG_H /* for some tests */ 25#include "config.h" 26#endif 27 28#include "local.h" 29 30#ifdef AIX 31#define DEFAULT_PRINTING PRINT_AIX 32#define PRINTCAP_NAME "/etc/qconfig" 33#endif 34 35#ifdef HPUX 36#define DEFAULT_PRINTING PRINT_HPUX 37#endif 38 39#ifdef QNX 40#define DEFAULT_PRINTING PRINT_QNX 41#endif 42 43#ifdef SUNOS4 44/* on SUNOS4 termios.h conflicts with sys/ioctl.h */ 45#undef HAVE_TERMIOS_H 46#endif 47 48#ifdef LINUX 49#ifndef DEFAULT_PRINTING 50#define DEFAULT_PRINTING PRINT_BSD 51#endif 52#ifndef PRINTCAP_NAME 53#define PRINTCAP_NAME "/etc/printcap" 54#endif 55#endif 56 57#ifdef __GNUC__ 58/** Use gcc attribute to check printf fns. a1 is the 1-based index of 59 * the parameter containing the format, and a2 the index of the first 60 * argument. **/ 61#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) 62#else 63#define PRINTF_ATTRIBUTE(a1, a2) 64#endif 65 66#ifdef __GNUC__ 67/** gcc attribute used on function parameters so that it does not emit 68 * warnings about them being unused. **/ 69# define UNUSED(param) param __attribute__ ((unused)) 70#else 71# define UNUSED(param) param 72/** Feel free to add definitions for other compilers here. */ 73#endif 74 75#ifdef RELIANTUNIX 76/* 77 * <unistd.h> has to be included before any other to get 78 * large file support on Reliant UNIX. Yes, it's broken :-). 79 */ 80#ifdef HAVE_UNISTD_H 81#include <unistd.h> 82#endif 83#endif /* RELIANTUNIX */ 84 85#include <sys/types.h> 86 87#ifdef TIME_WITH_SYS_TIME 88#include <sys/time.h> 89#include <time.h> 90#else 91#ifdef HAVE_SYS_TIME_H 92#include <sys/time.h> 93#else 94#include <time.h> 95#endif 96#endif 97 98#ifdef HAVE_SYS_RESOURCE_H 99#include <sys/resource.h> 100#endif 101 102#ifdef HAVE_UNISTD_H 103#include <unistd.h> 104#endif 105 106#include <stdio.h> 107#include <stddef.h> 108 109#ifdef HAVE_SYS_PARAM_H 110#include <sys/param.h> 111#endif 112 113#ifdef HAVE_STDLIB_H 114#include <stdlib.h> 115#endif 116 117#ifdef HAVE_SYS_SOCKET_H 118#include <sys/socket.h> 119#endif 120 121#ifdef HAVE_UNIXSOCKET 122#include <sys/un.h> 123#endif 124 125#ifdef HAVE_SYS_SYSCALL_H 126#include <sys/syscall.h> 127#elif HAVE_SYSCALL_H 128#include <syscall.h> 129#endif 130 131#ifdef HAVE_STRING_H 132#include <string.h> 133#endif 134 135#ifdef HAVE_STRINGS_H 136#include <strings.h> 137#endif 138 139#ifdef HAVE_MEMORY_H 140#include <memory.h> 141#endif 142 143#ifdef HAVE_MALLOC_H 144#include <malloc.h> 145#endif 146 147#ifdef HAVE_FCNTL_H 148#include <fcntl.h> 149#else 150#ifdef HAVE_SYS_FCNTL_H 151#include <sys/fcntl.h> 152#endif 153#endif 154 155#include <sys/stat.h> 156 157#ifdef HAVE_LIMITS_H 158#include <limits.h> 159#endif 160 161#ifdef HAVE_SYS_IOCTL_H 162#include <sys/ioctl.h> 163#endif 164 165#ifdef HAVE_SYS_FILIO_H 166#include <sys/filio.h> 167#endif 168 169#include <signal.h> 170 171#ifdef HAVE_SYS_WAIT_H 172#include <sys/wait.h> 173#endif 174#ifdef HAVE_CTYPE_H 175#include <ctype.h> 176#endif 177#ifdef HAVE_GRP_H 178#include <grp.h> 179#endif 180#ifdef HAVE_SYS_PRIV_H 181#include <sys/priv.h> 182#endif 183#ifdef HAVE_SYS_ID_H 184#include <sys/id.h> 185#endif 186 187#include <errno.h> 188 189#ifdef HAVE_UTIME_H 190#include <utime.h> 191#endif 192 193#ifdef HAVE_SYS_SELECT_H 194#include <sys/select.h> 195#endif 196 197#ifdef HAVE_SYS_MODE_H 198/* apparently AIX needs this for S_ISLNK */ 199#ifndef S_ISLNK 200#include <sys/mode.h> 201#endif 202#endif 203 204#ifdef HAVE_GLOB_H 205#include <glob.h> 206#endif 207 208#include <pwd.h> 209 210#ifdef HAVE_STDARG_H 211#include <stdarg.h> 212#else 213#include <varargs.h> 214#endif 215 216#include <netinet/in.h> 217#include <arpa/inet.h> 218#include <netdb.h> 219 220#ifdef HAVE_SYSLOG_H 221#include <syslog.h> 222#else 223#ifdef HAVE_SYS_SYSLOG_H 224#include <sys/syslog.h> 225#endif 226#endif 227 228#include <sys/file.h> 229 230#ifdef HAVE_NETINET_TCP_H 231#include <netinet/tcp.h> 232#endif 233 234/* 235 * The next three defines are needed to access the IPTOS_* options 236 * on some systems. 237 */ 238 239#ifdef HAVE_NETINET_IN_SYSTM_H 240#include <netinet/in_systm.h> 241#endif 242 243#ifdef HAVE_NETINET_IN_IP_H 244#include <netinet/in_ip.h> 245#endif 246 247#ifdef HAVE_NETINET_IP_H 248#include <netinet/ip.h> 249#endif 250 251#if defined(HAVE_TERMIOS_H) 252/* POSIX terminal handling. */ 253#include <termios.h> 254#elif defined(HAVE_TERMIO_H) 255/* Older SYSV terminal handling - don't use if we can avoid it. */ 256#include <termio.h> 257#elif defined(HAVE_SYS_TERMIO_H) 258/* Older SYSV terminal handling - don't use if we can avoid it. */ 259#include <sys/termio.h> 260#endif 261 262#if HAVE_DIRENT_H 263# include <dirent.h> 264# define NAMLEN(dirent) strlen((dirent)->d_name) 265#else 266# define dirent direct 267# define NAMLEN(dirent) (dirent)->d_namlen 268# if HAVE_SYS_NDIR_H 269# include <sys/ndir.h> 270# endif 271# if HAVE_SYS_DIR_H 272# include <sys/dir.h> 273# endif 274# if HAVE_NDIR_H 275# include <ndir.h> 276# endif 277#endif 278 279#ifdef HAVE_SYS_MMAN_H 280#include <sys/mman.h> 281#endif 282 283#ifdef HAVE_NET_IF_H 284#include <net/if.h> 285#endif 286 287 288#ifdef HAVE_SYS_MOUNT_H 289#include <sys/mount.h> 290#endif 291 292#ifdef HAVE_SYS_VFS_H 293#include <sys/vfs.h> 294#endif 295 296#ifdef HAVE_SYS_ACL_H 297#include <sys/acl.h> 298#endif 299 300#ifdef HAVE_SYS_FS_S5PARAM_H 301#include <sys/fs/s5param.h> 302#endif 303 304#if defined (HAVE_SYS_FILSYS_H) && !defined (_CRAY) 305#include <sys/filsys.h> 306#endif 307 308#ifdef HAVE_SYS_STATFS_H 309# include <sys/statfs.h> 310#endif 311 312#ifdef HAVE_DUSTAT_H 313#include <sys/dustat.h> 314#endif 315 316#ifdef HAVE_SYS_STATVFS_H 317#include <sys/statvfs.h> 318#endif 319 320#ifdef HAVE_SHADOW_H 321#include <shadow.h> 322#endif 323 324#ifdef HAVE_GETPWANAM 325#include <sys/label.h> 326#include <sys/audit.h> 327#include <pwdadj.h> 328#endif 329 330#ifdef HAVE_SYS_SECURITY_H 331#include <sys/security.h> 332#include <prot.h> 333#define PASSWORD_LENGTH 16 334#endif /* HAVE_SYS_SECURITY_H */ 335 336#ifdef HAVE_STROPTS_H 337#include <stropts.h> 338#endif 339 340#ifdef HAVE_POLL_H 341#include <poll.h> 342#endif 343 344#ifdef HAVE_EXECINFO_H 345#include <execinfo.h> 346#endif 347 348#ifdef HAVE_SYS_CAPABILITY_H 349 350#if defined(BROKEN_REDHAT_7_SYSTEM_HEADERS) && !defined(_I386_STATFS_H) 351#define _I386_STATFS_H 352#define BROKEN_REDHAT_7_STATFS_WORKAROUND 353#endif 354 355#include <sys/capability.h> 356 357#ifdef BROKEN_REDHAT_7_STATFS_WORKAROUND 358#undef _I386_STATFS_H 359#undef BROKEN_REDHAT_7_STATFS_WORKAROUND 360#endif 361 362#endif 363 364#if defined(HAVE_RPC_RPC_H) 365/* 366 * Check for AUTH_ERROR define conflict with rpc/rpc.h in prot.h. 367 */ 368#if defined(HAVE_SYS_SECURITY_H) && defined(HAVE_RPC_AUTH_ERROR_CONFLICT) 369#undef AUTH_ERROR 370#endif 371#include <rpc/rpc.h> 372#endif 373 374#if defined(HAVE_YP_GET_DEFAULT_DOMAIN) && defined(HAVE_SETNETGRENT) && defined(HAVE_ENDNETGRENT) && defined(HAVE_GETNETGRENT) 375#define HAVE_NETGROUP 1 376#endif 377 378#if defined (HAVE_NETGROUP) 379#if defined(HAVE_RPCSVC_YP_PROT_H) 380#include <rpcsvc/yp_prot.h> 381#endif 382#if defined(HAVE_RPCSVC_YPCLNT_H) 383#include <rpcsvc/ypclnt.h> 384#endif 385#endif /* HAVE_NETGROUP */ 386 387#if defined(HAVE_SYS_IPC_H) 388#include <sys/ipc.h> 389#endif /* HAVE_SYS_IPC_H */ 390 391#if defined(HAVE_SYS_SHM_H) 392#include <sys/shm.h> 393#endif /* HAVE_SYS_SHM_H */ 394 395#ifdef HAVE_NATIVE_ICONV 396#ifdef HAVE_ICONV 397#include <iconv.h> 398#endif 399#ifdef HAVE_GICONV 400#include <giconv.h> 401#endif 402#endif 403 404#if HAVE_KRB5_H 405#include <krb5.h> 406#else 407#undef HAVE_KRB5 408#endif 409 410#if HAVE_LBER_H 411#include <lber.h> 412#endif 413 414#if HAVE_LDAP_H 415#include <ldap.h> 416#else 417#undef HAVE_LDAP 418#endif 419 420#if HAVE_GSSAPI_H 421#include <gssapi.h> 422#endif 423 424#if HAVE_GSSAPI_GSSAPI_H 425#include <gssapi/gssapi.h> 426#endif 427 428#if HAVE_GSSAPI_GSSAPI_GENERIC_H 429#include <gssapi/gssapi_generic.h> 430#endif 431 432#if HAVE_COM_ERR_H 433#include <com_err.h> 434#endif 435 436#if HAVE_SYS_ATTRIBUTES_H 437#include <sys/attributes.h> 438#endif 439 440#if HAVE_ATTR_XATTR_H 441#include <attr/xattr.h> 442#endif 443 444#if HAVE_LOCALE_H 445#include <locale.h> 446#endif 447 448#if HAVE_LANGINFO_H 449#include <langinfo.h> 450#endif 451 452/* Special macros that are no-ops except when run under Valgrind on 453 * x86. They've moved a little bit from valgrind 1.0.4 to 1.9.4 */ 454#if HAVE_VALGRIND_MEMCHECK_H 455 /* memcheck.h includes valgrind.h */ 456#include <valgrind/memcheck.h> 457#elif HAVE_VALGRIND_H 458#include <valgrind.h> 459#endif 460 461/* If we have --enable-developer and the valgrind header is present, 462 * then we're OK to use it. Set a macro so this logic can be done only 463 * once. */ 464#if defined(DEVELOPER) && (HAVE_VALGRIND_H || HAVE_VALGRIND_VALGRIND_H) 465#define VALGRIND 466#endif 467 468 469/* we support ADS if we want it and have krb5 and ldap libs */ 470#if defined(WITH_ADS) && defined(HAVE_KRB5) && defined(HAVE_LDAP) 471#define HAVE_ADS 472#endif 473 474/* 475 * Define VOLATILE if needed. 476 */ 477 478#if defined(HAVE_VOLATILE) 479#define VOLATILE volatile 480#else 481#define VOLATILE 482#endif 483 484/* 485 * Define additional missing types 486 */ 487#if defined(HAVE_SIG_ATOMIC_T_TYPE) && defined(AIX) 488typedef sig_atomic_t SIG_ATOMIC_T; 489#elif defined(HAVE_SIG_ATOMIC_T_TYPE) && !defined(AIX) 490typedef sig_atomic_t VOLATILE SIG_ATOMIC_T; 491#else 492typedef int VOLATILE SIG_ATOMIC_T; 493#endif 494 495#ifndef HAVE_SOCKLEN_T_TYPE 496typedef int socklen_t; 497#endif 498 499 500#ifndef uchar 501#define uchar unsigned char 502#endif 503 504#ifdef HAVE_UNSIGNED_CHAR 505#define schar signed char 506#else 507#define schar char 508#endif 509 510/* 511 Samba needs type definitions for int16, int32, uint16 and uint32. 512 513 Normally these are signed and unsigned 16 and 32 bit integers, but 514 they actually only need to be at least 16 and 32 bits 515 respectively. Thus if your word size is 8 bytes just defining them 516 as signed and unsigned int will work. 517*/ 518 519#ifndef uint8 520#define uint8 unsigned char 521#endif 522 523#if !defined(int16) && !defined(HAVE_INT16_FROM_RPC_RPC_H) 524#if (SIZEOF_SHORT == 4) 525#define int16 __ERROR___CANNOT_DETERMINE_TYPE_FOR_INT16; 526#else /* SIZEOF_SHORT != 4 */ 527#define int16 short 528#endif /* SIZEOF_SHORT != 4 */ 529#endif 530 531/* 532 * Note we duplicate the size tests in the unsigned 533 * case as int16 may be a typedef from rpc/rpc.h 534 */ 535 536#if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H) 537#if (SIZEOF_SHORT == 4) 538#define uint16 __ERROR___CANNOT_DETERMINE_TYPE_FOR_INT16; 539#else /* SIZEOF_SHORT != 4 */ 540#define uint16 unsigned short 541#endif /* SIZEOF_SHORT != 4 */ 542#endif 543 544#if !defined(int32) && !defined(HAVE_INT32_FROM_RPC_RPC_H) 545#if (SIZEOF_INT == 4) 546#define int32 int 547#elif (SIZEOF_LONG == 4) 548#define int32 long 549#elif (SIZEOF_SHORT == 4) 550#define int32 short 551#else 552/* uggh - no 32 bit type?? probably a CRAY. just hope this works ... */ 553#define int32 int 554#endif 555#endif 556 557/* 558 * Note we duplicate the size tests in the unsigned 559 * case as int32 may be a typedef from rpc/rpc.h 560 */ 561 562#if !defined(uint32) && !defined(HAVE_UINT32_FROM_RPC_RPC_H) 563#if (SIZEOF_INT == 4) 564#define uint32 unsigned int 565#elif (SIZEOF_LONG == 4) 566#define uint32 unsigned long 567#elif (SIZEOF_SHORT == 4) 568#define uint32 unsigned short 569#else 570/* uggh - no 32 bit type?? probably a CRAY. just hope this works ... */ 571#define uint32 unsigned 572#endif 573#endif 574 575/* 576 * Types for devices, inodes and offsets. 577 */ 578 579#ifndef SMB_DEV_T 580# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_DEV64_T) 581# define SMB_DEV_T dev64_t 582# else 583# define SMB_DEV_T dev_t 584# endif 585#endif 586 587/* 588 * Setup the correctly sized inode type. 589 */ 590 591#ifndef SMB_INO_T 592# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_INO64_T) 593# define SMB_INO_T ino64_t 594# else 595# define SMB_INO_T ino_t 596# endif 597#endif 598 599#ifndef LARGE_SMB_INO_T 600# if (defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_INO64_T)) || (defined(SIZEOF_INO_T) && (SIZEOF_INO_T == 8)) 601# define LARGE_SMB_INO_T 1 602# endif 603#endif 604 605#ifdef LARGE_SMB_INO_T 606#define SINO_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32)) 607#else 608#define SINO_T(p, ofs, v) (SIVAL(p,ofs,v),SIVAL(p,(ofs)+4,0)) 609#endif 610 611#ifndef SMB_OFF_T 612# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) 613# define SMB_OFF_T off64_t 614# else 615# define SMB_OFF_T off_t 616# endif 617#endif 618 619/* this should really be a 64 bit type if possible */ 620#define br_off SMB_BIG_UINT 621 622#define SMB_OFF_T_BITS (sizeof(SMB_OFF_T)*8) 623 624/* 625 * Set the define that tells us if we can do 64 bit 626 * NT SMB calls. 627 */ 628 629#ifndef LARGE_SMB_OFF_T 630# if (defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T)) || (defined(SIZEOF_OFF_T) && (SIZEOF_OFF_T == 8)) 631# define LARGE_SMB_OFF_T 1 632# endif 633#endif 634 635#ifdef LARGE_SMB_OFF_T 636#define SOFF_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32)) 637#define SOFF_T_R(p, ofs, v) (SIVAL(p,(ofs)+4,(v)&0xFFFFFFFF), SIVAL(p,ofs,(v)>>32)) 638#define IVAL_TO_SMB_OFF_T(buf,off) ((SMB_OFF_T)(( ((SMB_BIG_UINT)(IVAL((buf),(off)))) & ((SMB_BIG_UINT)0xFFFFFFFF) ))) 639#define IVAL2_TO_SMB_BIG_UINT(buf,off) ( (((SMB_BIG_UINT)(IVAL((buf),(off)))) & ((SMB_BIG_UINT)0xFFFFFFFF)) | \ 640 (( ((SMB_BIG_UINT)(IVAL((buf),(off+4)))) & ((SMB_BIG_UINT)0xFFFFFFFF) ) << 32 ) ) 641#else 642#define SOFF_T(p, ofs, v) (SIVAL(p,ofs,v),SIVAL(p,(ofs)+4,0)) 643#define SOFF_T_R(p, ofs, v) (SIVAL(p,(ofs)+4,v),SIVAL(p,ofs,0)) 644#define IVAL_TO_SMB_OFF_T(buf,off) ((SMB_OFF_T)(( ((uint32)(IVAL((buf),(off)))) & 0xFFFFFFFF ))) 645#define IVAL2_TO_SMB_BIG_UINT(buf,off) ( (((SMB_BIG_UINT)(IVAL((buf),(off)))) & ((SMB_BIG_UINT)0xFFFFFFFF)) | \ 646 (( ((SMB_BIG_UINT)(IVAL((buf),(off+4)))) & ((SMB_BIG_UINT)0xFFFFFFFF) ) << 32 ) ) 647#endif 648 649/* 650 * Type for stat structure. 651 */ 652 653#ifndef SMB_STRUCT_STAT 654# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_STAT64) && defined(HAVE_OFF64_T) 655# define SMB_STRUCT_STAT struct stat64 656# else 657# define SMB_STRUCT_STAT struct stat 658# endif 659#endif 660 661/* 662 * Type for dirent structure. 663 */ 664 665#ifndef SMB_STRUCT_DIRENT 666# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_STRUCT_DIRENT64) 667# define SMB_STRUCT_DIRENT struct dirent64 668# else 669# define SMB_STRUCT_DIRENT struct dirent 670# endif 671#endif 672 673/* 674 * Defines for 64 bit fcntl locks. 675 */ 676 677#ifndef SMB_STRUCT_FLOCK 678# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T) 679# define SMB_STRUCT_FLOCK struct flock64 680# else 681# define SMB_STRUCT_FLOCK struct flock 682# endif 683#endif 684 685#ifndef SMB_F_SETLKW 686# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T) 687# define SMB_F_SETLKW F_SETLKW64 688# else 689# define SMB_F_SETLKW F_SETLKW 690# endif 691#endif 692 693#ifndef SMB_F_SETLK 694# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T) 695# define SMB_F_SETLK F_SETLK64 696# else 697# define SMB_F_SETLK F_SETLK 698# endif 699#endif 700 701#ifndef SMB_F_GETLK 702# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T) 703# define SMB_F_GETLK F_GETLK64 704# else 705# define SMB_F_GETLK F_GETLK 706# endif 707#endif 708 709#if defined(HAVE_LONGLONG) 710#define SMB_BIG_UINT unsigned long long 711#define SMB_BIG_INT long long 712#define SBIG_UINT(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32)) 713#else 714#define SMB_BIG_UINT unsigned long 715#define SMB_BIG_INT long 716#define SBIG_UINT(p, ofs, v) (SIVAL(p,ofs,v),SIVAL(p,(ofs)+4,0)) 717#endif 718 719#define SMB_BIG_UINT_BITS (sizeof(SMB_BIG_UINT)*8) 720 721#ifndef MIN 722#define MIN(a,b) ((a)<(b)?(a):(b)) 723#endif 724 725#ifndef MAX 726#define MAX(a,b) ((a)>(b)?(a):(b)) 727#endif 728 729#ifndef HAVE_STRERROR 730extern char *sys_errlist[]; 731#define strerror(i) sys_errlist[i] 732#endif 733 734#ifndef HAVE_ERRNO_DECL 735extern int errno; 736#endif 737 738#ifdef HAVE_BROKEN_GETGROUPS 739#define GID_T int 740#else 741#define GID_T gid_t 742#endif 743 744#ifndef NGROUPS_MAX 745#define NGROUPS_MAX 32 /* Guess... */ 746#endif 747 748/* Our own pstrings and fstrings */ 749#include "pstring.h" 750 751/* Lists, trees, caching, database... */ 752#include "xfile.h" 753#include "intl.h" 754#include "ubi_sLinkList.h" 755#include "ubi_dLinkList.h" 756#include "dlinklist.h" 757#include "../tdb/tdb.h" 758#include "../tdb/spinlock.h" 759#include "../tdb/tdbutil.h" 760#include "talloc.h" 761#include "nt_status.h" 762#include "ads.h" 763#include "interfaces.h" 764#include "hash.h" 765#include "trans2.h" 766#include "nterr.h" 767#include "ntioctl.h" 768#include "messages.h" 769#include "charset.h" 770#include "dynconfig.h" 771#include "adt_tree.h" 772 773#include "util_getent.h" 774 775#ifndef UBI_BINTREE_H 776#include "ubi_Cache.h" 777#endif /* UBI_BINTREE_H */ 778 779#include "debugparse.h" 780 781#include "version.h" 782 783#include "smb.h" 784 785#include "nameserv.h" 786 787#include "secrets.h" 788 789#include "byteorder.h" 790 791#include "privileges.h" 792 793#include "rpc_creds.h" 794 795#include "mapping.h" 796 797#include "passdb.h" 798 799#include "ntdomain.h" 800 801#include "rpc_misc.h" 802 803#include "rpc_secdes.h" 804 805#include "nt_printing.h" 806 807#include "msdfs.h" 808 809#include "smbprofile.h" 810 811#include "rap.h" 812 813#include "md5.h" 814#include "hmacmd5.h" 815 816#include "ntlmssp.h" 817 818#include "auth.h" 819 820#include "idmap.h" 821 822#include "client.h" 823 824#include "smbw.h" 825 826#include "session.h" 827 828#include "asn_1.h" 829 830#include "popt.h" 831 832#include "mangle.h" 833 834#include "module.h" 835 836#include "nsswitch/winbind_client.h" 837 838#include "spnego.h" 839 840/* 841 * Type for wide character dirent structure. 842 * Only d_name is defined by POSIX. 843 */ 844 845typedef struct smb_wdirent { 846 wpstring d_name; 847} SMB_STRUCT_WDIRENT; 848 849/* 850 * Type for wide character passwd structure. 851 */ 852 853typedef struct smb_wpasswd { 854 wfstring pw_name; 855 char *pw_passwd; 856 uid_t pw_uid; 857 gid_t pw_gid; 858 wpstring pw_gecos; 859 wpstring pw_dir; 860 wpstring pw_shell; 861} SMB_STRUCT_WPASSWD; 862 863/* used in net.c */ 864struct functable { 865 const char *funcname; 866 int (*fn)(int argc, const char **argv); 867}; 868 869 870/* Defines for wisXXX functions. */ 871#define UNI_UPPER 0x1 872#define UNI_LOWER 0x2 873#define UNI_DIGIT 0x4 874#define UNI_XDIGIT 0x8 875#define UNI_SPACE 0x10 876 877#include "nsswitch/winbind_nss.h" 878 879/* forward declaration from printing.h to get around 880 header file dependencies */ 881 882struct printjob; 883 884struct smb_ldap_privates; 885 886/* forward declarations from smbldap.c */ 887 888#include "smbldap.h" 889 890/***** automatically generated prototypes *****/ 891#ifndef NO_PROTO_H 892#include "proto.h" 893#endif 894 895/* String routines */ 896 897#include "srvstr.h" 898#include "safe_string.h" 899 900#ifdef __COMPAR_FN_T 901#define QSORT_CAST (__compar_fn_t) 902#endif 903 904#ifndef QSORT_CAST 905#define QSORT_CAST (int (*)(const void *, const void *)) 906#endif 907 908#ifndef DEFAULT_PRINTING 909#ifdef HAVE_CUPS 910#define DEFAULT_PRINTING PRINT_CUPS 911#define PRINTCAP_NAME "cups" 912#elif defined(SYSV) 913#define DEFAULT_PRINTING PRINT_SYSV 914#define PRINTCAP_NAME "lpstat" 915#else 916#define DEFAULT_PRINTING PRINT_BSD 917#define PRINTCAP_NAME "/etc/printcap" 918#endif 919#endif 920 921#ifndef PRINTCAP_NAME 922#define PRINTCAP_NAME "/etc/printcap" 923#endif 924 925#ifndef SIGCLD 926#define SIGCLD SIGCHLD 927#endif 928 929#ifndef SIGRTMIN 930#define SIGRTMIN 32 931#endif 932 933#ifndef MAP_FILE 934#define MAP_FILE 0 935#endif 936 937#if defined(HAVE_PUTPRPWNAM) && defined(AUTH_CLEARTEXT_SEG_CHARS) 938#define OSF1_ENH_SEC 1 939#endif 940 941#ifndef ALLOW_CHANGE_PASSWORD 942#if (defined(HAVE_TERMIOS_H) && defined(HAVE_DUP2) && defined(HAVE_SETSID)) 943#define ALLOW_CHANGE_PASSWORD 1 944#endif 945#endif 946 947/* what is the longest significant password available on your system? 948 Knowing this speeds up password searches a lot */ 949#ifndef PASSWORD_LENGTH 950#define PASSWORD_LENGTH 8 951#endif 952 953#ifdef REPLACE_INET_NTOA 954#define inet_ntoa rep_inet_ntoa 955#endif 956 957#ifndef HAVE_PIPE 958#define SYNC_DNS 1 959#endif 960 961#ifndef SEEK_SET 962#define SEEK_SET 0 963#endif 964 965#ifndef INADDR_LOOPBACK 966#define INADDR_LOOPBACK 0x7f000001 967#endif 968 969#ifndef INADDR_NONE 970#define INADDR_NONE 0xffffffff 971#endif 972 973#ifndef HAVE_CRYPT 974#define crypt ufc_crypt 975#endif 976 977#ifndef O_ACCMODE 978#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) 979#endif 980 981#if defined(HAVE_CRYPT16) && defined(HAVE_GETAUTHUID) 982#define ULTRIX_AUTH 1 983#endif 984 985#ifndef HAVE_STRDUP 986char *strdup(const char *s); 987#endif 988 989#ifndef HAVE_STRNDUP 990char *strndup(const char *s, size_t size); 991#endif 992 993#ifndef HAVE_MEMMOVE 994void *memmove(void *dest,const void *src,int size); 995#endif 996 997#ifndef HAVE_INITGROUPS 998int initgroups(char *name,gid_t id); 999#endif 1000 1001#ifndef HAVE_RENAME 1002int rename(const char *zfrom, const char *zto); 1003#endif 1004 1005#ifndef HAVE_MKTIME 1006time_t mktime(struct tm *t); 1007#endif 1008 1009#ifndef HAVE_STRLCPY 1010size_t strlcpy(char *d, const char *s, size_t bufsize); 1011#endif 1012 1013#ifndef HAVE_STRLCAT 1014size_t strlcat(char *d, const char *s, size_t bufsize); 1015#endif 1016 1017#ifndef HAVE_FTRUNCATE 1018int ftruncate(int f,long l); 1019#endif 1020 1021#ifndef HAVE_STRNDUP 1022char *strndup(const char *s, size_t n); 1023#endif 1024 1025#ifndef HAVE_STRNLEN 1026size_t strnlen(const char *s, size_t n); 1027#endif 1028 1029#ifndef HAVE_STRTOUL 1030unsigned long strtoul(const char *nptr, char **endptr, int base); 1031#endif 1032 1033#ifndef HAVE_SETENV 1034int setenv(const char *name, const char *value, int overwrite); 1035#endif 1036 1037#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL)) 1038/* stupid glibc */ 1039int setresuid(uid_t ruid, uid_t euid, uid_t suid); 1040#endif 1041#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESGID_DECL)) 1042int setresgid(gid_t rgid, gid_t egid, gid_t sgid); 1043#endif 1044#ifndef HAVE_VASPRINTF_DECL 1045int vasprintf(char **ptr, const char *format, va_list ap); 1046#endif 1047 1048#ifdef REPLACE_GETPASS 1049#define getpass(prompt) getsmbpass((prompt)) 1050#endif 1051 1052/* 1053 * Some older systems seem not to have MAXHOSTNAMELEN 1054 * defined. 1055 */ 1056#ifndef MAXHOSTNAMELEN 1057#define MAXHOSTNAMELEN 254 1058#endif 1059 1060/* yuck, I'd like a better way of doing this */ 1061#define DIRP_SIZE (256 + 32) 1062 1063/* 1064 * glibc on linux doesn't seem to have MSG_WAITALL 1065 * defined. I think the kernel has it though.. 1066 */ 1067 1068#ifndef MSG_WAITALL 1069#define MSG_WAITALL 0 1070#endif 1071 1072/* default socket options. Dave Miller thinks we should default to TCP_NODELAY 1073 given the socket IO pattern that Samba uses */ 1074#ifdef TCP_NODELAY 1075#define DEFAULT_SOCKET_OPTIONS "TCP_NODELAY" 1076#else 1077#define DEFAULT_SOCKET_OPTIONS "" 1078#endif 1079 1080/* default level one and level two file extensions 1081 */ 1082#define DEFAULT_LEVEL_ONE_FILE_EXTS "" 1083#define DEFAULT_LEVEL_TWO_FILE_EXTS "" 1084 1085/* Load header file for dynamic linking stuff */ 1086 1087#ifdef HAVE_DLFCN_H 1088#include <dlfcn.h> 1089#endif 1090 1091/* dmalloc -- free heap debugger (dmalloc.org). This should be near 1092 * the *bottom* of include files so as not to conflict. */ 1093#ifdef ENABLE_DMALLOC 1094# include <dmalloc.h> 1095#endif 1096 1097 1098/* Some POSIX definitions for those without */ 1099 1100#ifndef S_IFDIR 1101#define S_IFDIR 0x4000 1102#endif 1103#ifndef S_ISDIR 1104#define S_ISDIR(mode) ((mode & 0xF000) == S_IFDIR) 1105#endif 1106#ifndef S_IRWXU 1107#define S_IRWXU 00700 /* read, write, execute: owner */ 1108#endif 1109#ifndef S_IRUSR 1110#define S_IRUSR 00400 /* read permission: owner */ 1111#endif 1112#ifndef S_IWUSR 1113#define S_IWUSR 00200 /* write permission: owner */ 1114#endif 1115#ifndef S_IXUSR 1116#define S_IXUSR 00100 /* execute permission: owner */ 1117#endif 1118#ifndef S_IRWXG 1119#define S_IRWXG 00070 /* read, write, execute: group */ 1120#endif 1121#ifndef S_IRGRP 1122#define S_IRGRP 00040 /* read permission: group */ 1123#endif 1124#ifndef S_IWGRP 1125#define S_IWGRP 00020 /* write permission: group */ 1126#endif 1127#ifndef S_IXGRP 1128#define S_IXGRP 00010 /* execute permission: group */ 1129#endif 1130#ifndef S_IRWXO 1131#define S_IRWXO 00007 /* read, write, execute: other */ 1132#endif 1133#ifndef S_IROTH 1134#define S_IROTH 00004 /* read permission: other */ 1135#endif 1136#ifndef S_IWOTH 1137#define S_IWOTH 00002 /* write permission: other */ 1138#endif 1139#ifndef S_IXOTH 1140#define S_IXOTH 00001 /* execute permission: other */ 1141#endif 1142 1143/* For sys_adminlog(). */ 1144#ifndef LOG_EMERG 1145#define LOG_EMERG 0 /* system is unusable */ 1146#endif 1147 1148#ifndef LOG_ALERT 1149#define LOG_ALERT 1 /* action must be taken immediately */ 1150#endif 1151 1152#ifndef LOG_CRIT 1153#define LOG_CRIT 2 /* critical conditions */ 1154#endif 1155 1156#ifndef LOG_ERR 1157#define LOG_ERR 3 /* error conditions */ 1158#endif 1159 1160#ifndef LOG_WARNING 1161#define LOG_WARNING 4 /* warning conditions */ 1162#endif 1163 1164#ifndef LOG_NOTICE 1165#define LOG_NOTICE 5 /* normal but significant condition */ 1166#endif 1167 1168#ifndef LOG_INFO 1169#define LOG_INFO 6 /* informational */ 1170#endif 1171 1172#ifndef LOG_DEBUG 1173#define LOG_DEBUG 7 /* debug-level messages */ 1174#endif 1175 1176/* NetBSD doesn't have these */ 1177#ifndef SHM_R 1178#define SHM_R 0400 1179#endif 1180 1181#ifndef SHM_W 1182#define SHM_W 0200 1183#endif 1184 1185#if HAVE_KERNEL_SHARE_MODES 1186#ifndef LOCK_MAND 1187#define LOCK_MAND 32 /* This is a mandatory flock */ 1188#define LOCK_READ 64 /* ... Which allows concurrent read operations */ 1189#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ 1190#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ 1191#endif 1192#endif 1193 1194extern int DEBUGLEVEL; 1195 1196#define MAX_SEC_CTX_DEPTH 8 /* Maximum number of security contexts */ 1197 1198 1199#ifdef GLIBC_HACK_FCNTL64 1200/* this is a gross hack. 64 bit locking is completely screwed up on 1201 i386 Linux in glibc 2.1.95 (which ships with RedHat 7.0). This hack 1202 "fixes" the problem with the current 2.4.0test kernels 1203*/ 1204#define fcntl fcntl64 1205#undef F_SETLKW 1206#undef F_SETLK 1207#define F_SETLK 13 1208#define F_SETLKW 14 1209#endif 1210 1211 1212/* Needed for sys_dlopen/sys_dlsym/sys_dlclose */ 1213#ifndef RTLD_GLOBAL 1214#define RTLD_GLOBAL 0 1215#endif 1216 1217#ifndef RTLD_LAZY 1218#define RTLD_LAZY 0 1219#endif 1220 1221#ifndef RTLD_NOW 1222#define RTLD_NOW 0 1223#endif 1224 1225/* needed for some systems without iconv. Doesn't really matter 1226 what error code we use */ 1227#ifndef EILSEQ 1228#define EILSEQ EIO 1229#endif 1230 1231/* add varargs prototypes with printf checking */ 1232int fdprintf(int , const char *, ...) PRINTF_ATTRIBUTE(2,3); 1233int d_printf(const char *, ...) PRINTF_ATTRIBUTE(1,2); 1234int d_fprintf(FILE *f, const char *, ...) PRINTF_ATTRIBUTE(2,3); 1235#ifndef HAVE_SNPRINTF_DECL 1236int snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4); 1237#endif 1238#ifndef HAVE_ASPRINTF_DECL 1239int asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3); 1240#endif 1241 1242/* Fix prototype problem with non-C99 compliant snprintf implementations, esp 1243 HPUX 11. Don't change the sense of this #if statement. Read the comments 1244 in lib/snprint.c if you think you need to. See also bugzilla bug 174. */ 1245 1246#if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF) 1247#define snprintf smb_snprintf 1248#endif 1249 1250void sys_adminlog(int priority, const char *format_str, ...) PRINTF_ATTRIBUTE(2,3); 1251 1252int pstr_sprintf(pstring s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); 1253int fstr_sprintf(fstring s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); 1254 1255int d_vfprintf(FILE *f, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0); 1256 1257int smb_xvasprintf(char **ptr, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0); 1258 1259/* we used to use these fns, but now we have good replacements 1260 for snprintf and vsnprintf */ 1261#define slprintf snprintf 1262#define vslprintf vsnprintf 1263 1264 1265/* we need to use __va_copy() on some platforms */ 1266#ifdef HAVE_VA_COPY 1267#define VA_COPY(dest, src) va_copy(dest, src) 1268#else 1269#ifdef HAVE___VA_COPY 1270#define VA_COPY(dest, src) __va_copy(dest, src) 1271#else 1272#define VA_COPY(dest, src) (dest) = (src) 1273#endif 1274#endif 1275 1276#ifndef HAVE_TIMEGM 1277time_t timegm(struct tm *tm); 1278#endif 1279 1280/* 1281 * Veritas File System. Often in addition to native. 1282 * Quotas different. 1283 */ 1284#if defined(HAVE_SYS_FS_VX_QUOTA_H) 1285#define VXFS_QUOTA 1286#endif 1287 1288#if defined(HAVE_KRB5) 1289 1290#ifndef HAVE_KRB5_SET_REAL_TIME 1291krb5_error_code krb5_set_real_time(krb5_context context, int32_t seconds, int32_t microseconds); 1292#endif 1293 1294#ifndef HAVE_KRB5_SET_DEFAULT_TGS_KTYPES 1295krb5_error_code krb5_set_default_tgs_ktypes(krb5_context ctx, const krb5_enctype *enc); 1296#endif 1297 1298#if defined(HAVE_KRB5_AUTH_CON_SETKEY) && !defined(HAVE_KRB5_AUTH_CON_SETUSERUSERKEY) 1299krb5_error_code krb5_auth_con_setuseruserkey(krb5_context context, krb5_auth_context auth_context, krb5_keyblock *keyblock); 1300#endif 1301 1302/* Samba wrapper function for krb5 functionality. */ 1303void setup_kaddr( krb5_address *pkaddr, struct sockaddr *paddr); 1304int create_kerberos_key_from_string(krb5_context context, krb5_principal host_princ, krb5_data *password, krb5_keyblock *key, krb5_enctype enctype); 1305void get_auth_data_from_tkt(DATA_BLOB *auth_data, krb5_ticket *tkt); 1306krb5_const_principal get_principal_from_tkt(krb5_ticket *tkt); 1307krb5_error_code krb5_locate_kdc(krb5_context ctx, const krb5_data *realm, struct sockaddr **addr_pp, int *naddrs, int get_masters); 1308krb5_error_code get_kerberos_allowed_etypes(krb5_context context, krb5_enctype **enctypes); 1309void free_kerberos_etypes(krb5_context context, krb5_enctype *enctypes); 1310BOOL get_krb5_smb_session_key(krb5_context context, krb5_auth_context auth_context, DATA_BLOB *session_key, BOOL remote); 1311#endif /* HAVE_KRB5 */ 1312 1313/* TRUE and FALSE are part of the C99 standard and gcc, but 1314 unfortunately many vendor compilers don't support them. Use True 1315 and False instead. */ 1316 1317#ifdef TRUE 1318#undef TRUE 1319#endif 1320#define TRUE __ERROR__XX__DONT_USE_TRUE 1321 1322#ifdef FALSE 1323#undef FALSE 1324#endif 1325#define FALSE __ERROR__XX__DONT_USE_FALSE 1326 1327/* If we have blacklisted mmap() try to avoid using it accidentally by 1328 undefining the HAVE_MMAP symbol. */ 1329 1330#ifdef MMAP_BLACKLIST 1331#undef HAVE_MMAP 1332#endif 1333 1334#endif /* _INCLUDES_H */ 1335