diff options
author | Hans de Goede <hdegoede@redhat.com> | 2010-10-25 15:23:17 +0200 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2010-10-25 15:23:35 +0200 |
commit | 5bf16427060533404db36ac56e57a126b0b28443 (patch) | |
tree | 06ddf735170dfb7375e8d64992bb4bb8c6f69774 /udscs.c | |
parent | 01b36f4d40eed21515f955f83dc00a135b495262 (diff) |
Add udscs_get_peer_cred function
Diffstat (limited to 'udscs.c')
-rw-r--r-- | udscs.c | 25 |
1 files changed, 21 insertions, 4 deletions
@@ -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); |