- added a check for broken RH5 include files. With the standard RH5
[kai/samba.git] / source3 / locking / shmem_sysv.c
index 826de5694cbf1cc0aad729b8e893b46eddd7a14d..b9d45949479ccd4f8de768adc1bf117042948020 100644 (file)
@@ -2,7 +2,7 @@
    Unix SMB/Netbios implementation.
    Version 1.9.
    Shared memory functions - SYSV IPC implementation
    Unix SMB/Netbios implementation.
    Version 1.9.
    Shared memory functions - SYSV IPC implementation
-   Copyright (C) Andrew Tridgell 1997
+   Copyright (C) Andrew Tridgell 1997-1998
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -39,6 +39,7 @@ extern int DEBUGLEVEL;
 #define IPC_PERMS 0644
 #endif
 
 #define IPC_PERMS 0644
 #endif
 
+
 #ifdef SECURE_SEMAPHORES
 /* secure semaphores are slow because we have to do a become_root()
    on every call! */
 #ifdef SECURE_SEMAPHORES
 /* secure semaphores are slow because we have to do a become_root()
    on every call! */
@@ -541,6 +542,15 @@ struct shmem_ops *sysv_shm_open(int ronly)
        int i;
        int pid;
 
        int i;
        int pid;
 
+
+
+#ifdef LINUX
+       if (sizeof(shm_ds) == 52) {
+               DEBUG(0,("WARNING: You probably have a broken set of glibc2 include files - disabling sysv shared memory\n"));
+               return NULL;
+       }
+#endif
+
        read_only = ronly;
 
        shm_size = lp_shmem_size();
        read_only = ronly;
 
        shm_size = lp_shmem_size();
@@ -557,8 +567,9 @@ struct shmem_ops *sysv_shm_open(int ronly)
                while (hash_size > 1) {
                        sem_id = semget(SEMAPHORE_KEY, hash_size+1, 
                                        IPC_CREAT|IPC_EXCL| SEMAPHORE_PERMS);
                while (hash_size > 1) {
                        sem_id = semget(SEMAPHORE_KEY, hash_size+1, 
                                        IPC_CREAT|IPC_EXCL| SEMAPHORE_PERMS);
-                       if (sem_id != -1 || errno != EINVAL) break;
-                       hash_size--;
+                       if (sem_id != -1 || 
+                           (errno != EINVAL && errno != ENOSPC)) break;
+                       hash_size -= 5;
                }
 
                if (sem_id == -1) {
                }
 
                if (sem_id == -1) {
@@ -639,8 +650,9 @@ struct shmem_ops *sysv_shm_open(int ronly)
                while (shm_size > MIN_SHM_SIZE) {
                        shm_id = shmget(SHMEM_KEY, shm_size, 
                                        IPC_CREAT | IPC_EXCL | IPC_PERMS);
                while (shm_size > MIN_SHM_SIZE) {
                        shm_id = shmget(SHMEM_KEY, shm_size, 
                                        IPC_CREAT | IPC_EXCL | IPC_PERMS);
-                       if (shm_id != -1 || errno != EINVAL) break;
-                       shm_size *= 0.9;
+                       if (shm_id != -1 || 
+                           (errno != EINVAL && errno != ENOSPC)) break;
+                       shm_size *= 0.8;
                }
                created_new = (shm_id != -1);
        }
                }
                created_new = (shm_id != -1);
        }