- if(!nodeaddr)
- return -1;
- if (protocol && strcmp("dnet",protocol))
- return -1;
- addr.sdn_family = AF_DECnet;
-
- addr.sdn_add.a_len = nodeaddr->n_length;
- memcpy(addr.sdn_add.a_addr, nodeaddr->n_addr, addr.sdn_add.a_len);
-
- addr.sdn_objnamel = sprintf((char *)addr.sdn_objname, "X$X%d", port);
- if(addr.sdn_objnamel < 0)
- return -1;
- addr.sdn_objnum = 0;
-
- fd = socket(PF_DECnet, SOCK_STREAM, 0);
- if(fd == -1)
- return -1;
-
- memset(&accessdata, 0, sizeof(accessdata));
- accessdata.acc_accl = sprintf((char*)accessdata.acc_acc, "%d", getuid());
- if(accessdata.acc_accl < 0)
- return -1;
- setsockopt(fd, DNPROTO_NSP, SO_CONACCESS, &accessdata, sizeof(accessdata));
-
- if(connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
- close(fd);
- return -1;
+#ifdef SOCK_CLOEXEC
+ fd = socket(family, type | SOCK_CLOEXEC, proto);
+ if (fd == -1 && errno == EINVAL)
+#endif
+ {
+ fd = socket(family, type, proto);
+#ifndef _WIN32
+ if (fd >= 0)
+ fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif