| /* |
| * Copyright 1999-2004 The Apache Software Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* @version $Id$ */ |
| #include "pr_warp.h" |
| |
| wa_boolean c_check(wa_connection *conn, warp_packet *pack, apr_socket_t * sock) { |
| warp_config *conf=(warp_config *)conn->conf; |
| int maj=-1; |
| int min=-1; |
| int sid=-1; |
| |
| if (n_recv(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); |
| } |
| |
| #if APR_HAS_THREADS |
| apr_atomic_set(&conf->serv, (unsigned) sid); |
| #else |
| conf->serv = (unsigned) sid; |
| #endif |
| |
| wa_debug(WA_MARK,"Connection \"%s\" checked WARP/%d.%d (SERVER ID=%d)", |
| conn->name,maj,min,conf->serv); |
| return(wa_true); |
| } |
| |
| wa_boolean c_configure(wa_connection *conn, apr_socket_t * sock) { |
| wa_chain *elem=warp_applications; |
| apr_pool_t *pool=NULL; |
| wa_boolean ret=wa_false; |
| warp_packet *pack=NULL; |
| char *temp=NULL; |
| |
| if (apr_pool_create(&pool,wa_pool)!=APR_SUCCESS) { |
| wa_log(WA_MARK,"Cannot create WARP temporary configuration pool"); |
| n_disconnect(conn, sock); |
| return(wa_false); |
| } |
| |
| if ((pack=p_create(wa_pool))==NULL) { |
| wa_log(WA_MARK,"Cannot create WARP configuration packet"); |
| n_disconnect(conn, sock); |
| apr_pool_destroy(pool); |
| return(wa_false); |
| } |
| |
| if ((ret=c_check(conn,pack, sock))==wa_false) n_disconnect(conn, sock); |
| |
| while (elem!=NULL) { |
| wa_application *appl=(wa_application *)elem->curr; |
| |
| /* Check that the application really belongs to that connection */ |
| if (strcmp(appl->conn->name,conn->name)!=0) { |
| elem=elem->next; |
| continue; |
| } |
| |
| 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(sock,pack); |
| |
| if (n_recv(sock,pack)!=wa_true) { |
| wa_log(WA_MARK,"Cannot read packet (%s:%d)",WA_MARK); |
| n_disconnect(conn, sock); |
| return(wa_false); |
| } |
| if (pack->type==TYPE_ERROR) { |
| wa_log(WA_MARK,"Cannot deploy application %s",appl->name); |
| elem=elem->next; |
| continue; |
| } |
| if (pack->type!=TYPE_CONF_APPLIC) { |
| wa_log(WA_MARK,"Unknown packet received (%d)",pack->type); |
| p_reset(pack); |
| pack->type=TYPE_FATAL; |
| p_write_string(pack,"Invalid packet received"); |
| n_send(sock,pack); |
| n_disconnect(conn, sock); |
| } |
| p_read_int(pack,(int *)&appl->conf); |
| p_read_string(pack,&temp); |
| appl->lpth=apr_pstrdup(wa_pool,temp); |
| |
| /* Check if this web-application is local or not by checking if its |
| WEB-INF directory can be opened. */ |
| if (appl->lpth!=NULL) { |
| apr_dir_t *dir=NULL; |
| char *webinf=apr_pstrcat(wa_pool,appl->lpth,"/WEB-INF",NULL); |
| if (apr_dir_open(&dir,webinf,wa_pool)==APR_SUCCESS) { |
| if (dir!=NULL) apr_dir_close(dir); |
| else appl->lpth=NULL; |
| } else { |
| appl->lpth=NULL; |
| } |
| } |
| |
| /* If this application is local, we want to retrieve the allowed and |
| denied mapping list. */ |
| if (appl->lpth!=NULL) { |
| p_reset(pack); |
| pack->type=TYPE_CONF_MAP; |
| p_write_int(pack,(int)appl->conf); |
| n_send(sock,pack); |
| |
| while(1) { |
| if (n_recv(sock,pack)!=wa_true) { |
| wa_log(WA_MARK,"Cannot read packet (%s:%d)",WA_MARK); |
| n_disconnect(conn,sock); |
| return(wa_false); |
| } |
| if (pack->type==TYPE_CONF_MAP_DONE) { |
| wa_debug(WA_MARK,"Done mapping URLs"); |
| break; |
| } else if (pack->type==TYPE_CONF_MAP_ALLOW) { |
| char *map=NULL; |
| p_read_string(pack,&map); |
| wa_debug(WA_MARK,"Allow URL mapping \"%s\"",map); |
| } else if (pack->type==TYPE_CONF_MAP_DENY) { |
| char *map=NULL; |
| p_read_string(pack,&map); |
| wa_debug(WA_MARK,"Deny URL mapping \"%s\"",map); |
| } |
| } |
| } |
| |
| if (appl->lpth==NULL) { |
| wa_debug(WA_MARK,"Application \"%s\" deployed with id=%d (%s)", |
| appl->name,appl->conf,"remote"); |
| } else { |
| wa_debug(WA_MARK,"Application \"%s\" deployed with id=%d (%s)", |
| appl->name,appl->conf,appl->lpth); |
| } |
| |
| appl->depl=wa_true; |
| elem=elem->next; |
| } |
| |
| p_reset(pack); |
| pack->type=TYPE_CONF_DONE; |
| n_send(sock,pack); |
| |
| if (n_recv(sock,pack)!=wa_true) { |
| wa_log(WA_MARK,"Cannot read packet (%s:%d)",WA_MARK); |
| n_disconnect(conn,sock); |
| return(wa_false); |
| } |
| if (pack->type!=TYPE_CONF_PROCEED) { |
| wa_log(WA_MARK,"Cannot proceed on this connection"); |
| p_reset(pack); |
| pack->type=TYPE_FATAL; |
| p_write_string(pack,"Expected PROCEED packet not received"); |
| n_send(sock,pack); |
| n_disconnect(conn,sock); |
| return(wa_false); |
| } |
| |
| apr_pool_destroy(pool); |
| return(ret); |
| } |