-/* $Id$
- *
+/*
* Copyright (c) 1987-2009 by the citadel.org team
*
* This program is free software; you can redistribute it and/or modify
ret = CtdlIPCGenericCommand(ipc, "GETU", NULL, 0, NULL, NULL, cret);
if (ret / 100 == 2) {
- uret[0]->USscreenwidth = extract_int(cret, 0);
- uret[0]->USscreenheight = extract_int(cret, 1);
uret[0]->flags = extract_int(cret, 2);
}
return ret;
if (!uret) return -2;
if (!cret) return -2;
- sprintf(aaa, "SETU %d|%d|%d",
- uret->USscreenwidth, uret->USscreenheight,
- uret->flags);
+ sprintf(aaa,
+ "SETU 80|24|%d",
+ uret->flags
+ );
return CtdlIPCGenericCommand(ipc, aaa, NULL, 0, NULL, NULL, cret);
}
break;
case 22: strcpy(ipc->ServInfo.svn_revision, buf);
break;
+ case 24: ipc->ServInfo.guest_logins = atoi(buf);
+ break;
}
}
/* ************************************************************************** */
-/* Stuff below this line is not for public consumption */
+/* Stuff below this line is not for public consumption */
/* ************************************************************************** */
{
char buf[SIZ];
register int ret;
- int watch_ssl = 0;
if (!command) return -2;
if (!proto_response) return -2;
-#ifdef HAVE_OPENSSL
- if (ipc->ssl) watch_ssl = 1;
-#endif
-
CtdlIPC_lock(ipc);
CtdlIPC_putline(ipc, command);
while (1) {
static int tcp_connectsock(char *host, char *service)
{
struct in6_addr serveraddr;
- struct addrinfo hints, *res = NULL;
- int rc;
+ struct addrinfo hints;
+ struct addrinfo *res = NULL;
+ struct addrinfo *ai = NULL;
+ int rc = (-1);
int sock = (-1);
if ((host == NULL) || IsEmptyStr(host)) {
if (rc == 1) { /* dotted quad */
hints.ai_family = AF_INET;
hints.ai_flags |= AI_NUMERICHOST;
- } else {
+ }
+ else {
rc = inet_pton(AF_INET6, host, &serveraddr);
if (rc == 1) { /* IPv6 address */
hints.ai_family = AF_INET6;
rc = getaddrinfo(host, service, &hints, &res);
if (rc != 0) {
- // CtdlLogPrintf(CTDL_ERR, "%s: %s\n", host, gai_strerror(rc));
- return(-1);
- }
-
- sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
- if (sock < 0) {
- // CtdlLogPrintf(CTDL_ERR, "socket() failed: %s\n", strerror(errno));
return(-1);
}
/*
* Try all available addresses until we connect to one or until we run out.
*/
- struct addrinfo *ai;
for (ai = res; ai != NULL; ai = ai->ai_next) {
- /* FIXME display the address to which we are trying to connect */
- rc = connect(sock, res->ai_addr, res->ai_addrlen);
+ sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (sock < 0) return(-1);
+
+ rc = connect(sock, ai->ai_addr, ai->ai_addrlen);
if (rc >= 0) {
- return(sock);
+ return(sock); /* Connected! */
}
else {
- // CtdlLogPrintf(CTDL_ERR, "connect() failed: %s\n", strerror(errno));
+ close(sock); /* Failed. Close the socket to avoid fd leak! */
}
}
static void CtdlIPC_init_OpenSSL(void)
{
int a;
- SSL_METHOD *ssl_method;
+ const SSL_METHOD *ssl_method;
DH *dh;
/* already done init */
ReadNetworkChunk(CtdlIPC* ipc)
{
fd_set read_fd;
- int tries;
+/* int tries;*/
int ret = 0;
int err = 0;
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 1000;
- tries = 0;
+ /*tries = 0; */
n = 0;
while (1)
{
/* If we're using a unix domain socket we can do a bunch of stuff */
if (!strcmp(cithost, UDS)) {
if (!strcasecmp(citport, DEFAULT_PORT)) {
- snprintf(sockpath, sizeof sockpath, file_citadel_socket);
+ snprintf(sockpath, sizeof sockpath, "%s", file_citadel_socket);
}
else {
snprintf(sockpath, sizeof sockpath, "%s/%s", citport, "citadel.socket");
}
if (hostbuf != NULL) strcpy(hostbuf, cithost);
if (portbuf != NULL) strcpy(portbuf, sockpath);
+ strcpy(ipc->ip_hostname, "");
+ strcpy(ipc->ip_address, "");
return ipc;
}
ifree(ipc);
return 0;
}
+
+
+ /* Learn the actual network identity of the host to which we are connected */
+
+ struct sockaddr_in6 clientaddr;
+ unsigned int addrlen = sizeof(clientaddr);
+
+ ipc->ip_hostname[0] = 0;
+ ipc->ip_address[0] = 0;
+
+ getpeername(ipc->sock, (struct sockaddr *)&clientaddr, &addrlen);
+ getnameinfo((struct sockaddr *)&clientaddr, addrlen,
+ ipc->ip_hostname, sizeof ipc->ip_hostname, NULL, 0, 0
+ );
+ getnameinfo((struct sockaddr *)&clientaddr, addrlen,
+ ipc->ip_address, sizeof ipc->ip_address, NULL, 0, NI_NUMERICHOST
+ );
+
+ /* stuff other things elsewhere */
+
if (hostbuf != NULL) strcpy(hostbuf, cithost);
if (portbuf != NULL) strcpy(portbuf, citport);
return ipc;