summaryrefslogtreecommitdiff
path: root/tests/sockbind.c
blob: f98b5ed6e181f9e572d824d7d2b10850ab3dbbe0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define MAX_CLIENTS 1
#ifdef DEBUG
#define DEBUGPRINT(fmt, ...) fprintf(stderr, "DEBUG: %s %s %d: " fmt, \
                                     __FILE__, __func__, __LINE__, __VA_ARGS__)
#else
#define DEBUGPRINT(...) (void)0
#endif

int main(int argc, char *argv[]){
	struct sockaddr_un sock = {
		.sun_family = AF_UNIX
	};
	int sfd;
	if (argc < 1){
		fprintf(stderr, "Usage: %s PATH\n", argv[0]);
		return 1;
	}
	strncpy(sock.sun_path, argv[1], sizeof(sock) - offsetof(struct sockaddr_un, sun_path));
	DEBUGPRINT("%s", "Constructed socket address\n");
	if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1){
		perror("socket");
		return 2;
	}
	DEBUGPRINT("Created socket fd=%d\n", sfd);
	if (bind(sfd, (struct sockaddr*)&sock, sizeof(sock)) == -1){
		perror("bind");
		return 3;
	}
	if (listen(sfd, MAX_CLIENTS) == -1){
		perror("listen");
		return 4;
	}
	DEBUGPRINT("Listening to %d clients\n", MAX_CLIENTS);
	{
		struct sockaddr_un client_address;
		socklen_t client_size = sizeof(client_address);
		int cfd;
		while ((cfd = accept(sfd, (struct sockaddr*)&client_address,
		                     &client_size)) != -1) {
			char buf[BUFSIZ];
			ssize_t rdcount = -1;
			DEBUGPRINT("Listening to client fd=%d\n", cfd);
			while ((rdcount = read(cfd, buf, sizeof(buf))) > 0) {
				DEBUGPRINT("Read %zi bytes from client, "
				           "message was:\n%.*s", rdcount,
				           rdcount, buf);
				write(STDOUT_FILENO, buf, rdcount);
			}
			assert(rdcount == 0 || rdcount == -1);
			if (rdcount == -1) {
				perror("read");
				return 5;
			}
			DEBUGPRINT("Finished listening to fd=%d\n", cfd);
			close(cfd);
		}
	}

	close(sfd);
	unlink(argv[1]);
	return 0;
}