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) 03/07/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 } 91