|
|
1.1 root 1: /*
2: * Copyright (c) 1986 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: char copyright[] =
20: "@(#) Copyright (c) 1986 The Regents of the University of California.\n\
21: All rights reserved.\n";
22: #endif /* not lint */
23:
24: #ifndef lint
25: static char sccsid[] = "@(#)ustreamread.c 6.4 (Berkeley) 3/7/89";
26: #endif /* not lint */
27:
28: #include <sys/types.h>
29: #include <sys/socket.h>
30: #include <sys/un.h>
31: #include <stdio.h>
32:
33: #define NAME "socket"
34:
35: /*
36: * This program creates a socket in the UNIX domain and binds a name to it.
37: * After printing the socket's name it begins a loop. Each time through the
38: * loop it accepts a connection and prints out messages from it. When the
39: * connection breaks, or a termination message comes through, the program
40: * accepts a new connection.
41: */
42: main()
43: {
44: int sock, msgsock, rval;
45: struct sockaddr_un server;
46: char buf[1024];
47:
48: /* Create socket */
49: sock = socket(AF_UNIX, SOCK_STREAM, 0);
50: if (sock < 0) {
51: perror("opening stream socket");
52: exit(1);
53: }
54: /* Name socket using file system name */
55: server.sun_family = AF_UNIX;
56: strcpy(server.sun_path, NAME);
57: if (bind(sock, &server, sizeof(struct sockaddr_un))) {
58: perror("binding stream socket");
59: exit(1);
60: }
61: printf("Socket has name %s\en", server.sun_path);
62: /* Start accepting connections */
63: listen(sock, 5);
64: for (;;) {
65: msgsock = accept(sock, 0, 0);
66: if (msgsock == -1)
67: perror("accept");
68: else do {
69: bzero(buf, sizeof(buf));
70: if ((rval = read(msgsock, buf, 1024)) < 0)
71: perror("reading stream message");
72: else if (rval == 0)
73: printf("Ending connection\en");
74: else
75: printf("-->%s\en", buf);
76: } while (rval > 0);
77: close(msgsock);
78: }
79: /*
80: * The following statements are not executed, because they follow an
81: * infinite loop. However, most ordinary programs will not run
82: * forever. In the UNIX domain it is necessary to tell the file
83: * system that one is through using NAME. In most programs one uses
84: * the call unlink() as below. Since the user will have to kill this
85: * program, it will be necessary to remove the name by a command from
86: * the shell.
87: */
88: close(sock);
89: unlink(NAME);
90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.