on Linux force fcntl/mmap based shared memory and on other systems
[samba.git] / source3 / include / includes.h
1 #ifndef _INCLUDES_H
2 #define _INCLUDES_H
3 /* 
4    Unix SMB/Netbios implementation.
5    Version 1.9.
6    Machine customisation and include handling
7    Copyright (C) Andrew Tridgell 1994-1998
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
49 /* if we have both SYSV IPC and shared mmap then we need to choose. For most
50    systems it is much faster to use SYSV IPC, but under Linux it is
51    about 5 times faster to use fcntl, so for Linux systems we force
52    fcntl based locking */
53 #if (defined(HAVE_SYSV_IPC) && defined(HAVE_SHARED_MMAP))
54 # ifdef LINUX
55 #  undef HAVE_SYSV_IPC
56 # else
57 #  undef HAVE_SHARED_MMAP
58 # endif
59 #endif
60
61
62 #include <sys/types.h>
63
64 #ifdef TIME_WITH_SYS_TIME
65 #include <sys/time.h>
66 #include <time.h>
67 #else
68 #ifdef HAVE_SYS_TIME_H
69 #include <sys/time.h>
70 #else
71 #include <time.h>
72 #endif
73 #endif
74
75 #ifdef HAVE_SYS_RESOURCE_H
76 #include <sys/resource.h>
77 #endif
78
79 #ifdef HAVE_UNISTD_H
80 #include <unistd.h>
81 #endif
82
83 #include <stdio.h>
84 #include <stddef.h>
85
86 #include <netinet/in.h>
87 #if defined(HAVE_RPC_RPC_H)
88 #include <rpc/rpc.h>
89 #endif
90
91 #ifdef HAVE_SYS_PARAM_H
92 #include <sys/param.h>
93 #endif
94
95 #ifdef HAVE_STDLIB_H
96 #include <stdlib.h>
97 #endif
98
99 #ifdef HAVE_SYS_SOCKET_H
100 #include <sys/socket.h>
101 #endif
102
103 #ifdef HAVE_SYS_SYSCALL_H
104 #include <sys/syscall.h>
105 #elif HAVE_SYSCALL_H
106 #include <syscall.h>
107 #endif
108
109 #ifdef HAVE_STRING_H
110 #include <string.h>
111 #endif
112
113 #ifdef HAVE_STRINGS_H
114 #include <strings.h>
115 #endif
116
117 #ifdef HAVE_MEMORY_H
118 #include <memory.h>
119 #endif
120
121 #ifdef MEM_MAN
122 #include "../mem_man/mem_man.h"
123 #else
124 #ifdef HAVE_MALLOC_H
125 #include <malloc.h>
126 #endif
127 #endif
128
129 #ifdef HAVE_FCNTL_H
130 #include <fcntl.h>
131 #else
132 #ifdef HAVE_SYS_FCNTL_H
133 #include <sys/fcntl.h>
134 #endif
135 #endif
136
137 #include <sys/stat.h>
138
139 #ifdef HAVE_LIMITS_H
140 #include <limits.h>
141 #endif
142
143 #ifdef HAVE_SYS_IOCTL_H
144 #include <sys/ioctl.h>
145 #endif
146
147 #ifdef HAVE_SYS_FILIO_H
148 #include <sys/filio.h>
149 #endif
150
151 #include <signal.h>
152
153 #ifdef HAVE_SYS_WAIT_H
154 #include <sys/wait.h>
155 #endif
156 #ifdef HAVE_CTYPE_H
157 #include <ctype.h>
158 #endif
159 #ifdef HAVE_GRP_H
160 #include <grp.h>
161 #endif
162 #ifdef HAVE_SYS_ID_H
163 #include <sys/id.h>
164 #endif
165
166 #include <errno.h>
167
168 #ifdef HAVE_UTIME_H
169 #include <utime.h>
170 #endif
171
172 #ifdef HAVE_SYS_SELECT_H
173 #include <sys/select.h>
174 #endif
175
176 #ifdef HAVE_SYS_MODE_H
177 /* apparently AIX needs this for S_ISLNK */
178 #ifndef S_ISLNK
179 #include <sys/mode.h>
180 #endif
181 #endif
182
183 #ifdef HAVE_GLOB_H
184 #include <glob.h>
185 #endif
186
187 #include <pwd.h>
188 #include <grp.h>
189
190 #ifdef HAVE_STDARG_H
191 #include <stdarg.h>
192 #else
193 #include <varargs.h>
194 #endif
195
196 #include <arpa/inet.h>
197 #include <netdb.h>
198 #include <syslog.h>
199 #include <sys/file.h>
200
201 #ifdef HAVE_NETINET_TCP_H
202 #include <netinet/tcp.h>
203 #endif
204
205 #ifdef HAVE_TERMIOS_H
206 #include <termios.h>
207 #endif
208
209 #if HAVE_DIRENT_H
210 # include <dirent.h>
211 # define NAMLEN(dirent) strlen((dirent)->d_name)
212 #else
213 # define dirent direct
214 # define NAMLEN(dirent) (dirent)->d_namlen
215 # if HAVE_SYS_NDIR_H
216 #  include <sys/ndir.h>
217 # endif
218 # if HAVE_SYS_DIR_H
219 #  include <sys/dir.h>
220 # endif
221 # if HAVE_NDIR_H
222 #  include <ndir.h>
223 # endif
224 #endif
225
226 #ifdef HAVE_SHARED_MMAP
227 #include <sys/mman.h>
228 #endif
229
230 #ifdef HAVE_SYSV_IPC
231 #include <sys/ipc.h>
232 #include <sys/shm.h>
233 #include <sys/sem.h>
234 #endif
235
236 #if 0
237 /*
238  *  I have removed this as it prevents compilation under SCO Server
239  *  3.2. If you need to add it back in then please add a comment as to
240  *  why it's needed and what OS it's needed for so we can work out how
241  *  to test for it properly (tridge) */
242 #ifdef HAVE_NET_ROUTE_H
243 #include <net/route.h>
244 #endif
245 #endif
246
247 #ifdef HAVE_NET_IF_H
248 #include <net/if.h>
249 #endif
250
251
252 #ifdef HAVE_SYS_MOUNT_H
253 #include <sys/mount.h>
254 #endif
255
256 #ifdef HAVE_SYS_VFS_H
257 #include <sys/vfs.h>
258 #endif
259
260 #ifdef HAVE_SYS_ACL_H
261 #include <sys/acl.h>
262 #endif
263
264 #ifdef HAVE_SYS_FS_S5PARAM_H 
265 #include <sys/fs/s5param.h>
266 #endif
267
268 #if defined (HAVE_SYS_FILSYS_H) && !defined (_CRAY)
269 #include <sys/filsys.h> 
270 #endif
271
272 #ifdef HAVE_SYS_STATFS_H
273 # include <sys/statfs.h>
274 #endif
275
276 #ifdef HAVE_DUSTAT_H              
277 #include <sys/dustat.h>
278 #endif
279
280 #ifdef HAVE_SYS_STATVFS_H          
281 #include <sys/statvfs.h>
282 #endif
283
284 #ifdef HAVE_SHADOW_H
285 #include <shadow.h>
286 #endif
287
288 #ifdef HAVE_GETPWANAM
289 #include <sys/label.h>
290 #include <sys/audit.h>
291 #include <pwdadj.h>
292 #endif
293
294 #ifdef HAVE_SYS_SECURITY_H
295 #include <sys/security.h>
296 #include <prot.h>
297 #define PASSWORD_LENGTH 16
298 #endif  /* HAVE_SYS_SECURITY_H */
299
300 #ifdef HAVE_COMPAT_H
301 #include <compat.h>
302 #endif
303
304 #ifdef HAVE_STROPTS_H
305 #include <stropts.h>
306 #endif
307
308 #ifdef HAVE_POLL_H
309 #include <poll.h>
310 #endif
311
312 #ifdef HAVE_SYS_CAPABILITY_H
313 #include <sys/capability.h>
314 #endif
315
316 #if defined(HAVE_RPC_RPC_H)
317 #include <rpc/rpc.h>
318 #endif
319
320 #if defined(HAVE_YP_GET_DEFAULT_DOMAIN) && defined(HAVE_SETNETGRENT) && defined(HAVE_ENDNETGRENT) && defined(HAVE_GETNETGRENT)
321 #define HAVE_NETGROUP 1
322 #endif
323
324 #if defined (HAVE_NETGROUP)
325 #if defined(HAVE_RPCSVC_YP_PROT_H)
326 #include <rpcsvc/yp_prot.h>
327 #endif
328 #if defined(HAVE_RPCSVC_YPCLNT_H)
329 #include <rpcsvc/ypclnt.h>
330 #endif
331 #endif /* HAVE_NETGROUP */
332
333 #ifndef uchar
334 #define uchar unsigned char
335 #endif
336
337 #ifdef HAVE_UNSIGNED_CHAR
338 #define schar signed char
339 #else
340 #define schar char
341 #endif
342
343 /*
344    Samba needs type definitions for int16, int32, uint16 and uint32.
345
346    Normally these are signed and unsigned 16 and 32 bit integers, but
347    they actually only need to be at least 16 and 32 bits
348    respectively. Thus if your word size is 8 bytes just defining them
349    as signed and unsigned int will work.
350 */
351
352 #ifndef uint8
353 #define uint8 unsigned char
354 #endif
355
356 #if !defined(int16) && !defined(HAVE_INT16_FROM_RPC_RPC_H)
357 #if (SIZEOF_SHORT == 4)
358 #define int16 __ERROR___CANNOT_DETERMINE_TYPE_FOR_INT16;
359 #else /* SIZEOF_SHORT != 4 */
360 #define int16 short
361 #endif /* SIZEOF_SHORT != 4 */
362 #endif
363
364 /*
365  * Note we duplicate the size tests in the unsigned 
366  * case as int16 may be a typedef from rpc/rpc.h
367  */
368
369 #if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H)
370 #if (SIZEOF_SHORT == 4)
371 #define uint16 __ERROR___CANNOT_DETERMINE_TYPE_FOR_INT16;
372 #else /* SIZEOF_SHORT != 4 */
373 #define uint16 unsigned short
374 #endif /* SIZEOF_SHORT != 4 */
375 #endif
376
377 #if !defined(int32) && !defined(HAVE_INT32_FROM_RPC_RPC_H)
378 #if (SIZEOF_INT == 4)
379 #define int32 int
380 #elif (SIZEOF_LONG == 4)
381 #define int32 long
382 #elif (SIZEOF_SHORT == 4)
383 #define int32 short
384 #endif
385 #endif
386
387 /*
388  * Note we duplicate the size tests in the unsigned 
389  * case as int32 may be a typedef from rpc/rpc.h
390  */
391
392 #if !defined(uint32) && !defined(HAVE_UINT32_FROM_RPC_RPC_H)
393 #if (SIZEOF_INT == 4)
394 #define uint32 unsigned int
395 #elif (SIZEOF_LONG == 4)
396 #define uint32 unsigned long
397 #elif (SIZEOF_SHORT == 4)
398 #define uint32 unsigned short
399 #endif
400 #endif
401
402 /*
403  * Types for devices, inodes and offsets.
404  */
405
406 #ifndef SMB_DEV_T
407 #define SMB_DEV_T dev_t
408 #endif
409
410 /*
411  * Setup the correctly sized inode type.
412  */
413
414 #ifndef SMB_INO_T
415 #  ifdef HAVE_INO64_T
416 #    define SMB_INO_T ino64_t
417 #  else
418 #    define SMB_INO_T ino_t
419 #  endif
420 #endif
421
422 #ifndef LARGE_SMB_INO_T
423 #  if defined(HAVE_INO64_T) || (defined(SIZEOF_INO_T) && (SIZEOF_INO_T == 8))
424 #    define LARGE_SMB_INO_T 1
425 #  endif
426 #endif
427
428 #ifdef LARGE_SMB_INO_T
429 #define SINO_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32))
430 #else 
431 #define SINO_T(p, ofs, v) (SIVAL(p,ofs,v),SIVAL(p,(ofs)+4,0))
432 #endif
433
434 #ifndef SMB_OFF_T
435 #  ifdef HAVE_OFF64_T
436 #    define SMB_OFF_T off64_t
437 #  else
438 #    define SMB_OFF_T off_t
439 #  endif
440 #endif
441
442 #define SMB_OFF_T_BITS (sizeof(SMB_OFF_T)*8)
443
444 /*
445  * Set the define that tells us if we can do 64 bit
446  * NT SMB calls.
447  */
448
449 #ifndef LARGE_SMB_OFF_T
450 #  if defined(HAVE_OFF64_T) || (defined(SIZEOF_OFF_T) && (SIZEOF_OFF_T == 8))
451 #    define LARGE_SMB_OFF_T 1
452 #  endif
453 #endif
454
455 #ifdef LARGE_SMB_OFF_T
456 #define SOFF_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32))
457 #else 
458 #define SOFF_T(p, ofs, v) (SIVAL(p,ofs,v),SIVAL(p,(ofs)+4,0))
459 #endif
460
461 /*
462  * Type for stat structure.
463  */
464
465 #ifndef SMB_STRUCT_STAT
466 #  if defined(HAVE_STAT64) && defined(HAVE_OFF64_T)
467 #    define SMB_STRUCT_STAT struct stat64
468 #  else
469 #    define SMB_STRUCT_STAT struct stat
470 #  endif
471 #endif
472
473 /*
474  * Defines for 64 bit fcntl locks.
475  */
476
477 #ifndef SMB_STRUCT_FLOCK
478 #  if defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T)
479 #    define SMB_STRUCT_FLOCK struct flock64
480 #  else
481 #    define SMB_STRUCT_FLOCK struct flock
482 #  endif
483 #endif
484
485 #ifndef SMB_F_SETLKW
486 #  if defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T)
487 #    define SMB_F_SETLKW F_SETLKW64
488 #  else
489 #    define SMB_F_SETLKW F_SETLKW
490 #  endif
491 #endif
492
493 #ifndef SMB_F_SETLK
494 #  if defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T)
495 #    define SMB_F_SETLK F_SETLK64
496 #  else
497 #    define SMB_F_SETLK F_SETLK
498 #  endif
499 #endif
500
501 #ifndef SMB_F_GETLK
502 #  if defined(HAVE_STRUCT_FLOCK64) && defined(HAVE_OFF64_T)
503 #    define SMB_F_GETLK F_GETLK64
504 #  else
505 #    define SMB_F_GETLK F_GETLK
506 #  endif
507 #endif
508
509 #if defined(HAVE_LONGLONG)
510 #define SMB_BIG_UINT unsigned long long
511 #define SMB_BIG_INT long long
512 #else
513 #define SMB_BIG_UINT unsigned long
514 #define SMB_BIG_INT long
515 #endif
516
517 #ifndef MIN
518 #define MIN(a,b) ((a)<(b)?(a):(b))
519 #endif
520
521 #ifndef MAX
522 #define MAX(a,b) ((a)>(b)?(a):(b))
523 #endif
524
525 #ifndef HAVE_STRERROR
526 extern char *sys_errlist[];
527 #define strerror(i) sys_errlist[i]
528 #endif
529
530 #ifndef HAVE_STRCHR
531 # define strchr                 index
532 # define strrchr                rindex
533 #endif
534
535 #ifndef HAVE_ERRNO_DECL
536 extern int errno;
537 #endif
538
539 #ifdef HAVE_BROKEN_GETGROUPS
540 #define GID_T int
541 #else
542 #define GID_T gid_t
543 #endif
544
545
546 /* Lists, trees, caching, datbase... */
547 #include "ubi_sLinkList.h"
548 #include "ubi_dLinkList.h"
549 #include "dlinklist.h"
550
551 #ifndef UBI_BINTREE_H
552 #include "ubi_Cache.h"
553 #endif /* UBI_BINTREE_H */
554
555 #include "debugparse.h"
556
557 #include "version.h"
558 #include "smb.h"
559 #include "smbw.h"
560 #include "nameserv.h"
561
562 #include "byteorder.h"
563
564 #include "kanji.h"
565 #include "charset.h"
566
567 #include "nterr.h"
568
569 #ifndef MAXCODEPAGELINES
570 #define MAXCODEPAGELINES 256
571 #endif
572
573 /***** automatically generated prototypes *****/
574 #include "proto.h"
575
576 #ifdef strcpy
577 #undef strcpy
578 #endif /* strcpy */
579 #define strcpy(dest,src) __ERROR__XX__NEVER_USE_STRCPY___;
580
581 #ifdef strcat
582 #undef strcat
583 #endif /* strcat */
584 #define strcat(dest,src) __ERROR__XX__NEVER_USE_STRCAT___;
585
586 #ifdef sprintf
587 #undef sprintf
588 #endif /* sprintf */
589 #define sprintf __ERROR__XX__NEVER_USE_SPRINTF__;
590
591 #define pstrcpy(d,s) safe_strcpy((d),(s),sizeof(pstring)-1)
592 #define pstrcat(d,s) safe_strcat((d),(s),sizeof(pstring)-1)
593 #define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1)
594 #define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1)
595
596 #ifdef __COMPAR_FN_T
597 #define QSORT_CAST (__compar_fn_t)
598 #endif
599
600 #ifndef QSORT_CAST
601 #define QSORT_CAST (int (*)(const void *, const void *))
602 #endif
603
604 /* this guess needs to be improved (tridge) */
605 #if defined(STAT_STATVFS) && !defined(SYSV)
606 #define SYSV 1
607 #endif
608
609 #ifndef DEFAULT_PRINTING
610 #ifdef SYSV
611 #define DEFAULT_PRINTING PRINT_SYSV
612 #define PRINTCAP_NAME "lpstat"
613 #else
614 #define DEFAULT_PRINTING PRINT_BSD
615 #define PRINTCAP_NAME "/etc/printcap"
616 #endif
617 #endif
618
619 #ifndef PRINTCAP_NAME
620 #define PRINTCAP_NAME "/etc/printcap"
621 #endif
622
623 #ifndef SIGCLD
624 #define SIGCLD SIGCHLD
625 #endif
626
627 #if (defined(HAVE_SYSV_IPC) || defined(HAVE_SHARED_MMAP))
628 #define FAST_SHARE_MODES 1
629 #endif
630
631 #ifndef MAP_FILE
632 #define MAP_FILE 0
633 #endif
634
635 #ifdef HAVE_SYSV_IPC
636 #ifndef HAVE_UNION_SEMUN
637 union semun {
638         int val;
639         struct semid_ds *buf;
640         unsigned short *array;
641 };
642 #endif
643 #endif
644
645 #if (!defined(WITH_NISPLUS) && !defined(WITH_LDAP))
646 #define USE_SMBPASS_DB 1
647 #define USE_SMBUNIX_DB 1
648 #endif
649
650 #if defined(HAVE_PUTPRPWNAM) && defined(AUTH_CLEARTEXT_SEG_CHARS)
651 #define OSF1_ENH_SEC 1
652 #endif
653
654 #if defined(HAVE_PAM_AUTHENTICATE) && defined(HAVE_SECURITY_PAM_APPL_H)
655 #define HAVE_PAM 1
656 #endif
657
658 #ifndef ALLOW_CHANGE_PASSWORD
659 #if (defined(HAVE_TERMIOS_H) && defined(HAVE_DUP2) && defined(HAVE_SETSID))
660 #define ALLOW_CHANGE_PASSWORD 1
661 #endif
662 #endif
663
664 /* what is the longest significant password available on your system? 
665  Knowing this speeds up password searches a lot */
666 #ifndef PASSWORD_LENGTH
667 #define PASSWORD_LENGTH 8
668 #endif
669
670 #ifdef REPLACE_INET_NTOA
671 #define inet_ntoa rep_inet_ntoa
672 #endif
673
674 #ifndef HAVE_PIPE
675 #define SYNC_DNS 1
676 #endif
677
678 #ifndef MAXPATHLEN
679 #define MAXPATHLEN 256
680 #endif
681
682 #ifndef SEEK_SET
683 #define SEEK_SET 0
684 #endif
685
686 #ifndef INADDR_LOOPBACK
687 #define INADDR_LOOPBACK 0x7f000001
688 #endif
689
690 #ifndef INADDR_NONE
691 #define INADDR_NONE 0xffffffff
692 #endif
693
694 #ifndef HAVE_CRYPT
695 #define crypt ufc_crypt
696 #endif
697
698 #ifndef O_ACCMODE
699 #define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
700 #endif
701
702 #if defined(HAVE_CRYPT16) && defined(HAVE_GETAUTHUID)
703 #define ULTRIX_AUTH 1
704 #endif
705
706 #ifdef HAVE_LIBREADLINE
707 #  ifdef HAVE_READLINE_READLINE_H
708 #    include <readline/readline.h>
709 #    ifdef HAVE_READLINE_HISTORY_H
710 #      include <readline/history.h>
711 #    endif
712 #  else
713 #    ifdef HAVE_READLINE_H
714 #      include <readline.h>
715 #      ifdef HAVE_HISTORY_H
716 #        include <history.h>
717 #      endif
718 #    else
719 #      undef HAVE_LIBREADLINE
720 #    endif
721 #  endif
722 #endif
723
724 #ifndef HAVE_STRDUP
725 char *strdup(const char *s);
726 #endif
727
728 #ifndef HAVE_MEMMOVE
729 void *memmove(void *dest,const void *src,int size);
730 #endif
731
732 #ifndef HAVE_INITGROUPS
733 int initgroups(char *name,gid_t id);
734 #endif
735
736 #ifndef HAVE_RENAME
737 int rename(const char *zfrom, const char *zto);
738 #endif
739
740 #ifndef HAVE_MKTIME
741 time_t mktime(struct tm *t);
742 #endif
743
744 #ifndef HAVE_FTRUNCATE
745 int ftruncate(int f,long l);
746 #endif
747
748 #if (defined(HAVE_SETRESUID) && !defined(HAVE_SETRESUID_DECL))
749 /* stupid glibc */
750 int setresuid(uid_t ruid, uid_t euid, uid_t suid);
751 int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
752 #endif
753
754 #if (defined(HAVE_CRYPT) && !defined(HAVE_CRYPT_DECL) && !defined(KRB4_AUTH))
755 /* stupid glibc */
756 int crypt(const char *key, const char *salt);
757 #endif
758
759 #if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
760 #define bzero(a,b) memset((a),'\0',(b))
761 #endif
762
763 #ifdef REPLACE_GETPASS
764 #define getpass(prompt) getsmbpass((prompt))
765 #endif
766
767 /* yuck, I'd like a better way of doing this */
768 #define DIRP_SIZE (256 + 32)
769
770 #endif /* _INCLUDES_H */