You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by pi...@apache.org on 2001/07/15 10:39:59 UTC
cvs commit: jakarta-tomcat-connectors/webapp/lib pr_warp.c wa_request.c
pier 01/07/15 01:39:58
Modified: webapp/lib pr_warp.c wa_request.c
Log:
Modified WARP provider to avoid storing WARP HOST IDs (redundant) and new
configuration scheme.
Revision Changes Path
1.6 +332 -73 jakarta-tomcat-connectors/webapp/lib/pr_warp.c
Index: pr_warp.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/webapp/lib/pr_warp.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- pr_warp.c 2001/07/13 02:19:44 1.5
+++ pr_warp.c 2001/07/15 08:39:58 1.6
@@ -37,8 +37,7 @@
* *
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY *
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL *
- * THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY *
+2 * THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY *
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
@@ -55,7 +54,7 @@
* *
* ========================================================================= */
-/* @version $Id: pr_warp.c,v 1.5 2001/07/13 02:19:44 pier Exp $ */
+/* @version $Id: pr_warp.c,v 1.6 2001/07/15 08:39:58 pier Exp $ */
#include <wa.h>
/* ************************************************************************* */
@@ -63,83 +62,350 @@
/* ************************************************************************* */
/* The WARP connection configuration structure */
-typedef struct warp_cconfig {
+typedef struct warp_config {
apr_sockaddr_t *addr;
apr_socket_t *sock;
- wa_boolean disc;
-} warp_cconfig;
+ int serv;
+} warp_config;
-/* The WARP application configuration structure */
-typedef struct warp_aconfig {
- int host;
- int appl;
- wa_boolean depl;
-} warp_aconfig;
+/* The WARP packet structure */
+typedef struct warp_packet {
+ apr_pool_t *pool;
+ int type;
+ int size;
+ int curr;
+ char buff[65536];
+} warp_packet;
+
+/* WARP definitions */
+#define VERS_MAJOR 0
+#define VERS_MINOR 9
+
+#define TYPE_INVALID -1
+#define TYPE_ERROR 0x00
+#define TYPE_FATAL 0xff
+
+#define TYPE_CONF_WELCOME 0x01
+#define TYPE_CONF_DEPLOY 0x02
+#define TYPE_CONF_APPLIC 0x03
+#define TYPE_CONF_DONE 0x04
+
/* The list of all configured connections */
static wa_chain *warp_connections=NULL;
+/* The list of all deployed connections */
+static wa_chain *warp_applications=NULL;
/* This provider */
wa_provider wa_provider_warp;
/* ************************************************************************* */
+/* PACKET FUNCTIONS */
+/* ************************************************************************* */
+static void p_reset(warp_packet *pack) {
+ pack->type=TYPE_INVALID;
+ pack->type=TYPE_INVALID;
+ pack->size=0;
+ pack->curr=0;
+ pack->buff[0]='\0';
+}
+
+static warp_packet *p_create(apr_pool_t *pool) {
+ warp_packet *pack=NULL;
+
+ if (pool==NULL) return(NULL);
+ pack=(warp_packet *)apr_palloc(pool,sizeof(warp_packet));
+ pack->pool=pool;
+ p_reset(pack);
+ return(pack);
+}
+
+static wa_boolean p_read_ushort(warp_packet *pack, int *x) {
+ int k=0;
+
+ if ((pack->curr+2)>=pack->size) return(wa_false);
+ k=(pack->buff[pack->curr++]&0x0ff)<<8;
+ k=k|(pack->buff[pack->curr++]&0x0ff);
+ *x=k;
+ return(wa_true);
+}
+
+static wa_boolean p_read_int(warp_packet *pack, int *x) {
+ int k=0;
+
+ if ((pack->curr+2)>=pack->size) return(wa_false);
+ k=(pack->buff[pack->curr++]&0x0ff)<<24;
+ k=k|((pack->buff[pack->curr++]&0x0ff)<<16);
+ k=k|((pack->buff[pack->curr++]&0x0ff)<<8);
+ k=k|(pack->buff[pack->curr++]&0x0ff);
+ *x=k;
+ return(wa_true);
+}
+
+static wa_boolean p_read_string(warp_packet *pack, char **x) {
+ int len=0;
+
+ if (p_read_ushort(pack,&len)==wa_false) {
+ *x=NULL;
+ return(wa_false);
+ }
+ if ((pack->curr+len)>=pack->size) {
+ *x=NULL;
+ return(wa_false);
+ }
+
+ *x=(char *)apr_palloc(pack->pool,(len+1)*sizeof(char));
+ if (*x==NULL) return(wa_false);
+
+ apr_cpystrn(*x,&pack->buff[pack->curr],len);
+ pack->curr+=len;
+ return(wa_true);
+}
+
+static wa_boolean p_write_ushort(warp_packet *pack, int x) {
+ if (pack->size>65533) return(wa_false);
+ pack->buff[pack->size++]=(x>>8)&0x0ff;
+ pack->buff[pack->size++]=x&0x0ff;
+ return(wa_true);
+}
+
+static wa_boolean p_write_int(warp_packet *pack, int x) {
+ if (pack->size>65531) return(wa_false);
+ pack->buff[pack->size++]=(x>>24)&0x0ff;
+ pack->buff[pack->size++]=(x>>16)&0x0ff;
+ pack->buff[pack->size++]=(x>>8)&0x0ff;
+ pack->buff[pack->size++]=x&0x0ff;
+ return(wa_true);
+}
+
+static wa_boolean p_write_string(warp_packet *pack, char *x) {
+ int len=0;
+ char *k=NULL;
+ int q=0;
+
+ if (x==NULL) return(p_write_ushort(pack,0));
+ for (k=x; k[0]!='\0'; k++);
+ len=k-x;
+ if (p_write_ushort(pack,len)==wa_false) {
+ pack->size-=2;
+ return(wa_false);
+ }
+ if ((pack->size+len)>65535) {
+ pack->size-=2;
+ return(wa_false);
+ }
+ for (q=0;q<len;q++) pack->buff[pack->size++]=x[q];
+ return(wa_true);
+}
+
+/* ************************************************************************* */
/* NETWORK FUNCTIONS */
/* ************************************************************************* */
+static wa_boolean n_recv(apr_socket_t *sock, warp_packet *pack) {
+ apr_size_t len=0;
+ char hdr[3];
+ int ptr=0;
+
+ if (sock==NULL) return(wa_false);
+ if (pack==NULL) return(wa_false);
+
+ p_reset(pack);
+ len=3;
+ while(1) {
+ if (apr_recv(sock,&hdr[ptr],&len)!=APR_SUCCESS) return(wa_false);
+ ptr+=len;
+ len=3-ptr;
+ if (len==0) break;
+ }
+ pack->type=((int)hdr[0])&0x0ff;
+ pack->size=(hdr[1]&0x0ff)<<8;
+ pack->size=pack->size|(hdr[2]&0x0ff);
+
+ len=pack->size;
+ ptr=0;
+ while(1) {
+ if (apr_recv(sock,&pack->buff[ptr],&len)!=APR_SUCCESS)
+ return(wa_false);
+ ptr+=len;
+ len=pack->size-ptr;
+ if (len==0) break;
+ }
+
+ wa_debug(WA_MARK,"WARP <<< TYP=%d LEN=%d",pack->type,pack->size);
+
+ return(wa_true);
+}
+
+static wa_boolean n_send(apr_socket_t *sock, warp_packet *pack) {
+ apr_size_t len=0;
+ char hdr[3];
+ int ptr=0;
+
+ if (sock==NULL) return(wa_false);
+ if (pack==NULL) return(wa_false);
+
+ hdr[0]=(char)(pack->type&0x0ff);
+ hdr[1]=(char)((pack->size>>8)&0x0ff);
+ hdr[2]=(char)(pack->size&0x0ff);
+
+ len=3;
+ while(1) {
+ if (apr_send(sock,&hdr[ptr],&len)!=APR_SUCCESS) return(wa_false);
+ ptr+=len;
+ len=3-ptr;
+ if (len==0) break;
+ }
+
+ len=pack->size;
+ ptr=0;
+ while(1) {
+ if (apr_send(sock,&pack->buff[ptr],&len)!=APR_SUCCESS)
+ return(wa_false);
+ ptr+=len;
+ len=pack->size-ptr;
+ if (len==0) break;
+ }
+
+ wa_debug(WA_MARK,"WARP >>> TYP=%d LEN=%d",pack->type,pack->size);
+
+ p_reset(pack);
+ return(wa_true);
+}
+
/* Attempt to connect to the remote endpoint of the WARP connection (if not
done already). */
static wa_boolean n_connect(wa_connection *conn) {
- warp_cconfig *conf=(warp_cconfig *)conn->conf;
+ warp_config *conf=(warp_config *)conn->conf;
apr_status_t ret=APR_SUCCESS;
/* Create the APR socket if that has not been yet created */
- if (conf->sock==NULL) {
- ret=apr_socket_create(&conf->sock,AF_INET,SOCK_STREAM,wa_pool);
- if (ret!=APR_SUCCESS) {
- conf->sock=NULL;
- wa_debug(WA_MARK,"Cannot create socket for \"%s\"",conn->name);
- return(FALSE);
- }
+ if (conf->sock!=NULL) {
+ wa_debug(WA_MARK,"Connection \"%s\" already opened",conn->conf);
+ return(wa_true);
}
+ ret=apr_socket_create(&conf->sock,AF_INET,SOCK_STREAM,wa_pool);
+ if (ret!=APR_SUCCESS) {
+ conf->sock=NULL;
+ wa_log(WA_MARK,"Cannot create socket for conn. \"%s\"",conn->name);
+ return(wa_false);
+ }
+
/* Attempt to connect to the remote endpoint */
- if (conf->disc) {
- ret=apr_connect(conf->sock, conf->addr);
- if (ret!=APR_SUCCESS) {
- conf->disc=TRUE;
- wa_debug(WA_MARK,"Connection \"%s\" cannot connect",conn->name);
- return(FALSE);
- } else {
- conf->disc=FALSE;
- return(TRUE);
- }
+ ret=apr_connect(conf->sock, conf->addr);
+ if (ret!=APR_SUCCESS) {
+ apr_shutdown(conf->sock,APR_SHUTDOWN_READWRITE);
+ conf->sock=NULL;
+ wa_log(WA_MARK,"Connection \"%s\" cannot connect",conn->name);
+ return(wa_false);
}
- /* We were already connected */
- return(TRUE);
+ return(wa_true);
}
/* Attempt to disconnect a connection if connected. */
static void n_disconnect(wa_connection *conn) {
- warp_cconfig *conf=(warp_cconfig *)conn->conf;
+ warp_config *conf=(warp_config *)conn->conf;
apr_status_t ret=APR_SUCCESS;
wa_debug(WA_MARK,"Disconnecting \"%s\"",conn->name);
/* Create the APR socket if that has not been yet created */
if (conf->sock==NULL) return;
- if (conf->disc) return;
/* Shutdown and close the socket (ignoring errors) */
ret=apr_shutdown(conf->sock,APR_SHUTDOWN_READWRITE);
if (ret!=APR_SUCCESS)
- wa_debug(WA_MARK,"Cannot shutdown \"%s\"",conn->name);
+ wa_log(WA_MARK,"Cannot shutdown \"%s\"",conn->name);
ret=apr_socket_close(conf->sock);
if (ret!=APR_SUCCESS)
- wa_debug(WA_MARK,"Cannot close \"%s\"",conn->name);
+ wa_log(WA_MARK,"Cannot close \"%s\"",conn->name);
/* Reset the state */
conf->sock=NULL;
- conf->disc=TRUE;
+}
+
+static wa_boolean n_check(wa_connection *conn, warp_packet *pack) {
+ warp_config *conf=(warp_config *)conn->conf;
+ int maj=-1;
+ int min=-1;
+ int sid=-1;
+
+ if (n_recv(conf->sock,pack)!=wa_true) {
+ wa_log(WA_MARK,"Cannot receive handshake WARP packet");
+ return(wa_false);
+ }
+
+ if (pack->type!=TYPE_CONF_WELCOME) {
+ wa_log(WA_MARK,"Invalid WARP packet %d (WELCOME)",pack->type);
+ return(wa_false);
+ }
+
+ if (p_read_ushort(pack,&maj)!=wa_true) {
+ wa_log(WA_MARK,"Cannot read major version");
+ return(wa_false);
+ }
+
+ if (p_read_ushort(pack,&min)!=wa_true) {
+ wa_log(WA_MARK,"Cannot read minor version");
+ return(wa_false);
+ }
+
+ if ((maj!=VERS_MAJOR)||(min!=VERS_MINOR)) {
+ wa_log(WA_MARK,"Invalid WARP protocol version %d.%d",maj,min);
+ return(wa_false);
+ }
+
+ if (p_read_int(pack,&sid)!=wa_true) {
+ wa_log(WA_MARK,"Cannot read server id");
+ return(wa_false);
+ }
+
+ conf->serv=sid;
+ wa_debug(WA_MARK,"Connection \"%s\" checked WARP/%d.%d (SERVER ID=%d)",
+ conn->name,maj,min,conf->serv);
+ return(wa_true);
+}
+
+static wa_boolean n_configure(wa_connection *conn) {
+ warp_config *conf=(warp_config *)conn->conf;
+ wa_chain *elem=warp_applications;
+ apr_pool_t *pool=NULL;
+ wa_boolean ret=wa_false;
+ warp_packet *pack=NULL;
+
+ if (apr_pool_create(&pool,wa_pool)!=APR_SUCCESS) {
+ wa_log(WA_MARK,"Cannot create WARP temporary configuration pool");
+ n_disconnect(conn);
+ return(wa_false);
+ }
+
+ if ((pack=p_create(wa_pool))==NULL) {
+ wa_log(WA_MARK,"Cannot create WARP configuration packet");
+ apr_pool_destroy(pool);
+ return(wa_false);
+ }
+
+ if ((ret=n_check(conn,pack))==wa_false) n_disconnect(conn);
+
+ while (elem!=NULL) {
+ wa_application *appl=(wa_application *)elem->curr;
+ wa_debug(WA_MARK,"Deploying \"%s\" via \"%s\" in \"http://%s:%d%s\"",
+ appl->name,conn->name,appl->host->name,appl->host->port,
+ appl->rpth);
+ p_reset(pack);
+ pack->type=TYPE_CONF_DEPLOY;
+ p_write_string(pack,appl->name);
+ p_write_string(pack,appl->host->name);
+ p_write_ushort(pack,appl->host->port);
+ p_write_string(pack,appl->rpth);
+ n_send(conf->sock,pack);
+
+ elem=elem->next;
+ }
+
+ apr_pool_destroy(pool);
+ return(ret);
}
/* ************************************************************************* */
@@ -155,14 +421,15 @@
/* Notify this provider of its imminent startup. */
static void warp_startup(void) {
wa_chain *elem=warp_connections;
- wa_boolean ret=FALSE;
/* Open all connections having deployed applications */
while (elem!=NULL) {
wa_connection *curr=(wa_connection *)elem->curr;
wa_debug(WA_MARK,"Opening connection \"%s\"",curr->name);
- if (n_connect(curr)==TRUE) {
+ if (n_connect(curr)==wa_true) {
wa_debug(WA_MARK,"Connection \"%s\" opened",curr->name);
+ if (n_configure(curr)==wa_true)
+ wa_debug(WA_MARK,"Connection \"%s\" configured",curr->name);
} else wa_log(WA_MARK,"Cannot open connection \"%s\"",curr->name);
elem=elem->next;
}
@@ -179,13 +446,13 @@
configuration file. */
static const char *warp_connect(wa_connection *conn, const char *param) {
apr_status_t r=APR_SUCCESS;
- warp_cconfig *conf=NULL;
+ warp_config *conf=NULL;
apr_port_t port=0;
char *addr=NULL;
char *scop=NULL;
/* Allocation and checking */
- conf=(warp_cconfig *)apr_palloc(wa_pool,sizeof(warp_cconfig));
+ conf=(warp_config *)apr_palloc(wa_pool,sizeof(warp_config));
if (conf==NULL) return("Cannot allocate connection configuration");
/* Check and parse parameter */
@@ -202,7 +469,7 @@
/* Done */
conf->sock=NULL;
- conf->disc=TRUE;
+ conf->serv=0;
conn->conf=conf;
return(NULL);
}
@@ -211,21 +478,14 @@
static const char *warp_deploy(wa_application *appl) {
wa_chain *elem=warp_connections;
wa_connection *conn=appl->conn;
- warp_aconfig *conf=NULL;
- conf=(warp_aconfig *)apr_palloc(wa_pool,sizeof(warp_aconfig));
- if (conf==NULL) return("Cannot allocate application configuration");
- conf->host=-1;
- conf->appl=-1;
- conf->depl=FALSE;
+ /* Integer configuration -1 equals application not deployed */
+ appl->conf=(void *)-1;
- appl->conf=conf;
-
/* Check if the connection specified in this application has already
been stored in our local array of connections */
while (elem!=NULL) {
- wa_connection *curr=(wa_connection *)elem->curr;
- if (strcasecmp(conn->name,curr->name)==0) break;
+ if (conn==elem->curr) break;
elem=elem->next;
}
if (elem==NULL) {
@@ -235,12 +495,26 @@
warp_connections=elem;
}
+ /* Check if this application has already been stored in our local array of
+ applications */
+ elem=warp_applications;
+ while (elem!=NULL) {
+ if (appl==elem->curr) break;
+ elem=elem->next;
+ }
+ if (elem==NULL) {
+ elem=(wa_chain *)apr_palloc(wa_pool,sizeof(wa_chain));
+ elem->curr=appl;
+ elem->next=warp_applications;
+ warp_applications=elem;
+ }
+
return(NULL);
}
/* Describe the configuration member found in a connection. */
static char *warp_conninfo(wa_connection *conn, apr_pool_t *pool) {
- warp_cconfig *conf=(warp_cconfig *)conn->conf;
+ warp_config *conf=(warp_config *)conn->conf;
apr_port_t port=0;
char *addr=NULL;
char *name=NULL;
@@ -253,32 +527,17 @@
apr_sockaddr_ip_get(&addr,conf->addr);
apr_getnameinfo(&name,conf->addr,0);
- if (conf->sock==NULL) mesg="Socket not initialized";
- else {
- if (conf->disc) mesg="Socket disconnected";
- else mesg="Socket connected";
- }
+ if (conf->sock==NULL) mesg="Not Connected";
+ else mesg="Connected";
- buff=apr_psprintf(pool,"Host: %s Port:%d Address:%s (%s)",
- name,port,addr,mesg);
+ buff=apr_psprintf(pool,"Host: %s Port:%d Address:%s (%s) Server ID: %d",
+ name,port,addr,mesg,conf->serv);
return(buff);
}
/* Describe the configuration member found in a web application. */
static char *warp_applinfo(wa_application *appl, apr_pool_t *pool) {
- warp_aconfig *conf=(warp_aconfig *)appl->conf;
- char *h=NULL;
- char *a=NULL;
-
- if (conf==NULL) return("Invalid configuration member");
-
- if (conf->host<0) h="(Not initialized)";
- else h=apr_psprintf(pool,"%d",conf->host);
-
- if (conf->appl<0) a="(Not initialized)";
- else a=apr_psprintf(pool,"%d",conf->appl);
-
- return(apr_psprintf(pool,"Application ID: %s Host ID: %s",a,h));
+ return(apr_psprintf(pool,"Application ID: %d",(int)(appl->conf)));
}
/* Handle a connection from the web server. */
1.12 +3 -3 jakarta-tomcat-connectors/webapp/lib/wa_request.c
Index: wa_request.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/webapp/lib/wa_request.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- wa_request.c 2001/07/09 22:02:10 1.11
+++ wa_request.c 2001/07/15 08:39:58 1.12
@@ -55,7 +55,7 @@
* *
* ========================================================================= */
-/* @version $Id: wa_request.c,v 1.11 2001/07/09 22:02:10 pier Exp $ */
+/* @version $Id: wa_request.c,v 1.12 2001/07/15 08:39:58 pier Exp $ */
#include <wa.h>
/* Allocate a new request structure. */
@@ -123,7 +123,7 @@
/* Dump headers for wa_rerror */
-static int wa_rerror_headers(void *d, const char *key, const char *val) {
+static int headers(void *d, const char *key, const char *val) {
wa_request *r=(wa_request *)d;
wa_rprintf(r," <dd>%s: %s</dd>\n",key,val);
@@ -178,7 +178,7 @@
wa_rprintf(r," <dd>Request Authentication Mech.: \"%s\"</dd>\n",r->auth);
wa_rprintf(r," <dd>Request Content-Length: \"%d\"</dd>\n",r->clen);
wa_rprintf(r," <dt>Your Headers:</dt>\n");
- apr_table_do(wa_rerror_headers,r,r->hdrs,NULL);
+ apr_table_do(headers,r,r->hdrs,NULL);
wa_rprintf(r," </dl>\n");
wa_rprintf(r," <hr>\n");
wa_rprintf(r," </body>\n");