This is socket.c in view mode; [Download] [Up]
#define I_SYS #define I_SOCKET #define I_ERRNO #define I_STRING #include "includes.h" #ifdef NO_UNIX_DOMAIN #include <fcntl.h> #endif int bind_tcp(int port) { struct sockaddr_in sin; int s; #if 0 /* This is not necessary here! - ot */ struct hostent *hp; char host_name[100]; #ifdef SYSV struct utsname unam; if (uname(&unam) == -1) { perror("uname"); return -1; } strcpy(host_name, unam.nodename); #else if (gethostname(host_name, sizeof(host_name)) == -1) { perror("gethostname"); return -1; } #endif /* SYSV */ hp = gethostbyname(host_name); /* Find the name of the machine we */ /* are running.. */ if (hp == 0) { /* Probly doesn't run TCP/IP. oh well. */ fprintf(stderr, "Gethostbyname: Unknown host.\n"); return -1; } memset(&sin, 0, sizeof(sin)); memcpy(&sin.sin_addr, hp->h_addr, hp->h_length); sin.sin_family = hp->h_addrtype; #endif sin.sin_port = htons( port ); sin.sin_addr.s_addr = INADDR_ANY; /* s = socket(hp->h_addrtype, SOCK_STREAM, 0); */ s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket"); return -1; } /* Ok. Now we look for a socket that */ /* isn't bound. This is probably a */ /* little scummy, but some ppl like it */ /* this way.. We try a maximum of 100 */ /* times... */ while (bind(s, (struct sockaddr * ) &sin, sizeof(sin)) < 0) { /* while an error.. */ if (errno != EADDRINUSE) { /* if it wasn't in use */ close(s); return -1; /* then we can't handle it, so abort. */ } close(s); return -2; /* handled specially by some clients. */ } /*NOTREACHED*/ if (listen(s, 5) == -1) { /* If we can't listen... */ perror("listen"); /* then just dump. We can't handle */ /* errors here. */ close(s); return -1; } return s; } #ifdef NO_UNIX_DOMAIN /* * We bind the socket, and then write the address to the requested * file. We are the server. */ #endif #ifdef STREAMS_PIPE /* * This is a bit of a hack. If STREAMS_PIPE is defined, we look for the * environment variable TERM_BORROWED_DISPLAY_NUMBER, and interpret the * value as an X-server display number, and use that streams pipe as * our client/server IPC channel. * * This is for SCO. It would probably work on other systems if you * became root and set up the appropriate /dev/X?R and /dev/X?S entries */ #endif int bind_unix(char *path) { #ifdef NO_UNIX_DOMAIN struct sockaddr_in sock_in; int size_in; int fd; #else struct sockaddr_un sock_un; #endif #ifdef STREAMS_PIPE char *borrowed_display_number; #endif int s; #ifdef STREAMS_PIPE borrowed_display_number = getenv("TERM_BORROWED_DISPLAY_NUMBER"); if (borrowed_display_number != 0) { s = open_stream_pipe(atoi(borrowed_display_number)); if (s < 0) { fprintf(stderr, "cannot borrow X display channel %s\n", borrowed_display_number); return -1; } else { fprintf(stderr, "Borrowed X display channel %d\n", atoi(borrowed_display_number)); return s; } } #endif #ifdef NO_UNIX_DOMAIN if ((s = socket(AF_INET, SOCK_STREAM, 0 )) < 0) { perror("Socket"); return -1; } sock_in.sin_family = AF_INET; sock_in.sin_addr.s_addr = htonl(INADDR_ANY); sock_in.sin_port = htons(0); if (bind(s, (struct sockaddr *) &sock_in, sizeof(sock_in)) < 0) { perror("Bind"); close(s); return -1; } size_in = sizeof(sock_in); if (getsockname(s, (struct sockaddr *) &sock_in, &size_in) < 0) { perror("getsockname"); close(s); return -1; } fd = open(path, O_WRONLY|O_CREAT, 0666); if (fd < 0) { perror("open path"); close(s); return -1; } if (write(fd, &sock_in.sin_port, sizeof(sock_in.sin_port)) < 0) { perror("write port number"); close(fd); close(s); return -1; } fprintf(stderr, "port is %d\n", sock_in.sin_port); #else if ((s = socket(AF_UNIX, SOCK_STREAM, 0 )) < 0) { perror("Socket"); return -1; } sock_un.sun_family = AF_UNIX; strcpy(sock_un.sun_path, path); unlink(sock_un.sun_path); if (bind(s, (struct sockaddr *) &sock_un, strlen(sock_un.sun_path) + 2)) { perror("Bind"); close(s); return -1; } #endif /* ok. Start looking for connections. */ if (listen(s, 5) < 0) { perror("Listen"); close(s); return -1; } return s; } #ifdef STREAMS_PIPE /* * This is a bit of a hack. If STREAMS_PIPE is defined, we look for the * environment variable TERM_BORROWED_DISPLAY_NUMBER, and interpret the * value as an X-server display number, and use that streams pipe as * our client/server IPC channel. * * This is for SCO. It would probably work on other systems if you * became root and set up the appropriate /dev/X?R and /dev/X?S entries */ #endif int open_unix(char *p) { #ifdef NO_UNIX_DOMAIN struct sockaddr_in sock_in; int fd; #else struct sockaddr_un sock_un; #endif #ifdef STREAMS_PIPE char *borrowed_display_number; #endif int s; #ifdef STREAMS_PIPE borrowed_display_number = getenv("TERM_BORROWED_DISPLAY_NUMBER"); if (borrowed_display_number != 0) { s = MakeStreamPipeConnection(atoi(borrowed_display_number)); if (s < 0) { fprintf(stderr, "cannot borrow X display channel %s\n", borrowed_display_number); return -1; } else { return s; } } #endif #ifdef NO_UNIX_DOMAIN fd = open(p, O_RDONLY); if (fd < 0) { perror("open port path"); return -1; } if (read(fd, &sock_in.sin_port, sizeof(sock_in.sin_port)) < 0) { perror("read port path"); close(fd); return -1; } close(fd); if ((s = socket(AF_INET, SOCK_STREAM, 0 )) < 0) { perror("Socket"); return -1; } sock_in.sin_family = AF_INET; sock_in.sin_addr.s_addr = inet_addr("127.0.0.1"); /* localhost */ if (connect(s, (struct sockaddr *) &sock_in, sizeof(sock_in))) { perror("Connect"); close(s); return -1; } #else if ((s = socket(AF_UNIX, SOCK_STREAM, 0 )) < 0) { perror("Socket"); return -1; } sock_un.sun_family = AF_UNIX; sprintf(sock_un.sun_path,"%s",p); if (connect(s, (struct sockaddr *) &sock_un, strlen(sock_un.sun_path) + 2)) { perror("Connect"); close(s); return -1; } #endif return s; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.