Update of /cvsroot/monetdb/sql/src/backends/monet5/merovingian In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv15306
Modified Files:
merovingian.c merovingian_connections.c
merovingian_controlrunner.c
Log Message:
open up a tcp connection for control commands, works for expert users using
netcat, still need to do login ritual
U merovingian_controlrunner.c
Index: merovingian_controlrunner.c
===================================================================
RCS file:
/cvsroot/monetdb/sql/src/backends/monet5/merovingian/merovingian_controlrunner.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- merovingian_controlrunner.c 18 Sep 2009 14:49:46 -0000 1.19
+++ merovingian_controlrunner.c 23 Sep 2009 09:46:55 -0000 1.20
@@ -64,7 +64,10 @@
static void
controlRunner(void *d)
{
- int sock = *(int *)d;
+ int *socks = (int *)d;
+ int usock = socks[0];
+ int tsock = socks[1];
+ int sock = -1;
char buf[256];
char buf2[256];
char *p, *q;
@@ -76,15 +79,25 @@
int msgsock;
size_t len;
err e;
+ int maxsock;
+ char *origin;
+
+ if (usock > tsock) {
+ maxsock = usock + 1;
+ } else {
+ maxsock = tsock + 1;
+ }
do {
FD_ZERO(&fds);
- FD_SET(sock, &fds);
+ FD_SET(usock, &fds);
+ if (tsock > 0)
+ FD_SET(tsock, &fds);
/* Wait up to 5 seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
- retval = select(sock + 1, &fds, NULL, NULL, &tv);
+ retval = select(maxsock, &fds, NULL, NULL, &tv);
if (retval == 0) {
/* nothing interesting has happened */
continue;
@@ -95,23 +108,68 @@
if (errno != EINTR) {
e = newErr("control runner: error during
select: %s",
strerror(errno));
- goto error;
}
continue;
}
- if (FD_ISSET(sock, &fds)) {
- if ((msgsock = accept(sock, (SOCKPTR) 0, (socklen_t *)
0)) < 0) {
- if (_mero_keep_listening == 0)
- break;
- if (errno != EINTR) {
- e = newErr("control runner: error
during accept: %s",
- strerror(errno));
- goto error;
- }
- continue;
+
+ if (FD_ISSET(usock, &fds)) {
+ sock = usock;
+ } else if (tsock > 0 && FD_ISSET(tsock, &fds)) {
+ sock = tsock;
+ } else {
+ continue;
+ }
+
+ if ((msgsock = accept(sock, (SOCKPTR) 0, (socklen_t *) 0)) < 0)
{
+ if (_mero_keep_listening == 0)
+ break;
+ if (errno != EINTR) {
+ e = newErr("control runner: error during
accept: %s",
+ strerror(errno));
}
- } else
continue;
+ }
+
+ origin = "(local)";
+
+ /* do password ritual for TCP connections */
+ if (sock == tsock) {
+ struct sockaddr_in saddr;
+ socklen_t saddrlen = sizeof(struct sockaddr_in);
+ /* TODO */
+
+ /* below routine is eligable for a function (reuse in
+ * merovingian_client.c) */
+ if (getpeername(msgsock,
+ (struct sockaddr *)&saddr,
&saddrlen) == -1)
+ {
+ Mfprintf(_mero_ctlerr, "couldn't get peername
of client: %s\n",
+ strerror(errno));
+ origin = "(unknown)";
+ } else {
+ /* avoid doing this, it requires some includes
that probably
+ * give trouble on windowz
+ host = inet_ntoa(saddr.sin_addr);
+ */
+ struct hostent *hoste =
+ gethostbyaddr(&saddr.sin_addr.s_addr,
4, saddr.sin_family);
+ if (hoste == NULL) {
+ origin = alloca(sizeof(char) *
+ ((3 + 1 + 3 + 1 + 3 + 1
+ 3) + 1));
+ sprintf(origin, "%u.%u.%u.%u:%u",
+
(unsigned)((ntohl(saddr.sin_addr.s_addr) >> 24) & 0xff),
+
(unsigned)((ntohl(saddr.sin_addr.s_addr) >> 16) & 0xff),
+
(unsigned)((ntohl(saddr.sin_addr.s_addr) >> 8) & 0xff),
+
(unsigned)(ntohl(saddr.sin_addr.s_addr) & 0xff),
+
(unsigned)(ntohs(saddr.sin_port)));
+ } else {
+ origin = alloca(sizeof(char) *
+ (strlen(hoste->h_name)
+ 1 + 5 + 1));
+ sprintf(origin, "%s:%u",
+ hoste->h_name,
(unsigned)(ntohs(saddr.sin_port)));
+ }
+ }
+ }
while (_mero_keep_listening) {
if (pos == 0) {
@@ -125,8 +183,8 @@
continue;
}
/* hmmm error ... give up */
- Mfprintf(_mero_ctlerr, "error reading
from control "
- "channel: %s\n",
strerror(errno));
+ Mfprintf(_mero_ctlerr, "%s: error
reading from control "
+ "channel: %s\n",
origin, strerror(errno));
break;
} else {
buf[pos] = '\0';
@@ -137,8 +195,8 @@
p = strchr(q, '\n');
if (p == NULL) {
/* skip, must be garbage */
- Mfprintf(_mero_ctlerr, "skipping garbage on
control "
- "channel: %s\n", buf);
+ Mfprintf(_mero_ctlerr, "%s: skipping garbage on
control "
+ "channel: %s\n", origin, buf);
pos = 0;
continue;
}
@@ -151,7 +209,8 @@
/* format is simple: database<space>command */
if ((p = strchr(q, ' ')) == NULL) {
- Mfprintf(_mero_ctlerr, "malformed control
signal: %s\n", q);
+ Mfprintf(_mero_ctlerr, "%s: malformed control
signal: %s\n",
+ origin, q);
} else {
*p++ = '\0';
if (strcmp(p, "start") == 0) {
@@ -160,15 +219,15 @@
len = snprintf(buf2,
sizeof(buf2),
"internal
error, please review the logs\n");
send(msgsock, buf2, len, 0);
- Mfprintf(_mero_ctlerr, "start:
SABAOTHgetStatus: "
- "%s\n", e);
+ Mfprintf(_mero_ctlerr, "%s:
start: SABAOTHgetStatus: "
+ "%s\n", origin,
e);
freeErr(e);
continue;
} else {
if (stats == NULL) {
- Mfprintf(_mero_ctlerr,
"received start signal "
+ Mfprintf(_mero_ctlerr,
"%s: received start signal "
"for
database not under merovingian "
-
"control: %s\n", q);
+
"control: %s\n", origin, q);
len = snprintf(buf2,
sizeof(buf2),
"no
such database: %s\n", q);
send(msgsock, buf2,
len, 0);
@@ -176,8 +235,9 @@
}
if (stats->state ==
SABdbRunning) {
- Mfprintf(_mero_ctlerr,
"received start signal "
- "for
already running database: %s\n", q);
+ Mfprintf(_mero_ctlerr,
"%s: received start signal "
+ "for
already running database: %s\n",
+ origin,
q);
len = snprintf(buf2,
sizeof(buf2),
"database is already running: %s\n", q);
send(msgsock, buf2,
len, 0);
@@ -188,8 +248,8 @@
SABAOTHfreeStatus(&stats);
}
if ((e = forkMserver(q, &stats, 1)) !=
NO_ERR) {
- Mfprintf(_mero_ctlerr, "failed
to fork mserver: %s\n",
- getErrMsg(e));
+ Mfprintf(_mero_ctlerr, "%s:
failed to fork mserver: "
+ "%s\n", origin,
getErrMsg(e));
len = snprintf(buf2,
sizeof(buf2),
"starting '%s'
failed: %s\n",
q,
getErrMsg(e));
@@ -199,7 +259,8 @@
} else {
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2, len, 0);
- Mfprintf(_mero_ctlout, "started
database '%s'\n", q);
+ Mfprintf(_mero_ctlout, "%s:
started database '%s'\n",
+ origin, q);
}
if (stats != NULL)
@@ -216,12 +277,12 @@
if (strcmp(dp->dbname, q) == 0)
{
if (strcmp(p, "stop")
== 0) {
terminateProcess(dp);
-
Mfprintf(_mero_ctlout, "stopped "
-
"database '%s'\n", q);
+
Mfprintf(_mero_ctlout, "%s: stopped "
+
"database '%s'\n", origin, q);
} else {
kill(dp->pid,
SIGKILL);
-
Mfprintf(_mero_ctlout, "killed "
-
"database '%s'\n", q);
+
Mfprintf(_mero_ctlout, "%s: killed "
+
"database '%s'\n", origin, q);
}
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2,
len, 0);
@@ -230,8 +291,8 @@
dp = dp->next;
}
if (dp == NULL) {
- Mfprintf(_mero_ctlerr,
"received stop signal for "
- "non running
database: %s\n", q);
+ Mfprintf(_mero_ctlerr, "%s:
received stop signal for "
+ "non running
database: %s\n", origin, q);
len = snprintf(buf2,
sizeof(buf2),
"database is
not running: %s\n", q);
send(msgsock, buf2, len, 0);
@@ -240,22 +301,23 @@
} else if (strcmp(p, "create") == 0) {
err e = db_create(q);
if (e != NO_ERR) {
- Mfprintf(_mero_ctlerr, "failed
to create "
- "database '%s':
%s\n", q, getErrMsg(e));
+ Mfprintf(_mero_ctlerr, "%s:
failed to create "
+ "database '%s':
%s\n", origin, q, getErrMsg(e));
len = snprintf(buf2,
sizeof(buf2),
"%s\n",
getErrMsg(e));
send(msgsock, buf2, len, 0);
free(e);
} else {
- Mfprintf(_mero_ctlout, "created
database '%s'\n", q);
+ Mfprintf(_mero_ctlout, "%s:
created database '%s'\n",
+ origin, q);
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2, len, 0);
}
} else if (strcmp(p, "destroy") == 0) {
err e = db_destroy(q);
if (e != NO_ERR) {
- Mfprintf(_mero_ctlerr, "failed
to destroy "
- "database '%s':
%s\n", q, getErrMsg(e));
+ Mfprintf(_mero_ctlerr, "%s:
failed to destroy "
+ "database '%s':
%s\n", origin, q, getErrMsg(e));
len = snprintf(buf2,
sizeof(buf2),
"%s\n",
getErrMsg(e));
send(msgsock, buf2, len, 0);
@@ -266,15 +328,16 @@
* database" if not shared
(e.g. when under
* maintenance) */
leavedb(q);
- Mfprintf(_mero_ctlout,
"destroyed database '%s'\n", q);
+ Mfprintf(_mero_ctlout, "%s:
destroyed database '%s'\n",
+ origin, q);
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2, len, 0);
}
} else if (strcmp(p, "lock") == 0) {
char *e = db_lock(q);
if (e != NULL) {
- Mfprintf(_mero_ctlerr, "failed
to lock "
- "database '%s':
%s\n", q, getErrMsg(e));
+ Mfprintf(_mero_ctlerr, "%s:
failed to lock "
+ "database '%s':
%s\n", origin, q, getErrMsg(e));
len = snprintf(buf2,
sizeof(buf2),
"%s\n",
getErrMsg(e));
send(msgsock, buf2, len, 0);
@@ -284,15 +347,16 @@
* spam if database happened to
be unshared "for
* love" */
leavedb(q);
- Mfprintf(_mero_ctlout, "locked
database '%s'\n", q);
+ Mfprintf(_mero_ctlout, "%s:
locked database '%s'\n",
+ origin, q);
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2, len, 0);
}
} else if (strcmp(p, "release") == 0) {
char *e = db_release(q);
if (e != NULL) {
- Mfprintf(_mero_ctlerr, "failed
to release "
- "database '%s':
%s\n", q, getErrMsg(e));
+ Mfprintf(_mero_ctlerr, "%s:
failed to release "
+ "database '%s':
%s\n", origin, q, getErrMsg(e));
len = snprintf(buf2,
sizeof(buf2),
"%s\n",
getErrMsg(e));
send(msgsock, buf2, len, 0);
@@ -305,8 +369,8 @@
len = snprintf(buf2,
sizeof(buf2),
"internal error, please review the logs\n");
send(msgsock, buf2,
len, 0);
- Mfprintf(_mero_ctlerr,
"release: SABAOTHgetStatus: "
- "%s\n",
e);
+ Mfprintf(_mero_ctlerr,
"%s: release: "
+
"SABAOTHgetStatus: %s\n", origin, e);
freeErr(e);
/* we need to OK
regardless, as releasing
* succeed */
@@ -314,7 +378,8 @@
anncdbS(stats);
SABAOTHfreeStatus(&stats);
}
- Mfprintf(_mero_ctlout,
"released database '%s'\n", q);
+ Mfprintf(_mero_ctlout, "%s:
released database '%s'\n",
+ origin, q);
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2, len, 0);
}
@@ -326,14 +391,14 @@
len = snprintf(buf2,
sizeof(buf2),
"internal
error, please review the logs\n");
send(msgsock, buf2, len, 0);
- Mfprintf(_mero_ctlerr, "share:
SABAOTHgetStatus: "
- "%s\n", e);
+ Mfprintf(_mero_ctlerr, "%s:
get: SABAOTHgetStatus: "
+ "%s\n", origin,
e);
freeErr(e);
continue;
}
if (stats == NULL) {
- Mfprintf(_mero_ctlerr,
"received get signal for "
- "unknown
database: %s\n", q);
+ Mfprintf(_mero_ctlerr, "%s:
received get signal for "
+ "unknown
database: %s\n", origin, q);
len = snprintf(buf2,
sizeof(buf2),
"unknown
database: %s\n", q);
send(msgsock, buf2, len, 0);
@@ -352,8 +417,8 @@
GDKfree(props);
SABAOTHfreeStatus(&stats);
- Mfprintf(_mero_ctlout, "served property
list for "
- "database '%s'\n", q);
+ Mfprintf(_mero_ctlout, "%s: served
property list for "
+ "database '%s'\n",
origin, q);
break;
} else if (strncmp(p, "share=",
strlen("share=")) == 0) {
sabdb *stats;
@@ -368,9 +433,10 @@
"discovery
service is globally disabled, "
"enable it
first\n");
send(msgsock, buf2, len, 0);
- Mfprintf(_mero_ctlerr, "share:
cannot perform client "
- "share request:
discovery service is globally "
- "disabled in
%s\n", _mero_conffile);
+ Mfprintf(_mero_ctlerr, "%s:
share: cannot perform "
+ "client share
request: discovery service "
+ "is globally
disabled in %s\n",
+ origin,
_mero_conffile);
continue;
}
@@ -378,14 +444,14 @@
len = snprintf(buf2,
sizeof(buf2),
"internal
error, please review the logs\n");
send(msgsock, buf2, len, 0);
- Mfprintf(_mero_ctlerr, "share:
SABAOTHgetStatus: "
- "%s\n", e);
+ Mfprintf(_mero_ctlerr, "%s:
share: SABAOTHgetStatus: "
+ "%s\n", origin,
e);
freeErr(e);
continue;
}
if (stats == NULL) {
- Mfprintf(_mero_ctlerr,
"received share signal for "
- "unknown
database: %s\n", q);
+ Mfprintf(_mero_ctlerr, "%s:
received share signal for "
+ "unknown
database: %s\n", origin, q);
len = snprintf(buf2,
sizeof(buf2),
"unknown
database: %s\n", q);
send(msgsock, buf2, len, 0);
@@ -402,13 +468,14 @@
if ((e = setProp(stats->path, "shared",
p)) != NULL) {
/* reannounce again, there was
an error */
anncdbS(stats);
- Mfprintf(_mero_ctlerr, "failed
to share: %s\n", e);
+ Mfprintf(_mero_ctlerr, "%s:
failed to share: %s\n",
+ origin, e);
len = snprintf(buf2,
sizeof(buf2), "%s\n", e);
send(msgsock, buf2, len, 0);
} else {
anncdbS(stats);
- Mfprintf(_mero_ctlout, "shared
database '%s' "
- "as '%s%s'\n",
stats->dbname,
+ Mfprintf(_mero_ctlout, "%s:
shared database '%s' "
+ "as '%s%s'\n",
origin, stats->dbname,
stats->dbname,
p);
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2, len, 0);
@@ -420,14 +487,14 @@
p += strlen("name=");
e = db_rename(q, p);
if (e != NULL) {
- Mfprintf(_mero_ctlerr, "%s\n",
e);
+ Mfprintf(_mero_ctlerr, "%s:
%s\n", origin, e);
len = snprintf(buf2,
sizeof(buf2), "%s\n", e);
send(msgsock, buf2, len, 0);
free(e);
} else {
if ((e =
SABAOTHgetStatus(&stats, p)) != MAL_SUCCEED) {
- Mfprintf(_mero_ctlerr,
"share: SABAOTHgetStatus: "
- "%s\n",
e);
+ Mfprintf(_mero_ctlerr,
"%s: name: SABAOTHgetStatus:"
+ "
%s\n", origin, e);
freeErr(e);
/* should not fail,
since the rename was
* already successful */
@@ -436,8 +503,8 @@
anncdbS(stats);
SABAOTHfreeStatus(&stats);
}
- Mfprintf(_mero_ctlout, "renamed
database '%s' "
- "to '%s'\n", q,
p);
+ Mfprintf(_mero_ctlout, "%s:
renamed database '%s' "
+ "to '%s'\n",
origin, q, p);
len = snprintf(buf2,
sizeof(buf2), "OK\n");
send(msgsock, buf2, len, 0);
}
@@ -447,14 +514,14 @@
len = snprintf(buf2,
sizeof(buf2),
"internal
error, please review the logs\n");
send(msgsock, buf2, len, 0);
- Mfprintf(_mero_ctlerr, "share:
SABAOTHgetStatus: "
- "%s\n", e);
+ Mfprintf(_mero_ctlerr, "%s:
set: SABAOTHgetStatus: "
+ "%s\n", origin,
e);
freeErr(e);
continue;
}
if (stats == NULL) {
- Mfprintf(_mero_ctlerr,
"received property signal for "
- "unknown
database: %s\n", q);
+ Mfprintf(_mero_ctlerr, "%s:
received property signal "
+ "for unknown
database: %s\n", origin, q);
len = snprintf(buf2,
sizeof(buf2),
"unknown
database: %s\n", q);
send(msgsock, buf2, len, 0);
@@ -466,8 +533,8 @@
if (*val == '\0')
val = NULL;
if ((e = setProp(stats->path, p, val))
!= NULL) {
- Mfprintf(_mero_ctlerr, "setting
property failed: %s\n",
- e);
+ Mfprintf(_mero_ctlerr, "%s:
setting property failed: "
+ "%s\n", origin,
e);
len = snprintf(buf2,
sizeof(buf2),
"%s\n", e);
send(msgsock, buf2, len, 0);
@@ -479,11 +546,11 @@
SABAOTHfreeStatus(&stats);
if (val != NULL) {
- Mfprintf(_mero_ctlout, "set
property '%s' for "
- "database '%s'
to '%s'\n", p, q, val);
+ Mfprintf(_mero_ctlout, "%s: set
property '%s' for "
+ "database '%s'
to '%s'\n", origin, p, q, val);
} else {
- Mfprintf(_mero_ctlout,
"inherited property '%s' for "
- "database
'%s'\n", p, q);
+ Mfprintf(_mero_ctlout, "%s:
inherited property '%s' "
+ "for database
'%s'\n", origin, p, q);
}
len = snprintf(buf2, sizeof(buf2),
"OK\n");
send(msgsock, buf2, len, 0);
@@ -501,8 +568,8 @@
len = snprintf(buf2,
sizeof(buf2),
"internal
error, please review the logs\n");
send(msgsock, buf2, len, 0);
- Mfprintf(_mero_ctlerr, "status:
SABAOTHgetStatus: "
- "%s\n", e);
+ Mfprintf(_mero_ctlerr, "%s:
status: SABAOTHgetStatus: "
+ "%s\n", origin,
e);
freeErr(e);
continue;
}
@@ -519,13 +586,15 @@
}
if (q == NULL) {
- Mfprintf(_mero_ctlout, "served
status list\n");
+ Mfprintf(_mero_ctlout, "%s:
served status list\n",
+ origin);
/* because this command is
multi line, you can't
* combine it, disconnect the
client */
break;
} else {
- Mfprintf(_mero_ctlout,
"returned status for '%s'\n", q);
+ Mfprintf(_mero_ctlout, "%s:
returned status for "
+ "'%s'\n",
origin, q);
}
SABAOTHfreeStatus(&topdb);
@@ -554,13 +623,15 @@
pthread_mutex_unlock(&_mero_remotedb_lock);
- Mfprintf(_mero_ctlout, "served
neighbour list\n");
+ Mfprintf(_mero_ctlout, "%s: served
neighbour list\n",
+ origin);
/* because this command is multi line,
you can't
* combine it, disconnect the client */
break;
} else {
- Mfprintf(_mero_ctlerr, "unknown control
command: %s\n", p);
+ Mfprintf(_mero_ctlerr, "%s: unknown
control command: %s\n",
+ origin, p);
len = snprintf(buf2, sizeof(buf2),
"unknown command:
%s\n", p);
send(msgsock, buf2, len, 0);
@@ -568,13 +639,13 @@
}
}
close(msgsock);
- continue;
-
-error:
- Mfprintf(stderr, "%s\n", e);
} while (_mero_keep_listening);
- shutdown(sock, SHUT_RDWR);
- close(sock);
- Mfprintf(stdout, "control channel closed\n");
+ shutdown(usock, SHUT_RDWR);
+ close(usock);
+ if (tsock > 0) {
+ shutdown(tsock, SHUT_RDWR);
+ close(tsock);
+ }
+ Mfprintf(_mero_ctlout, "control channel closed\n");
}
U merovingian.c
Index: merovingian.c
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/merovingian/merovingian.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -d -r1.62 -r1.63
--- merovingian.c 22 Sep 2009 19:17:10 -0000 1.62
+++ merovingian.c 23 Sep 2009 09:46:55 -0000 1.63
@@ -433,6 +433,7 @@
int sock = -1;
int usock = -1;
int unsock = -1;
+ int csock = -1;
char doproxy = 1;
unsigned short discoveryport;
unsigned short controlport;
@@ -881,12 +882,15 @@
/* open up connections */
if (
- (e = openConnectionTCP(&sock, _mero_port)) == NO_ERR &&
+ (e = openConnectionTCP(&sock, _mero_port, stdout)) ==
NO_ERR &&
(e = openConnectionUDP(&usock, discoveryport)) ==
NO_ERR &&
- (e = openConnectionUNIX(&unsock, buf)) == NO_ERR)
+ (e = openConnectionUNIX(&unsock, buf)) == NO_ERR &&
+ (controlport == 0 || (e = openConnectionTCP(&csock,
controlport, _mero_ctlout)) == NO_ERR)
+ )
{
pthread_t ctid = 0;
pthread_t dtid = 0;
+ int csocks[2];
_mero_broadcastsock = socket(AF_INET, SOCK_DGRAM, 0);
ret = 1;
@@ -921,8 +925,10 @@
}
/* handle control commands */
+ csocks[0] = unsock;
+ csocks[1] = csock;
if (pthread_create(&ctid, NULL, (void *(*)(void
*))controlRunner,
- (void *)&unsock) < 0)
+ (void *)&csocks) < 0)
{
Mfprintf(stderr, "unable to create control command
thread\n");
ctid = 0;
U merovingian_connections.c
Index: merovingian_connections.c
===================================================================
RCS file:
/cvsroot/monetdb/sql/src/backends/monet5/merovingian/merovingian_connections.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- merovingian_connections.c 9 Sep 2009 11:48:25 -0000 1.2
+++ merovingian_connections.c 23 Sep 2009 09:46:55 -0000 1.3
@@ -18,7 +18,7 @@
*/
static err
-openConnectionTCP(int *ret, unsigned short port)
+openConnectionTCP(int *ret, unsigned short port, FILE *log)
{
struct sockaddr_in server;
int sock = -1;
@@ -75,7 +75,7 @@
/* keep queue of 5 */
listen(sock, 5);
- Mfprintf(stdout, "listening for TCP connections on %s:%hu\n", host,
port);
+ Mfprintf(log, "listening for TCP connections on %s:%hu\n", host, port);
*ret = sock;
return(NO_ERR);
------------------------------------------------------------------------------
Come build with us! The BlackBerry® Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9-12, 2009. Register now!
http://p.sf.net/sfu/devconf
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins
