This is the mail archive of the
libc-hacker@sourceware.cygnus.com
mailing list for the glibc project.
bugs...
- To: libc-hacker@cygnus.com
- Subject: bugs...
- From: Zack Weinberg <zack@rabi.phys.columbia.edu>
- Date: Thu, 02 Jul 1998 13:52:55 -0400
The script I just posted has a silly bug, insert a space after the
-u in "cvs diff -u" (inside the string).
The patch for SCM_CREDS also has some silly bugs. A corrected version
is appended.
Finally, the Makefile patches I posted weeks ago have a number of
bugs; I will produce revised versions soon. (These are the Makeconfig
and `make dist' changes.)
zw
1998-07-02 13:45 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
BSD-style SCM_CREDS support.
* sysdeps/unix/sysv/linux/socket.h: Define struct cmsgcred and
SCM_CREDS.
* sysdeps/unix/sysv/linux/sendmsg.c: New file. Convert user
visible SCM_CREDS packet to what the kernel wants.
* sysdeps/unix/sysv/linux/recvmsg.c: New file. Convert
SCM_CREDS packet output by kernel to what users want.
* sysdeps/unix/sysv/linux/sendmsg.S: Moved to...
* sysdeps/unix/sysv/linux/__sendmsg.S: here.
* sysdeps/unix/sysv/linux/recvmsg.S: Moved to...
* sysdeps/unix/sysv/linux/__recvmsg.S: here.
* sysdeps/unix/sysv/linux/Makefile [subdir=socket]: Add
__sendmsg and __recvmsg to sysdep_routines.
* sysdeps/unix/sysv/linux/Dist: Add __sendmsg.S and __recvmsg.S.
============================================================
Index: sysdeps/unix/sysv/linux/Makefile
--- sysdeps/unix/sysv/linux/Makefile 1998/06/30 12:18:07 1.79
+++ sysdeps/unix/sysv/linux/Makefile 1998/07/02 17:39:31
@@ -58,7 +58,7 @@
sysdep_headers += net/if.h net/if_ppp.h net/ppp-comp.h \
net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
net/if_slip.h net/if_packet.h
-sysdep_routines += cmsg_nxthdr sa_len
+sysdep_routines += cmsg_nxthdr sa_len __sendmsg __recvmsg
endif
ifeq ($(subdir),sunrpc)
============================================================
Index: sysdeps/unix/sysv/linux/bits/socket.h
--- sysdeps/unix/sysv/linux/bits/socket.h 1998/05/15 09:06:14 1.17
+++ sysdeps/unix/sysv/linux/bits/socket.h 1998/07/02 17:39:31
@@ -222,12 +222,31 @@
<linux/socket.h>. */
enum
{
- SCM_RIGHTS = 0x01, /* Data array contains access rights. */
+ SCM_RIGHTS = 0x01, /* Transfer file descriptors. */
#define SCM_RIGHTS SCM_RIGHTS
- __SCM_CREDENTIALS = 0x02, /* Data array is `struct ucred'. */
- __SCM_CONNECT = 0x03 /* Data array is `struct scm_connect'. */
+ SCM_CREDS = 0x02, /* bsd-compatible credentials passing */
+#define SCM_CREDS SCM_CREDS
+ __SCM_CONNECT = 0x03, /* Data array is `struct scm_connect'. */
+
};
+#ifdef __USE_BSD /* ??? */
+
+/* User visible structure for SCM_CREDS message
+ (chosen for BSD source compatibility) */
+
+#define CMGROUP_MAX 16 /* Linux does not provide this info, so it doesn't
+ matter... use what bsd does. */
+struct cmsgcred
+{
+ pid_t cmcred_pid; /* PID of sending process */
+ uid_t cmcred_uid; /* real UID of sending process */
+ uid_t cmcred_euid; /* effective UID of sending process */
+ gid_t cmcred_gid; /* real GID of sending process */
+ short cmcred_ngroups; /* number or groups */
+ gid_t cmcred_groups[CMGROUP_MAX]; /* groups */
+};
+#endif
/* Get socket manipulation related informations from kernel headers. */
#include <asm/socket.h>
============================================================
Index: sysdeps/unix/sysv/linux/recvmsg.c
--- sysdeps/unix/sysv/linux/recvmsg.c created
+++ sysdeps/unix/sysv/linux/recvmsg.c Wed Jul 1 08:50:27 1998 1.1
@@ -0,0 +1,91 @@
+/* Copyright (C) 1998 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <sys/socket.h>
+#include <errno.h>
+#include <string.h>
+
+#include <asm/posix_types.h>
+
+/* The kernel expects this structure in SCM_CREDS messages.
+ * Note: sizeof(struct __kernel_ucred) <= sizeof(struct cmsgcred) must hold.
+ */
+struct __kernel_ucred
+{
+ __kernel_pid_t pid;
+ __kernel_uid_t uid;
+ __kernel_gid_t gid;
+};
+
+extern int __recvmsg (int, struct msghdr *, int);
+
+int
+recvmsg (fd, message, flags)
+ int fd;
+ struct msghdr *message;
+ int flags;
+{
+ struct cmsghdr *cm;
+ int ret;
+
+
+ /* Must check for space first. */
+ cm = CMSG_FIRSTHDR (message);
+ while (cm)
+ {
+ if (cm->cmsg_type == SCM_CREDS)
+ {
+ if (cm->cmsg_len < CMSG_SPACE (sizeof (struct cmsgcred)))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+ }
+ cm = CMSG_NXTHDR (message, cm);
+ }
+
+
+ ret = __recvmsg (fd, message, flags);
+
+ if (ret == -1)
+ return ret;
+
+ /* Postprocess the message control block for SCM_CREDS. */
+ cm = CMSG_FIRSTHDR (message);
+ while (cm)
+ {
+ if (cm->cmsg_type == SCM_CREDS)
+ {
+ struct cmsgcred *c = (struct cmsgcred *) CMSG_DATA (cm);
+ struct __kernel_ucred u;
+ int i;
+ memcpy (&u, CMSG_DATA (cm), sizeof (struct __kernel_ucred));
+
+ c->cmcred_pid = u.pid;
+ c->cmcred_uid = u.uid;
+ c->cmcred_gid = u.gid;
+
+ c->cmcred_euid = -1;
+ c->cmcred_ngroups = 0;
+ for (i = 0; i < CMGROUP_MAX; i++)
+ c->cmcred_groups[i] = -1;
+ }
+ cm = CMSG_NXTHDR (message, cm);
+ }
+ return ret;
+}
============================================================
Index: sysdeps/unix/sysv/linux/__recvmsg.S
--- sysdeps/unix/sysv/linux/__recvmsg.S created
+++ sysdeps/unix/sysv/linux/__recvmsg.S Thu Jul 2 13:25:41 1998 1.1
@@ -0,0 +1,5 @@
+#define socket __recvmsg
+#define __socket __libc_recvmsg
+#define SOCKOP___recvmsg SOCKOP_recvmsg
+#define NARGS 3
+#include <socket.S>
============================================================
Index: sysdeps/unix/sysv/linux/sendmsg.c
--- sysdeps/unix/sysv/linux/sendmsg.c created
+++ sysdeps/unix/sysv/linux/sendmsg.c Wed Jul 1 09:00:08 1998 1.1
@@ -0,0 +1,91 @@
+/* Copyright (C) 1998 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <sys/socket.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <asm/posix_types.h>
+
+/* The kernel expects this structure in SCM_CREDS messages.
+ * Note: sizeof(struct __kernel_ucred) <= sizeof(struct cmsgcred) must hold.
+ */
+struct __kernel_ucred
+{
+ __kernel_pid_t pid;
+ __kernel_uid_t uid;
+ __kernel_gid_t gid;
+};
+
+extern int __sendmsg (int, const struct msghdr *, int);
+
+/* Send a message described by MESSAGE on socket FD.
+ Returns the number of bytes sent, or -1 for errors. */
+int
+sendmsg (fd, message, flags)
+ int fd;
+ const struct msghdr *message;
+ int flags;
+{
+ struct cmsghdr *cm;
+ struct cmsgcred *cc;
+ struct __kernel_ucred *u;
+ pid_t pid;
+
+ /* Preprocess the message control block for SCM_CREDS. */
+ cm = CMSG_FIRSTHDR (message);
+ while (cm)
+ {
+ if (cm->cmsg_type == SCM_CREDS)
+ {
+ if (cm->cmsg_len < CMSG_SPACE (sizeof (struct cmsgcred)))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ u = (struct __kernel_ucred *) CMSG_DATA (cm);
+ cc = (struct cmsgcred *) CMSG_DATA(cm);
+ /* Linux expects the calling process to pass in
+ its credentials, and sanity checks them.
+ You can send real, effective, or set- uid and gid.
+ If the user hasn't filled in the buffer, we default to
+ real uid and gid. */
+ pid = getpid ();
+ if (cc->cmcred_pid != pid)
+ {
+ u->pid = pid;
+ u->uid = getuid ();
+ u->gid = getgid ();
+ }
+ else
+ {
+ struct __kernel_ucred v;
+ v.pid = cc->cmcred_pid;
+ v.uid = cc->cmcred_uid;
+ v.gid = cc->cmcred_gid;
+ u->pid = v.pid;
+ u->uid = v.uid;
+ u->gid = v.gid;
+ }
+ }
+ cm = CMSG_NXTHDR ((struct msghdr *)message, cm);
+ }
+
+ return __sendmsg (fd, message, flags);
+}
============================================================
Index: sysdeps/unix/sysv/linux/__sendmsg.S
--- sysdeps/unix/sysv/linux/__sendmsg.S created
+++ sysdeps/unix/sysv/linux/__sendmsg.S Thu Jul 2 13:25:21 1998 1.1
@@ -0,0 +1,6 @@
+#define socket __sendmsg
+#define __socket __libc_sendmsg
+#define SOCKOP___sendmsg SOCKOP_sendmsg
+#define NARGS 3
+#include <socket.S>
+
============================================================
Index: sysdeps/unix/sysv/linux/sendmsg.S
--- sysdeps/unix/sysv/linux/sendmsg.S Tue Jun 30 22:12:54 1998 1.4
+++ sysdeps/unix/sysv/linux/sendmsg.S removed
@@ -1,5 +0,0 @@
-#define socket sendmsg
-#define __socket __libc_sendmsg
-#define NARGS 3
-#include <socket.S>
-weak_alias (__libc_sendmsg, __sendmsg)
============================================================
Index: sysdeps/unix/sysv/linux/recvmsg.S
--- sysdeps/unix/sysv/linux/recvmsg.S Tue Jun 30 22:12:54 1998 1.4
+++ sysdeps/unix/sysv/linux/recvmsg.S removed
@@ -1,5 +0,0 @@
-#define socket recvmsg
-#define __socket __libc_recvmsg
-#define NARGS 3
-#include <socket.S>
-weak_alias (__libc_recvmsg, __recvmsg)
============================================================
Index: sysdeps/unix/sysv/linux/Dist
--- sysdeps/unix/sysv/linux/Dist 1998/05/08 15:01:39 1.50
+++ sysdeps/unix/sysv/linux/Dist 1998/07/02 17:45:34
@@ -74,3 +74,5 @@
sys/vt.h
xstatconv.c
getdents64.c
+__sendmsg.S
+__recvmsg.S