X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..935ed37a5c468c8a1c07408573c08b8b7ef80e8b:/bsd/man/man2/shmctl.2 diff --git a/bsd/man/man2/shmctl.2 b/bsd/man/man2/shmctl.2 index 036db38b3..0af2016ed 100644 --- a/bsd/man/man2/shmctl.2 +++ b/bsd/man/man2/shmctl.2 @@ -37,39 +37,40 @@ .Nm shmctl .Nd shared memory control operations .Sh SYNOPSIS -.Fd #include -.Fd #include -.Fd #include +.Fd #include .Ft int -.Fn shmctl "int shmid" "int cmd" "struct shmid_ds *buf" +.Fo shmctl +.Fa "int shmid" +.Fa "int cmd" +.Fa "struct shmid_ds *buf" +.Fc .Sh DESCRIPTION The .Fn shmctl system call performs some control operations on the shared memory area specified by .Fa shmid . - Each shared memory segment has a data structure associated with it, parts of which may be altered by .Fn shmctl and parts of which determine the actions of .Fn shmctl . - This structure is defined as follows in .Aq Pa sys/shm.h : .Bd -literal struct shmid_ds { - struct ipc_perm shm_perm; /* operation permissions */ - int shm_segsz; /* size of segment in bytes */ - pid_t shm_lpid; /* pid of last shm op */ - pid_t shm_cpid; /* pid of creator */ - short shm_nattch; /* # of current attaches */ - time_t shm_atime; /* last shmat() time*/ - time_t shm_dtime; /* last shmdt() time */ - time_t shm_ctime; /* last change by shmctl() */ - void *shm_internal; /* sysv stupidity */ + struct ipc_perm shm_perm; /* operation permissions */ + int shm_segsz; /* size of segment in bytes */ + pid_t shm_lpid; /* pid of last shm op */ + pid_t shm_cpid; /* pid of creator */ + short shm_nattch; /* # of current attaches */ + time_t shm_atime; /* last shmat() time*/ + time_t shm_dtime; /* last shmdt() time */ + time_t shm_ctime; /* last change by shmctl() */ + void *shm_internal; /* sysv stupidity */ }; .Ed +.Pp The .Bf -literal ipc_perm @@ -83,16 +84,16 @@ structure is defined in and looks like this: .Bd -literal struct ipc_perm { - ushort cuid; /* creator user id */ - ushort cgid; /* creator group id */ - ushort uid; /* user id */ - ushort gid; /* group id */ - ushort mode; /* r/w permission (see chmod(2)) */ - ushort seq; /* sequence # (to generate unique msg/sem/shm id) */ - key_t key; /* user specified msg/sem/shm key */ + uid_t uid; /* Owner's user ID */ + gid_t gid; /* Owner's group ID */ + uid_t cuid; /* Creator's user ID */ + gid_t cgid; /* Creator's group ID */ + mode_t mode; /* r/w permission (see chmod(2)) */ + unsigned short _seq; /* Reserved for internal use */ + key_t _key; /* Reserved for internal use */ }; .Ed - +.Pp The operation to be performed by .Fn shmctl is specified in @@ -120,7 +121,6 @@ has an effective user id equal to either or .Va shm_perm.uid in the data structure associated with the shared memory segment. - .It Dv IPC_RMID Remove the shared memory segment specified by .Fa shmid @@ -131,7 +131,7 @@ or .Va shm_perm.uid values in the data structure associated with the queue can do this. .El - +.Pp The read and write permissions on a shared memory identifier are determined by the .Va shm_perm.mode @@ -148,41 +148,83 @@ effective gid can match either or .Va shm_perm.gid . .Sh RETURN VALUES -Upon successful completion, a value of 0 is returned. Otherwise, -1 is -returned and the global variable +Upon successful completion, a value of 0 is returned. +Otherwise, -1 is returned and the global variable .Va errno is set to indicate the error. .Sh ERRORS .Fn shmctl will fail if: .Bl -tag -width Er +.\" =========== +.It Bq Er EACCES +The command is IPC_STAT +and the caller has no read permission for this shared memory segment. +.\" =========== +.It Bq Er EFAULT +.Fa buf +specifies an invalid address. +.\" =========== +.It Bq Er EINVAL +.Fa shmid +is not a valid shared memory segment identifier. +.Va cmd +is not a valid command. +.\" =========== .It Bq Er EPERM .Fa cmd -is equal to IPC_SET or IPC_RMID and the caller is not the super-user, nor does -the effective uid match either the +is equal to IPC_SET or IPC_RMID and the caller is not the super-user,\ +nor does the effective uid match either the .Va shm_perm.uid or .Va shm_perm.cuid fields of the data structure associated with the shared memory segment. - An attempt is made to increase the value of .Va shm_qbytes through IPC_SET but the caller is not the super-user. -.It Bq Er EACCESS -The command is IPC_STAT -and the caller has no read permission for this shared memory segment. -.It Bq Er EINVAL -.Fa shmid -is not a valid shared memory segment identifier. - -.Va cmd -is not a valid command. -.It Bq Er EFAULT -.Fa buf -specifies an invalid address. .El +.Sh LEGACY SYNOPSIS +.Fd #include +.Fd #include +.Fd #include +.Pp +All of these include files are necessary. +.Sh LEGACY DESCRIPTION +The +.Bf -literal +ipc_perm +.Ef +structure used inside the +.Bf -literal +shmid_ds +.Ef +structure, as defined in +.Aq Pa sys/ipc.h , +looks like this: +.Bd -literal +struct ipc_perm { + __uint16_t cuid; /* Creator's user id */ + __uint16_t cgid; /* Creator's group id */ + __uint16_t uid; /* Owner's user id */ + __uint16_t gid; /* Owner's group id */ + mode_t mode; /* r/w permission (see chmod(2)) */ + __uint16_t seq; /* Reserved for internal use */ + key_t key; /* Reserved for internal use */ +}; +.Ed +.Pp +This structure is maintained for binary backward compatibility +with previous versions of the interface. +New code should not use this interface, +because ID values may be truncated. +.Pp +Specifically, +LEGACY mode limits the allowable uid/gid ranges to 0-32767. +If the user has a UID that is out of this range (e.g., "nobody"), +software using the LEGACY API will not behave as expected. .Sh SEE ALSO .Xr shmat 2 , .Xr shmdt 2 , -.Xr shmget 2 +.Xr shmget 2 , +.Xr compat 5