#include "http-private.h"
#include "globals.h"
#include <stdlib.h>
+#include <sys/stat.h>
#ifdef WIN32
# include <windows.h>
#endif /* WIN32 */
char line[1024], /* Line from file */
*value; /* Value on line */
int linenum; /* Line number in file */
+#ifdef CUPS_DEFAULT_DOMAINSOCKET
+ struct stat sockinfo; /* Domain socket information */
+#endif /* CUPS_DEFAULT_DOMAINSOCKET */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
}
#ifdef CUPS_DEFAULT_DOMAINSOCKET
- if (!access(CUPS_DEFAULT_DOMAINSOCKET, 0))
+ /*
+ * If we are compiled with domain socket support, only use the
+ * domain socket if it exists and has the right permissions...
+ */
+
+ if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) &&
+ (sockinfo.st_mode & S_IRWXO) == S_IRWXO)
server = CUPS_DEFAULT_DOMAINSOCKET;
else
#endif /* CUPS_DEFAULT_DOMAINSOCKET */
*/
val = 1;
- #ifdef __sun
+#ifdef __sun
setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
- #else
+#else
setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
- #endif /* __sun */
+#endif /* __sun */
/*
* Bind to the port we found...
*/
- #ifdef AF_INET6
+#ifdef AF_INET6
if (lis->address.addr.sa_family == AF_INET6)
{
- # ifdef IPV6_V6ONLY
+# ifdef IPV6_V6ONLY
/*
* Accept only IPv6 connections on this socket, to avoid
* potential security issues and to make all platforms behave
*/
val = 1;
- # ifdef __sun
+# ifdef __sun
setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&val, sizeof(val));
- # else
+# else
setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
- # endif /* __sun */
- # endif /* IPV6_V6ONLY */
+# endif /* __sun */
+# endif /* IPV6_V6ONLY */
status = bind(lis->fd, (struct sockaddr *)&(lis->address),
httpAddrLength(&(lis->address)));
}
else
- #endif /* AF_INET6 */
- #ifdef AF_LOCAL
+#endif /* AF_INET6 */
+#ifdef AF_LOCAL
if (lis->address.addr.sa_family == AF_LOCAL)
{
mode_t mask; /* Umask setting */
umask(mask);
}
else
- #endif /* AF_LOCAL */
+#endif /* AF_LOCAL */
status = bind(lis->fd, (struct sockaddr *)&(lis->address),
sizeof(lis->address.ipv4));