* The first call to this function tries to bind a socket to the abstract name
* space. The result of this test is stored in a static variable. Subsequent
* calls read this variable and create abstract sockets on systems that support
- * them.
+ * them. If a NULL pointer is passed as the name, the function only
+ * initializes the static variable.
*/
static int init_unix_addr(struct sockaddr_un *u, const char *name)
{
static int use_abstract;
- if (strlen(name) + 1 >= UNIX_PATH_MAX)
- return -E_NAME_TOO_LONG;
memset(u->sun_path, 0, UNIX_PATH_MAX);
u->sun_family = PF_UNIX;
if (use_abstract == 0) { /* executed only once */
PARA_NOTICE_LOG("%susing abstract socket namespace\n",
use_abstract == 1? "" : "not ");
}
+ if (!name)
+ return 0;
+ if (strlen(name) + 1 >= UNIX_PATH_MAX)
+ return -E_NAME_TOO_LONG;
strcpy(u->sun_path + (use_abstract == 1? 1 : 0), name);
return 1;
}
int fd, ret;
ret = init_unix_addr(&unix_addr, name);
- if (ret < 0)
+ if (ret <= 0) /* error, or name was NULL */
return ret;
ret = socket(PF_UNIX, SOCK_STREAM, 0);
if (ret < 0)
.post_select = command_post_select,
.context = sct,
}, &sched);
+ /*
+ * Detect whether the abstract Unix domain socket space is supported,
+ * but do not create the socket. We check this once in server context
+ * so that the command handlers inherit this bit of information and
+ * don't need to check again.
+ */
+ create_local_socket(NULL);
return;
err:
PARA_EMERG_LOG("%s\n", para_strerror(-ret));