Преглед на файлове

sockread: add new package

sockread reads data from a Unix domain socket

Signed-off-by: Moritz Warning <moritzwarning@web.de>
Moritz Warning преди 10 години
родител
ревизия
e5c39cc999
променени са 3 файла, в които са добавени 101 реда и са изтрити 0 реда
  1. 35
    0
      utils/sockread/Makefile
  2. 11
    0
      utils/sockread/src/Makefile
  3. 55
    0
      utils/sockread/src/main.c

+ 35
- 0
utils/sockread/Makefile Целия файл

@@ -0,0 +1,35 @@
1
+#
2
+# This software is licensed under the CC0-1.0 license.
3
+#
4
+include $(TOPDIR)/rules.mk
5
+
6
+PKG_NAME:=sockread
7
+PKG_VERSION:=1.0
8
+PKG_RELEASE:=1
9
+PKG_LICENSE:=CC0-1.0
10
+
11
+include $(INCLUDE_DIR)/package.mk
12
+
13
+define Package/sockread
14
+	SECTION:=utils
15
+	CATEGORY:=Utilities
16
+	TITLE:=sockread
17
+	MAINTAINER:=Moritz Warning <moritzwarning@web.de>
18
+endef
19
+
20
+define Package/sockread/description
21
+	sockread reads data from a Unix domain socket
22
+	represented as a special file on the file system.
23
+endef
24
+
25
+define Build/Prepare
26
+	mkdir -p $(PKG_BUILD_DIR)
27
+	$(CP) ./src/* $(PKG_BUILD_DIR)/
28
+endef
29
+
30
+define Package/sockread/install
31
+	$(INSTALL_DIR) $(1)/usr/bin
32
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/sockread $(1)/usr/bin/
33
+endef
34
+
35
+$(eval $(call BuildPackage,sockread))

+ 11
- 0
utils/sockread/src/Makefile Целия файл

@@ -0,0 +1,11 @@
1
+CC ?= gcc
2
+CFLAGS ?= -O2 -Wall -pedantic
3
+CFLAGS += -std=gnu99
4
+
5
+.PHONY: clean
6
+
7
+sockread:
8
+	$(CC) $(CFLAGS) main.c -o sockread
9
+
10
+clean:
11
+	rm -f sockread

+ 55
- 0
utils/sockread/src/main.c Целия файл

@@ -0,0 +1,55 @@
1
+
2
+#include <stdio.h>
3
+#include <stdlib.h>
4
+#include <errno.h>
5
+#include <stddef.h>
6
+#include <stdio.h>
7
+#include <string.h>
8
+#include <sys/socket.h>
9
+#include <sys/un.h>
10
+
11
+
12
+int main(int argc, char *argv[]) {
13
+	if (argc != 2) {
14
+		fprintf(stderr, "Usage: %s <socket>\n", argv[0]);
15
+		return 1;
16
+	}
17
+
18
+	size_t addrlen = strlen(argv[1]);
19
+
20
+	/* Allocate enough space for arbitrary-length paths */
21
+	char addrbuf[offsetof(struct sockaddr_un, sun_path) + addrlen + 1];
22
+	memset(addrbuf, 0, sizeof(addrbuf));
23
+
24
+	struct sockaddr_un *addr = (struct sockaddr_un *)addrbuf;
25
+	addr->sun_family = AF_UNIX;
26
+	memcpy(addr->sun_path, argv[1], addrlen+1);
27
+
28
+	int fd = socket(AF_UNIX, SOCK_STREAM, 0);
29
+	if (fd < 0) {
30
+		fprintf(stderr, "Failed to create socket: %s\n", strerror(errno));
31
+		return 1;
32
+	}
33
+
34
+	if (connect(fd, (struct sockaddr*)addr, sizeof(addrbuf)) < 0) {
35
+		fprintf(stderr, "Can't connect to `%s': %s\n", argv[1], strerror(errno));
36
+		return 1;
37
+	}
38
+
39
+	char buf[1024];
40
+	ssize_t r;
41
+	while (1) {
42
+		r = recv(fd, buf, sizeof(buf), 0);
43
+		if (r < 0) {
44
+			fprintf(stderr, "read: %s\n", strerror(errno));
45
+			return 1;
46
+		}
47
+
48
+		if (r == 0)
49
+			return 0;
50
+
51
+		fwrite(buf, r, 1, stdout);
52
+	}
53
+
54
+	return 0;
55
+}