MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-03-06 Thread Sjoerd Mullender
Changeset: 65ae38a9ac5e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=65ae38a9ac5e
Added Files:
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
Removed Files:
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.


diffs (3 lines):

diff --git a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64 
b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
rename from sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64
rename to 
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-02-28 Thread Sjoerd Mullender
Changeset: f8357589dd10 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f8357589dd10
Modified Files:
sql/server/rel_schema.c
sql/server/sql_parser.y
sql/storage/store.c
sql/test/mergetables/Tests/alter.stable.err
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.


diffs (103 lines):

diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -1352,15 +1352,19 @@ sql_alter_table(mvc *sql, dlist *qname, 
sname = s->base.name;
 
if (te && (te->token == SQL_TABLE || te->token == 
SQL_DROP_TABLE)) {
-   char *ntname = te->data.lval->h->data.sval;
+   dlist *nqname = te->data.lval->h->data.lval;
+   char *nsname = qname_schema(nqname);
+   char *ntname = qname_table(nqname);
 
-   /* TODO partition sname */
+   /* partition sname */
+   if (!nsname)
+   nsname = sname;
if (te->token == SQL_TABLE) {
-   return rel_alter_table(sql->sa, 
DDL_ALTER_TABLE_ADD_TABLE, sname, tname, sname, ntname, 0);
+   return rel_alter_table(sql->sa, 
DDL_ALTER_TABLE_ADD_TABLE, sname, tname, nsname, ntname, 0);
} else {
int drop_action = 
te->data.lval->h->next->data.i_val;
 
-   return rel_alter_table(sql->sa, 
DDL_ALTER_TABLE_DEL_TABLE, sname, tname, sname, ntname, drop_action);
+   return rel_alter_table(sql->sa, 
DDL_ALTER_TABLE_DEL_TABLE, sname, tname, nsname, ntname, drop_action);
}
}
 
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -1055,7 +1055,7 @@ alter_statement:
  | ALTER TABLE qname ADD TABLE qname
{ dlist *l = L();
  append_list(l, $3);
- append_symbol(l, _symbol_create_list( SQL_TABLE, $6));
+ append_symbol(l, _symbol_create_list( SQL_TABLE, 
append_list(L(),$6)));
  $$ = _symbol_create_list( SQL_ALTER_TABLE, l ); }
  | ALTER TABLE qname ALTER alter_table_element
{ dlist *l = L();
@@ -1168,9 +1168,9 @@ drop_table_element:
  append_string(l, $2 );
  append_int(l, $3 );
  $$ = _symbol_create_list( SQL_DROP_CONSTRAINT, l ); }
-  |  TABLE ident drop_action
+  |  TABLE qname drop_action
{ dlist *l = L();
- append_string(l, $2 );
+ append_list(l, $2 );
  append_int(l, $3 );
  append_int(l, 0);
  append_int(l, FALSE ); /* no if exists check */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -565,7 +565,6 @@ load_part(sql_trans *tr, sql_table *t, o
v = table_funcs.column_find_value(tr, find_sql_column(objects, "nr"), 
rid);
id = *(sqlid*)v; _DELETE(v);
v = table_funcs.column_find_value(tr, find_sql_column(objects, "name"), 
rid);
-   /* limitation, parts can only be within the same schema */
base_init(tr->sa, >base, id, TR_OLD, v);_DELETE(v);
cs_add(>members, pt, TR_OLD);
 }
@@ -1015,7 +1014,6 @@ load_schema(sql_trans *tr, sqlid id, oid
for(rid = table_funcs.rids_next(rs); !is_oid_nil(rid); rid = 
table_funcs.rids_next(rs)) 
cs_add(>seqs, load_seq(tr, s, rid), TR_OLD);
table_funcs.rids_destroy(rs);
-   set_members(>tables);
return s;
 }
 
@@ -1068,6 +1066,7 @@ load_trans(sql_trans* tr, sqlid id)
sql_column *sysschema_ids = find_sql_column(sysschema, "id");
rids *schemas = table_funcs.rids_select(tr, sysschema_ids, NULL, NULL);
oid rid;
+   node *n;

if (bs_debug)
fprintf(stderr, "#load trans\n");
@@ -1077,6 +1076,12 @@ load_trans(sql_trans* tr, sqlid id)
if (ns && ns->base.id > id)
cs_add(>schemas, ns, TR_OLD);
}
+   /* members maybe from different schemas */
+   for (n = tr->schemas.set->h; n; n = n->next) {
+   sql_schema *s = n->data;
+
+   set_members(>tables);
+   }
table_funcs.rids_destroy(schemas);
 }
 
diff --git a/sql/test/mergetables/Tests/alter.stable.err 
b/sql/test/mergetables/Tests/alter.stable.err
--- a/sql/test/mergetables/Tests/alter.stable.err
+++ b/sql/test/mergetables/Tests/alter.stable.err
@@ -40,7 +40,7 @@ ERROR = !ALTER TABLE: no such table 'par
 CODE  = 42S02
 MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
 QUERY = alter table mys.smalltable add table mys.part1;
-ERROR = !ALTER TABLE: no such table 'mys' in schema 'mys'
+ERROR = !ALTER TABLE: no such table 'part1' in schema 'mys'
 CODE  = 42S02
 MAPI  = (monetdb) 

MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-02-23 Thread Sjoerd Mullender
Changeset: 8454418ea840 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8454418ea840
Modified Files:
gdk/gdk_select.c
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.


diffs (13 lines):

diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1621,7 +1621,8 @@ BATselect(BAT *b, BAT *s, const void *tl
bn->tsorted = 1;
bn->trevsorted = bn->batCount <= 1;
bn->tkey = 1;
-   bn->tseqbase = (bn->tdense = bn->batCount <= 1) 
!= 0 ? 0 : oid_nil;
+   bn->tdense = bn->batCount <= 1;
+   bn->tseqbase = bn->tdense ? bn->batCount == 0 ? 
0 : * (oid *) Tloc(bn, 0) : oid_nil;
bn->tnil = 0;
bn->tnonil = 1;
if (s) {
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-02-22 Thread Martin van Dinther
Changeset: a70b6a528343 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a70b6a528343
Added Files:
sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out.int128
sql/test/BugTracker-2018/Tests/ilike.Bug-6547.sql
sql/test/BugTracker-2018/Tests/ilike.Bug-6547.stable.err
sql/test/BugTracker-2018/Tests/ilike.Bug-6547.stable.out
Modified Files:
monetdb5/modules/mal/pcre.c
sql/test/BugTracker-2018/Tests/All
sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.


diffs (truncated from 356 to 300 lines):

diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c
--- a/monetdb5/modules/mal/pcre.c
+++ b/monetdb5/modules/mal/pcre.c
@@ -92,24 +92,15 @@ typedef struct RE {
 static const char *
 strcasestr(const char *haystack, const char *needle)
 {
-   const char *p, *np = 0, *startn = 0;
+   size_t nlen = strlen(needle);
 
-   for (p = haystack; *p; p++) {
-   if (np) {
-   if (toupper(*p) == toupper(*np)) {
-   if (!*++np)
-   return startn;
-   } else
-   np = 0;
-   } else if (toupper(*p) == toupper(*needle)) {
-   np = needle + 1;
-   startn = p;
-   if (!*np)
-   return startn;
-   }
+   if (nlen == 0)
+   return haystack;
+   for (size_t hlen = strlen(haystack); nlen <= hlen; haystack++, hlen--) {
+   if (strncasecmp(haystack, needle, nlen) == 0)
+   return haystack;
}
-
-   return 0;
+   return NULL;
 }
 #endif
 
diff --git a/sql/test/BugTracker-2018/Tests/All 
b/sql/test/BugTracker-2018/Tests/All
--- a/sql/test/BugTracker-2018/Tests/All
+++ b/sql/test/BugTracker-2018/Tests/All
@@ -13,7 +13,7 @@ update-with-correlated-subquery.Bug-6520
 sqlitelogictest-in-single-column.Bug-6522
 sqlitelogictest-case-subquery-missing.Bug-6523
 sqlitelogictest-group-by-having-in-count.Bug-6524
-HAVE_HGE?aggr-in-case.Bug-6526
+aggr-in-case.Bug-6526
 crash-orderby-alias.Bug-6527
 sqlitelogictest-in-cast-null.Bug-6529
 sqlitelogictest-not-in-wrong-results.Bug-6530
@@ -25,3 +25,4 @@ truncate_sys_tables.Bug-6543
 truncate_empty_table.Bug-6544
 sqlitelogictest-in-query.Bug-6545
 sqlitelogictest-in-with-division.Bug-6546
+ilike.Bug-6547
diff --git a/sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out 
b/sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out
--- a/sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out
+++ b/sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out
@@ -8,7 +8,7 @@ stdout of test 'aggr-in-case.Bug-6526` i
 # MonetDB 5 server v11.27.14
 # This is an unreleased version
 # Serving database 'mTests_sql_test_BugTracker-2018', using 4 threads
-# Compiled for x86_64-unknown-linux-gnu/64bit with 128bit integers
+# Compiled for x86_64-unknown-linux-gnu/64bit
 # Found 7.324 GiB available main-memory.
 # Copyright (c) 1993 - July 2008 CWI.
 # Copyright (c) August 2008 - 2018 MonetDB B.V., all rights reserved
@@ -51,7 +51,7 @@ Ready.
 #having sum("d1") < case when 5 > 10 then 500 else 400 end;
 % sys.t1,  sys.L4, sys.L7 # table_name
 % c1,  d1, d2 # name
-% varchar, hugeint,hugeint # type
+% varchar, bigint, bigint # type
 % 1,   3,  3 # length
 [ "A", 339,555 ]
 #select
@@ -63,8 +63,8 @@ Ready.
 #group by "c1";
 % sys.t1,  sys.L4, sys.L7, sys.L14 # table_name
 % c1,  d1, d2, formula # name
-% varchar, hugeint,hugeint,decimal # type
-% 1,   4,  4,  40 # length
+% varchar, bigint, bigint, decimal # type
+% 1,   4,  4,  20 # length
 [ "A", 339,555,0.610   ]
 [ "B", 5039,   610,8.260   ]
 [ "C", 6011,   9207,   0.652   ]
@@ -79,8 +79,8 @@ Ready.
 #having (1.0 * sum("d1") / (1.0 * case when sum("d2") > 0 then sum("d2") else 
null end)) > 1;
 % sys.t1,  sys.L4, sys.L7, sys.L14 # table_name
 % c1,  d1, d2, formula # name
-% varchar, hugeint,hugeint,decimal # type
-% 1,   4,  3,  40 # length
+% varchar, bigint, bigint, decimal # type
+% 1,   4,  3,  20 # length
 [ "B", 5039,   610,8.260   ]
 #rollback;
 
diff --git 
a/sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out.int128 
b/sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out.int128
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2018/Tests/aggr-in-case.Bug-6526.stable.out.int128
@@ -0,0 +1,90 @@
+stdout of test 'aggr-in-case.Bug-6526` in directory 'sql/test/BugTracker-2018` 
itself:
+
+
+# 18:07:27 >  
+# 18:07:27 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=35745" "--set" 

MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-02-13 Thread Stefan Manegold
Changeset: 8cbeb3388a48 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8cbeb3388a48
Modified Files:
clients/mapiclient/mclient.c
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.


diffs (66 lines):

diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -1632,27 +1632,27 @@ SQLrenderer(MapiHdl hdl, char singleinst
SQLseparator(len, printfields, '-');
rows = mapi_get_row_count(hdl);
snprintf(buf, sizeof(buf), "%" PRId64 " rows", rows);
-   printf("%" PRId64 " tuple%s", rows, rows != 1 ? "s" : "");
+   mnstr_printf(toConsole, "%" PRId64 " tuple%s", rows, rows != 1 ? "s" : 
"");
 
if (fields != printfields || croppedfields > 0)
-   printf(" !");
+   mnstr_printf(toConsole, " !");
if (fields != printfields) {
rows = fields - printfields;
-   printf("%" PRId64 " column%s dropped", rows, rows != 1 ? "s" : 
"");
+   mnstr_printf(toConsole, "%" PRId64 " column%s dropped", rows, 
rows != 1 ? "s" : "");
}
if (fields != printfields && croppedfields > 0)
-   printf(", ");
+   mnstr_printf(toConsole, ", ");
if (croppedfields > 0)
-   printf("%d field%s truncated",
+   mnstr_printf(toConsole, "%d field%s truncated",
   croppedfields, croppedfields != 1 ? "s" : "");
if (fields != printfields || croppedfields > 0) {
-   printf("!");
+   mnstr_printf(toConsole, "!");
if (firstcrop == 1) {
firstcrop = 0;
-   printf("\nnote: to disable dropping columns and/or 
truncating fields use \\w-1");
+   mnstr_printf(toConsole, "\nnote: to disable dropping 
columns and/or truncating fields use \\w-1");
}
}
-   printf("\n");
+   mnstr_printf(toConsole, "\n");
 
free(len);
free(hdr);
@@ -1837,7 +1837,7 @@ format_result(Mapi mid, MapiHdl hdl, cha
formatter == TESTformatter)
mnstr_printf(toConsole, "[ %" PRId64 "\t]\n", 
mapi_rows_affected(hdl));
else if (formatter == TRASHformatter) {
-   printf("%s\n", timerHuman(sqloptimizer, 
maloptimizer, querytime));
+   mnstr_printf(toConsole, "%s\n", 
timerHuman(sqloptimizer, maloptimizer, querytime));
} else {
aff = mapi_rows_affected(hdl);
lid = mapi_get_last_id(hdl);
@@ -1866,7 +1866,7 @@ format_result(Mapi mid, MapiHdl hdl, cha
 timerHuman(sqloptimizer, 
maloptimizer, querytime));
mnstr_printf(toConsole, "\n");
} else if (formatter == TRASHformatter) {
-   printf("%s\n", timerHuman(sqloptimizer, 
maloptimizer, querytime));
+   mnstr_printf(toConsole, "%s\n", 
timerHuman(sqloptimizer, maloptimizer, querytime));
}
continue;
case Q_TRANS:
@@ -1956,7 +1956,7 @@ format_result(Mapi mid, MapiHdl hdl, cha
}
s= timerHuman(sqloptimizer, maloptimizer, querytime);
if (*s)
-   printf("%s\n", s);
+   mnstr_printf(toConsole, "%s\n", s);
}
} while (!mnstr_errnr(toConsole) && (rc = mapi_next_result(hdl)) == 1);
if (mnstr_errnr(toConsole)) {
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-02-13 Thread Stefan Manegold
Changeset: a68070b785c0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a68070b785c0
Modified Files:
clients/mapiclient/mclient.c
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.

___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-02-13 Thread Sjoerd Mullender
Changeset: 045a9013d4dd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=045a9013d4dd
Modified Files:
buildtools/ChangeLog.Jul2017
gdk/gdk_project.c
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.


diffs (26 lines):

diff --git a/buildtools/ChangeLog.Jul2017 b/buildtools/ChangeLog.Jul2017
--- a/buildtools/ChangeLog.Jul2017
+++ b/buildtools/ChangeLog.Jul2017
@@ -1,3 +1,7 @@
 # ChangeLog file for buildtools
 # This file is updated with Maddlog
 
+* Mon Feb 12 2018 Sjoerd Mullender 
+- Added the .pdb files needed for debug symbols to the Windows installer
+  for MonetDB/SQL.
+
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -226,9 +226,10 @@ BATproject(BAT *l, BAT *r)
  bn->tkey ? "-key" : "");
return bn;
}
+   /* if l has type void, it is either empty or not dense (i.e. nil) */
if (l->ttype == TYPE_void || BATcount(l) == 0 ||
(r->ttype == TYPE_void && is_oid_nil(r->tseqbase))) {
-   /* trivial: all values are nil */
+   /* trivial: all values are nil (includes no entries at all) */
const void *nil = ATOMnilptr(r->ttype);
 
bn = BATconstant(l->hseqbase, r->ttype == TYPE_oid ? TYPE_void 
: r->ttype,
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Mar2018 - Merge with Jul2017 branch.

2018-02-06 Thread Sjoerd Mullender
Changeset: 299f427e2881 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=299f427e2881
Modified Files:
NT/monetdb_config.h.in
clients/mapiclient/mnc.c
clients/mapilib/mapi.c
common/stream/stream.c
configure.ag
monetdb5/mal/mal_parser.c
monetdb5/modules/atoms/json.c
monetdb5/modules/mal/language.c
monetdb5/modules/mal/mal_mapi.c
tools/merovingian/daemon/client.c
tools/merovingian/daemon/connections.c
tools/merovingian/daemon/controlrunner.c
tools/merovingian/daemon/forkmserver.c
tools/merovingian/daemon/handlers.c
tools/merovingian/daemon/merovingian.c
tools/merovingian/daemon/multiplex-funnel.c
tools/merovingian/daemon/proxy.c
tools/merovingian/utils/control.c
tools/merovingian/utils/properties.c
tools/mserver/shutdowntest.c
Branch: Mar2018
Log Message:

Merge with Jul2017 branch.


diffs (truncated from 1056 to 300 lines):

diff --git a/NT/monetdb_config.h.in b/NT/monetdb_config.h.in
--- a/NT/monetdb_config.h.in
+++ b/NT/monetdb_config.h.in
@@ -892,10 +892,6 @@ c99_snprintf(char *outBuf, size_t size, 
 #define ssize_t int
 #endif
 
-/* normally defined in fcntl.h, but not on Windows */
-#define O_CLOEXEC 0
-
-
 typedef int64_t lng;
 typedef uint64_t ulng;
 #define SIZEOF_LNG 8
diff --git a/clients/mapiclient/mnc.c b/clients/mapiclient/mnc.c
--- a/clients/mapiclient/mnc.c
+++ b/clients/mapiclient/mnc.c
@@ -55,6 +55,9 @@
 #define SOCKLEN int
 #endif
 
+#if !defined(HAVE_ACCEPT4) || !defined(SOCK_CLOEXEC)
+#define accept4(sockfd, addr, addlen, flags)   accept(sockfd, addr, addrlen)
+#endif
 
 static void
 usage(void)
@@ -162,15 +165,19 @@ main(int argc, char **argv)
exit(1);
}
for (rp = res; rp; rp = rp->ai_next) {
-   s = socket(rp->ai_family, rp->ai_socktype, 
rp->ai_protocol);
+   s = socket(rp->ai_family, rp->ai_socktype
+#ifdef SOCK_CLOEXEC
+  | SOCK_CLOEXEC
+#endif
+  , rp->ai_protocol);
if (s == INVALID_SOCKET)
continue;
if (connect(s, rp->ai_addr, (socklen_t) rp->ai_addrlen) 
!= SOCKET_ERROR)
break;  /* success */
closesocket(s);
}
-#ifdef HAVE_FCNTL
-   fcntl(s, F_SETFD, FD_CLOEXEC);
+#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL)
+   (void) fcntl(s, F_SETFD, FD_CLOEXEC);
 #endif
freeaddrinfo(res);
if (rp == NULL) {
@@ -191,14 +198,18 @@ main(int argc, char **argv)
memcpy(_addr, hp->h_addr_list[0], hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons((unsigned short) (port & 0x));
-   s = socket(server.sin_family, SOCK_STREAM, IPPROTO_TCP);
+   s = socket(server.sin_family, SOCK_STREAM
+#ifdef SOCK_CLOEXEC
+  | SOCK_CLOEXEC
+#endif
+  , IPPROTO_TCP);
 
if (s == INVALID_SOCKET) {
fprintf(stderr, "opening socket failed: %s\n", 
strerror(errno));
exit(1);
}
-#ifdef HAVE_FCNTL
-   fcntl(s, F_SETFD, FD_CLOEXEC);
+#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL)
+   (void) fcntl(s, F_SETFD, FD_CLOEXEC);
 #endif
 
if (connect(s, serv, sizeof(server)) == SOCKET_ERROR) {
@@ -220,12 +231,16 @@ main(int argc, char **argv)
exit(1);
}
 
-   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
{
+   if ((sock = socket(AF_INET, SOCK_STREAM
+#ifdef SOCK_CLOEXEC
+  | SOCK_CLOEXEC
+#endif
+  , 0)) == INVALID_SOCKET) {
fprintf(stderr, "failed to create socket: %s\n", 
strerror(errno));
exit(1);
}
-#ifdef HAVE_FCNTL
-   fcntl(sock, F_SETFD, FD_CLOEXEC);
+#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL)
+   (void) fcntl(sock, F_SETFD, FD_CLOEXEC);
 #endif
 
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) , sizeof 
on);
@@ -244,13 +259,13 @@ main(int argc, char **argv)
}
 
listen(sock, 1);
-   if ((s = accept(sock, (SOCKPTR)0, (socklen_t *)0)) == 
INVALID_SOCKET) {
+   if ((s = accept4(sock, (SOCKPTR)0, (socklen_t *)0, 
SOCK_CLOEXEC)) == INVALID_SOCKET) {
fprintf(stderr, "failed to accept connection: %s\n",
strerror(errno));
exit(1);
}
-#ifdef HAVE_FCNTL
-   fcntl(s, F_SETFD, FD_CLOEXEC);
+#if