summaryrefslogtreecommitdiff
path: root/udscs.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2010-10-25 15:23:17 +0200
committerHans de Goede <hdegoede@redhat.com>2010-10-25 15:23:35 +0200
commit5bf16427060533404db36ac56e57a126b0b28443 (patch)
tree06ddf735170dfb7375e8d64992bb4bb8c6f69774 /udscs.c
parent01b36f4d40eed21515f955f83dc00a135b495262 (diff)
Add udscs_get_peer_cred function
Diffstat (limited to 'udscs.c')
-rw-r--r--udscs.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/udscs.c b/udscs.c
index 46e3eed..d15b348 100644
--- a/udscs.c
+++ b/udscs.c
@@ -44,6 +44,7 @@ struct udscs_connection {
int no_types;
FILE *logfile;
FILE *errfile;
+ struct ucred peer_cred;
/* Read stuff, single buffer, separate header and data buffer */
int header_read;
@@ -233,6 +234,11 @@ void udscs_destroy_connection(struct udscs_connection **connp)
*connp = NULL;
}
+struct ucred udscs_get_peer_cred(struct udscs_connection *conn)
+{
+ return conn->peer_cred;
+}
+
int udscs_server_fill_fds(struct udscs_server *server, fd_set *readfds,
fd_set *writefds)
{
@@ -272,10 +278,10 @@ int udscs_client_fill_fds(struct udscs_connection *conn, fd_set *readfds,
static void udscs_server_accept(struct udscs_server *server) {
struct udscs_connection *new_conn, *conn;
struct sockaddr_un address;
- socklen_t address_length = sizeof(address);
- int fd;
+ socklen_t length = sizeof(address);
+ int r, fd;
- fd = accept(server->fd, (struct sockaddr *)&address, &address_length);
+ fd = accept(server->fd, (struct sockaddr *)&address, &length);
if (fd == -1) {
if (errno == EINTR)
return;
@@ -298,6 +304,16 @@ static void udscs_server_accept(struct udscs_server *server) {
new_conn->read_callback = server->read_callback;
new_conn->disconnect_callback = server->disconnect_callback;
+ length = sizeof(new_conn->peer_cred);
+ r = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &new_conn->peer_cred, &length);
+ if (r != 0) {
+ fprintf(server->errfile,
+ "Could not get peercred, disconnecting new client\n");
+ close(fd);
+ free(new_conn);
+ return;
+ }
+
conn = &server->connections_head;
while (conn->next)
conn = conn->next;
@@ -306,7 +322,8 @@ static void udscs_server_accept(struct udscs_server *server) {
conn->next = new_conn;
if (server->logfile)
- fprintf(server->logfile, "new client accepted: %p\n", new_conn);
+ fprintf(server->logfile, "new client accepted: %p, pid: %d\n",
+ new_conn, (int)new_conn->peer_cred.pid);
if (server->connect_callback)
server->connect_callback(new_conn);