main part of the native protocol

git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@31 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2004-06-23 23:17:30 +00:00
parent eecf602476
commit acb25b3510
62 changed files with 2473 additions and 755 deletions

62
src/util.c Normal file
View file

@ -0,0 +1,62 @@
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <fcntl.h>
#include "util.h"
void make_nonblock_fd(int fd) {
int v;
if ((v = fcntl(fd, F_GETFL)) >= 0)
if (!(v & O_NONBLOCK))
fcntl(fd, F_SETFL, v|O_NONBLOCK);
}
void peer_to_string(char *c, size_t l, int fd) {
struct stat st;
assert(c && l && fd >= 0);
if (fstat(fd, &st) < 0) {
snprintf(c, l, "Invalid client fd");
return;
}
if (S_ISSOCK(st.st_mode)) {
union {
struct sockaddr sa;
struct sockaddr_in in;
struct sockaddr_un un;
} sa;
socklen_t sa_len = sizeof(sa);
if (getpeername(fd, &sa.sa, &sa_len) >= 0) {
if (sa.sa.sa_family == AF_INET) {
uint32_t ip = ntohl(sa.in.sin_addr.s_addr);
snprintf(c, l, "TCP/IP client from %i.%i.%i.%i:%u",
ip >> 24,
(ip >> 16) & 0xFF,
(ip >> 8) & 0xFF,
ip & 0xFF,
ntohs(sa.in.sin_port));
return;
} else if (sa.sa.sa_family == AF_LOCAL) {
snprintf(c, l, "UNIX client for %s", sa.un.sun_path);
return;
}
}
snprintf(c, l, "Unknown network client");
return;
} else if (S_ISCHR(st.st_mode) && (fd == 0 || fd == 1)) {
snprintf(c, l, "STDIN/STDOUT client");
return;
}
snprintf(c, l, "Unknown client");
}