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