summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/libsm/sem.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/libsm/sem.c')
-rw-r--r--contrib/sendmail/libsm/sem.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/contrib/sendmail/libsm/sem.c b/contrib/sendmail/libsm/sem.c
index 89394cb..83a54e3 100644
--- a/contrib/sendmail/libsm/sem.c
+++ b/contrib/sendmail/libsm/sem.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000-2001, 2005 Sendmail, Inc. and its suppliers.
+ * Copyright (c) 2000-2001, 2005, 2008 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@@ -8,11 +8,12 @@
*/
#include <sm/gen.h>
-SM_RCSID("@(#)$Id: sem.c,v 1.13 2005/08/12 20:39:59 ca Exp $")
+SM_RCSID("@(#)$Id: sem.c,v 1.14 2008/05/30 16:26:38 ca Exp $")
#if SM_CONF_SEM
# include <stdlib.h>
# include <unistd.h>
+# include <sm/string.h>
# include <sm/sem.h>
# include <sm/heap.h>
# include <errno.h>
@@ -200,4 +201,45 @@ sm_sem_get(semid, semnum)
return -1;
return semval;
}
+
+/*
+** SM_SEMSETOWNER -- set owner/group/mode of semaphores.
+**
+** Parameters:
+** semid -- id for semaphores.
+** uid -- uid to use
+** gid -- gid to use
+** mode -- mode to use
+**
+** Returns:
+** 0 on success.
+** < 0 on failure.
+*/
+
+int
+sm_semsetowner(semid, uid, gid, mode)
+ int semid;
+ uid_t uid;
+ gid_t gid;
+ mode_t mode;
+{
+ int r;
+ struct semid_ds semidds;
+ union semun {
+ int val;
+ struct semid_ds *buf;
+ ushort *array;
+ } arg;
+
+ memset(&semidds, 0, sizeof(semidds));
+ arg.buf = &semidds;
+ if ((r = semctl(semid, 1, IPC_STAT, arg)) < 0)
+ return r;
+ semidds.sem_perm.uid = uid;
+ semidds.sem_perm.gid = gid;
+ semidds.sem_perm.mode = mode;
+ if ((r = semctl(semid, 1, IPC_SET, arg)) < 0)
+ return r;
+ return 0;
+}
#endif /* SM_CONF_SEM */
OpenPOWER on IntegriCloud