2 * $Id: usockfd.c,v 1.3 2005-05-03 14:55:11 didg Exp $
4 * Copyright (C) Joerg Lenneis 2003
5 * All Rights Reserved. See COPYING.
10 #endif /* HAVE_CONFIG_H */
18 #endif /* HAVE_UNISTD_H */
20 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <arpa/inet.h>
25 #ifdef HAVE_SYS_TYPES_H
26 #include <sys/types.h>
27 #endif /* HAVE_SYS_TYPES_H */
28 #ifdef HAVE_SYS_TIME_H
30 #endif /* HAVE_SYS_TIME_H */
33 #include <atalk/logger.h>
37 int usockfd_create(char *usock_fn, mode_t mode, int backlog)
40 struct sockaddr_un addr;
43 if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
44 LOG(log_error, logtype_cnid, "error in socket call: %s",
49 if (unlink(usock_fn) < 0 && errno != ENOENT) {
50 LOG(log_error, logtype_cnid, "error unlinking unix socket file %s: %s",
51 usock_fn, strerror(errno));
54 memset((char *) &addr, 0, sizeof(struct sockaddr_un));
55 addr.sun_family = AF_UNIX;
56 strncpy(addr.sun_path, usock_fn, sizeof(addr.sun_path) - 1);
57 if (bind(sockfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) < 0) {
58 LOG(log_error, logtype_cnid, "error binding to socket for %s: %s",
59 usock_fn, strerror(errno));
63 if (listen(sockfd, backlog) < 0) {
64 LOG(log_error, logtype_cnid, "error in listen for %s: %s",
65 usock_fn, strerror(errno));
69 if (chmod(usock_fn, mode) < 0) {
70 LOG(log_error, logtype_cnid, "error changing permissions for %s: %s",
71 usock_fn, strerror(errno));
80 create a tcp socket (should share dsi stuff)
82 int tsockfd_create(char *host, u_int16_t ipport, int backlog)
85 struct sockaddr_in server;
89 hp=gethostbyname(host);
91 unsigned long int addr=inet_addr(host);
92 if (addr!= (unsigned)-1)
93 hp=gethostbyaddr((char*)addr,sizeof(addr),AF_INET);
96 LOG(log_error, logtype_cnid, "gethostbyaddr %s: %s", host, strerror(errno));
100 memcpy((char*)&server.sin_addr,(char*)hp->h_addr,sizeof(server.sin_addr));
102 if ((sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
103 LOG(log_error, logtype_cnid, "error in socket call: %s", strerror(errno));
107 port = htons(ipport);
109 server.sin_family = AF_INET;
110 server.sin_port = port;
114 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &port, sizeof(port));
115 #endif /* SO_REUSEADDR */
117 #ifdef USE_TCP_NODELAY
119 #define SOL_TCP IPPROTO_TCP
120 #endif /* ! SOL_TCP */
122 setsockopt(sockfd, SOL_TCP, TCP_NODELAY, &port, sizeof(port));
123 #endif /* USE_TCP_NODELAY */
125 if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0) {
126 LOG(log_error, logtype_cnid, "error binding to socket for %s: %s",
127 host, strerror(errno));
131 if (listen(sockfd, backlog) < 0) {
132 LOG(log_error, logtype_cnid, "error in listen for %s: %s",
133 host, strerror(errno));
140 /* --------------------- */
141 int usockfd_check(int sockfd, unsigned long ndelay)
150 FD_SET(sockfd, &readfds);
152 tv.tv_usec = ndelay % 1000000;
153 tv.tv_sec = ndelay / 1000000;
154 if ((ret = select(sockfd + 1, &readfds, NULL, NULL, &tv)) < 0) {
157 LOG(log_error, logtype_cnid, "error in select: %s",
164 if ((fd = accept(sockfd, NULL, &size)) < 0) {
167 LOG(log_error, logtype_cnid, "error in accept: %s",