[telepathy-salut/master] add gibber_unix_transport_send_credentials
Guillaume Desmottes
guillaume.desmottes at collabora.co.uk
Fri May 8 07:55:38 PDT 2009
---
lib/gibber/gibber-unix-transport.c | 50 ++++++++++++++++++++++++++++++++++++
lib/gibber/gibber-unix-transport.h | 3 ++
2 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/lib/gibber/gibber-unix-transport.c b/lib/gibber/gibber-unix-transport.c
index 529813d..c877060 100644
--- a/lib/gibber/gibber-unix-transport.c
+++ b/lib/gibber/gibber-unix-transport.c
@@ -19,6 +19,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+/* needed for struct ucred */
+#define _GNU_SOURCE
+
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -173,3 +176,50 @@ gibber_unix_transport_new_from_fd (int fd)
gibber_fd_transport_set_fd (GIBBER_FD_TRANSPORT (transport), fd);
return transport;
}
+
+gboolean
+gibber_unix_transport_send_credentials (GibberUnixTransport *transport,
+ const guint8 *data,
+ gsize size)
+{
+ int fd, ret;
+ struct ucred *cred;
+ struct msghdr msg;
+ struct cmsghdr *ch;
+ struct iovec iov;
+ char buffer[CMSG_SPACE (sizeof (struct ucred))];
+
+ DEBUG ("send credentials");
+ fd = GIBBER_FD_TRANSPORT (transport)->fd;
+
+ /* Set the message payload */
+ memset (&iov, 0, sizeof (iov));
+ iov.iov_base = (void *) data;
+ iov.iov_len = size;
+
+ memset (&msg, 0, sizeof msg);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = buffer;
+ msg.msg_controllen = sizeof (buffer);
+
+ /* Set the credentials */
+ ch = CMSG_FIRSTHDR (&msg);
+ ch->cmsg_len = CMSG_LEN (sizeof (struct ucred));
+ ch->cmsg_level = SOL_SOCKET;
+ ch->cmsg_type = SCM_CREDENTIALS;
+
+ cred = (struct ucred *) CMSG_DATA (ch);
+ cred->pid = getpid ();
+ cred->uid = getuid ();
+ cred->gid = getgid ();
+
+ ret = sendmsg (fd, &msg, 0);
+ if (ret == -1)
+ {
+ DEBUG ("sendmsg failed: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/lib/gibber/gibber-unix-transport.h b/lib/gibber/gibber-unix-transport.h
index c922170..8e7003b 100644
--- a/lib/gibber/gibber-unix-transport.h
+++ b/lib/gibber/gibber-unix-transport.h
@@ -75,6 +75,9 @@ GibberUnixTransport * gibber_unix_transport_new_from_fd (int fd);
gboolean gibber_unix_transport_connect (GibberUnixTransport *transport,
const gchar *path, GError **error);
+gboolean gibber_unix_transport_send_credentials (GibberUnixTransport *transport,
+ const guint8 *data, gsize size);
+
G_END_DECLS
#endif /* #ifndef __GIBBER_UNIX_TRANSPORT_H__*/
--
1.5.6.5
More information about the telepathy-commits
mailing list