You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by hg...@apache.org on 2001/05/03 16:43:38 UTC

cvs commit: jakarta-tomcat/proposals/web-connector/native/netscape Makefile.nw Makefile.solaris jk_nsapi_plugin.c nsapi.dsp nsapi.dsw

hgomez      01/05/03 07:43:38

  Added:       proposals/web-connector/native/netscape Makefile.nw
                        Makefile.solaris jk_nsapi_plugin.c nsapi.dsp
                        nsapi.dsw
  Log:
  Netscape/IPlanet stuff
  
  Revision  Changes    Path
  1.1                  jakarta-tomcat/proposals/web-connector/native/netscape/Makefile.nw
  
  Index: Makefile.nw
  ===================================================================
  .SILENT:
  
  NLM_NAME=nsapi_rd
  
  JDKPATH=k:\jdk\jdk-1_2_2
  NOVELLNDK=r:\nwsdk
  NSSDK=r:\netscape
  METROWERKSPATH=k:\mw\5.3
  
  CC=$(METROWERKSPATH)\bin\mwccnlm
  LINK=$(METROWERKSPATH)\bin\mwldnlm
  
  JK_OBJS=\
  	jk_ajp12_worker.obj \
  	jk_ajp13_worker.obj \
  	jk_ajp13.obj \
  	jk_connect.obj \
  	jk_jni_worker.obj \
  	jk_lb_worker.obj \
  	jk_map.obj \
  	jk_msg_buff.obj \
  	jk_nsapi_plugin.obj \
  	jk_pool.obj \
  	jk_sockbuf.obj \
  	jk_uri_worker_map.obj \
  	jk_util.obj \
  	jk_worker.obj \
  	jk_nwmain.obj \
  	
  all: $(NLM_NAME).nlm
  
  $(NLM_NAME).nlm: $(JK_OBJS) link.opt
  	@echo Linking $@
  	@$(LINK) @link.opt
  
  %.obj: %.c cc.opt
  	@echo Compiling $<
  	@$(CC) $< -o=$(@F) @cc.opt
  	
  
  %.obj: ../common/%.c cc.opt
  	@echo Compiling $<
  	@$(CC) $< -o=$(@F) @cc.opt
  	
  
  cc.opt: Makefile.nw
  	-@del cc.opt 2> NUL
  	@echo Generating $@
  	@echo -nosyspath -ext obj -c -align 1 -w nocmdline -bool on >> $@
  ifdef DEBUG
  	@echo -g >> $@
  endif
  	@echo -I$(NOVELLNDK)\include\nlm >> $@
  	@echo -I$(NOVELLNDK)\include >> $@
  	@echo -I$(NSSDK)\include >> $@
  	@echo -I. >> $@
  	@echo -I..\common >> $@
  	@echo -I$(METROWERKSPATH)\include >> $@
  	@echo -I$(JDKPATH)\include >> $@
  	@echo -I$(JDKPATH)\include\netware >> $@
  	@echo -DN_PLAT_NLM >> $@
  	@echo -DNETWARE >> $@
  	@echo -DXP_NETWARE >> $@
  	
  link.opt: Makefile.nw
  	-@del link.opt 2> NUL
  	-@del link.def 2> NUL
  	@echo -warnings off >> $@
  	@echo -zerobss >> $@
  	@echo -desc "Netscape Plugin for Tomcat" >> $@
  	@echo -o $(NLM_NAME).nlm >> $@
  	@echo -screenname "System Console" >> $@
  	@echo -nlmversion 0,1,0 >> $@
  ifdef DEBUG
  	@echo -g >> $@
  	@echo -sym internal >> $@
  	@echo -sym codeview4 >> $@
  	@echo -osym $(NLM_NAME).sym >> $@
  endif
  	@echo -nodefaults >> $@
  	@echo -map $(NLM_NAME).map >> $@
  	@echo -threadname "NSTomcat Thread" >> $@
  	@echo -stacksize 64000 >> $@
  	@echo $(METROWERKSPATH)\lib\nwpre.obj $(strip $(JK_OBJS)) >> $@
  	@echo -commandfile link.def >> $@
  	@echo module nsapi >> link.def
  	@echo Import @$(NOVELLNDK)\imports\clib.imp >> link.def
  	@echo Import @$(NOVELLNDK)\imports\lib0.imp >> link.def
  	@echo Import @$(NOVELLNDK)\imports\nlmlib.imp >> link.def
  	@echo Import @$(NOVELLNDK)\imports\threads.imp >> link.def
  	@echo Import @$(NOVELLNDK)\imports\socklib.imp >> link.def
  	@echo Import @$(NSSDK)\imports\nsapi.imp >> link.def
  	@echo Export jk_init, jk_service >> link.def
  
  clean:
  	-@del *.obj 2> NUL
  	-@del *.map 2> NUL
  	-@del link.* 2> NUL
  	-@del cc.opt 2> NUL
  	-@del *.nlm 2> NUL
  	-@del *.sym 2> NUL
  	
  
  
  
  1.1                  jakarta-tomcat/proposals/web-connector/native/netscape/Makefile.solaris
  
  Index: Makefile.solaris
  ===================================================================
  # Defines for example NSAPI programs running under SOLARIS
  
  CC_CMD=gcc -DNET_SSL -DSOLARIS -D_REENTRANT
  LD_SHAREDCMD=ld -G
  
  all:
  prepare:
  
  OS_TYPE=solaris
  INCLUDEDIR=$(SUITSPOT_HOME)/include
  JAVA_INCLUDE=$(JAVA_HOME)/include
  
  JK_OBJS = jk_ajp12_worker.o jk_lb_worker.o jk_sockbuf.o jk_connect.o jk_map.o \
  jk_uri_worker_map.o jk_nsapi_plugin.o jk_util.o jk_jni_worker.o \
  jk_pool.o jk_worker.o
  
  INCLUDE_FLAGS=-I$(INCLUDEDIR) -I$(INCLUDEDIR)/base -I$(INCLUDEDIR)/frame -I$(JAVA_INCLUDE) -I$(JAVA_INCLUDE)/$(OS_TYPE)
  COMMON_DEFS=-DMCC_HTTPD -DXP_UNIX -DSPAPI20 -DSOLARIS -Wall
  
  
  all: nsapi_redirector.so 
  
  
  nsapi_redirector.so: $(JK_OBJS)
  	$(MAKE) prepare
  	$(LD_SHAREDCMD) $(JK_OBJS) -o nsapi_redirector.so $(EXTRA_LDDEFINES)
  
  .c.o:
  	$(CC_CMD) $(COMMON_DEFS) $(INCLUDE_FLAGS) -c $< 
  
  clean:
  	rm $(JK_OBJS)
  
  
  
  1.1                  jakarta-tomcat/proposals/web-connector/native/netscape/jk_nsapi_plugin.c
  
  Index: jk_nsapi_plugin.c
  ===================================================================
  /*
   * Copyright (c) 1997-1999 The Java Apache Project.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *
   * 4. The names "Apache JServ", "Apache JServ Servlet Engine" and 
   *    "Java Apache Project" must not be used to endorse or promote products 
   *    derived from this software without prior written permission.
   *
   * 5. Products derived from this software may not be called "Apache JServ"
   *    nor may "Apache" nor "Apache JServ" appear in their names without 
   *    prior written permission of the Java Apache Project.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *    
   * THIS SOFTWARE IS PROVIDED BY THE JAVA APACHE PROJECT "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 JAVA APACHE PROJECT 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)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Java Apache Group. For more information
   * on the Java Apache Project and the Apache JServ Servlet Engine project,
   * please see <http://java.apache.org/>.
   *
   */
  
  /***************************************************************************
   * Description: NSAPI plugin for Netscape servers                          *
   * Author:      Gal Shachor <sh...@il.ibm.com>                           *
   * Version:     $Revision: 1.1 $                                               *
   ***************************************************************************/
  
  
  #include "jk_global.h"
  #include "jk_util.h"
  #include "jk_map.h"
  #include "jk_pool.h"
  #include "jk_service.h"
  #include "jk_worker.h"
  #include "jk_ajp12_worker.h"
  
  #include "nsapi.h"
  
  #define URI_PATTERN "path"
  
  struct nsapi_private_data {
      jk_pool_t p;
      
      int request_started;
  
      pblock *pb;
      Session *sn;
      Request *rq;
  };
  typedef struct nsapi_private_data nsapi_private_data_t;
  
  static int init_on_other_thread_is_done = JK_FALSE;
  static int init_on_other_thread_is_ok = JK_FALSE;
  
  static jk_logger_t *logger = NULL;
  
  static int JK_METHOD start_response(jk_ws_service_t *s,
                                      int status,
                                      const char *reason,
                                      const char * const *header_names,
                                      const char * const *header_values,
                                      unsigned num_of_headers);
  
  static int JK_METHOD ws_read(jk_ws_service_t *s,
                               void *b,
                               unsigned l,
                               unsigned *a);
  
  static int JK_METHOD ws_write(jk_ws_service_t *s,
                                const void *b,
                                unsigned l);
  
  NSAPI_PUBLIC int jk_init(pblock *pb, 
                           Session *sn, 
                           Request *rq);
  
  NSAPI_PUBLIC void jk_term(void *p);
  
  NSAPI_PUBLIC int jk_service(pblock *pb,
                              Session *sn,
                              Request *rq);
  
  static int init_ws_service(nsapi_private_data_t *private_data,
                             jk_ws_service_t *s);
  
  static int setup_http_headers(nsapi_private_data_t *private_data,
                                jk_ws_service_t *s);
  
  static void init_workers_on_other_threads(void *init_d) 
  {
      jk_map_t *init_map = (jk_map_t *)init_d;
      if(wc_open(init_map, logger)) {
          init_on_other_thread_is_ok = JK_TRUE;
      } else {
          jk_log(logger, JK_LOG_EMERG, "In init_workers_on_other_threads, failed\n");
      }
  
      init_on_other_thread_is_done = JK_TRUE;
  }
  
  static int JK_METHOD start_response(jk_ws_service_t *s,
                                      int status,
                                      const char *reason,
                                      const char * const *header_names,
                                      const char * const *header_values,
                                      unsigned num_of_headers)
  {
      if(s && s->ws_private) {
          nsapi_private_data_t *p = s->ws_private;
          if(!p->request_started) {
              unsigned i;
  
              p->request_started = JK_TRUE;
  
              /* Remove "old" content type */
              param_free(pblock_remove("content-type", p->rq->srvhdrs));
  
              if(num_of_headers) {
                  for (i = 0 ; i < (int)num_of_headers ; i++) {
                      pblock_nvinsert(header_names[i],
                                      header_values[i],
                                      p->rq->srvhdrs);    
                  }
              } else {
                  pblock_nvinsert("content-type",
                                  "text/plain",
                                  p->rq->srvhdrs);    
              }
  
              protocol_status(p->sn,
                              p->rq,
                              status,
                              (char *)reason);
  
              protocol_start_response(p->sn, p->rq);
          }
          return JK_TRUE;
  
      }
      return JK_FALSE;
  }
  
  static int JK_METHOD ws_read(jk_ws_service_t *s,
                               void *b,
                               unsigned l,
                               unsigned *a)
  {
      if(s && s->ws_private && b && a) {
          nsapi_private_data_t *p = s->ws_private;
          
          *a = 0;
          if(l) {
              char *buf = b;
              unsigned i;
              netbuf *inbuf = p->sn->inbuf;
  
  /* Until we get a service pack for NW5.1 and earlier that has the latest */
  /* Enterprise Server, we have to go through the else version of this code*/
  #if defined(netbuf_getbytes) && !defined(NETWARE) 
              i = netbuf_getbytes(inbuf, b, l);
              if(NETBUF_EOF == i || NETBUF_ERROR == i) {
                  return JK_FALSE;
              }
  
  #else 
              int ch;
              for(i = 0 ; i < l ; i++) {
                  ch = netbuf_getc(inbuf);           
                  /*
                   * IO_EOF is 0 (zero) which is a very reasonable byte
                   * when it comes to binary data. So we are not breaking 
                   * out of the read loop when reading it.
                   *
                   * We are protected from an infinit loop by the Java part of
                   * Tomcat.
                   */
                  if(IO_ERROR == ch) {
                      break;
                  }
  
                  buf[i] = ch;
              }
  
              if(0 == i) {
                  return JK_FALSE;
              }
  #endif
              *a = i;
  
          }
          return JK_TRUE;
      }
      return JK_FALSE;
  }
  
  static int JK_METHOD ws_write(jk_ws_service_t *s,
                                const void *b,
                                unsigned l)
  {
      if(s && s->ws_private && b) {
          nsapi_private_data_t *p = s->ws_private;
  
          if(l) {
              if(!p->request_started) {
                  start_response(s, 200, NULL, NULL, NULL, 0);
              }
  
              if(net_write(p->sn->csd, (char *)b, (int)l) == IO_ERROR) {
                  return JK_FALSE;
              }
          }
  
          return JK_TRUE;
  
      }
      return JK_FALSE;
  }
  
  NSAPI_PUBLIC int jk_init(pblock *pb, 
                           Session *sn, 
                           Request *rq)
  {
      char *worker_prp_file = pblock_findval(JK_WORKER_FILE_TAG, pb); 
      char *log_level_str = pblock_findval(JK_LOG_LEVEL_TAG, pb); 
      char *log_file = pblock_findval(JK_LOG_FILE_TAG, pb); 
  
      int rc = REQ_ABORTED;
      jk_map_t *init_map;
  
      fprintf(stderr, "In jk_init %s %s %s\n",worker_prp_file, log_level_str,  log_file);
      if(!worker_prp_file) {
          worker_prp_file = JK_WORKER_FILE_DEF;
      }
  
      if(!log_level_str) {
          log_level_str = JK_LOG_LEVEL_DEF;
      }    
      
      if(!jk_open_file_logger(&logger, log_file, 
                              jk_parse_log_level(log_level_str))) {
          logger = NULL;
      }
  
      if(map_alloc(&init_map)) {
          if(map_read_properties(init_map, worker_prp_file)) {
              int sleep_cnt;
              SYS_THREAD s;
              
              s = systhread_start(SYSTHREAD_DEFAULT_PRIORITY, 
                                  0, 
                                  init_workers_on_other_threads, 
                                  init_map);
              for(sleep_cnt = 0 ; sleep_cnt < 60 ; sleep_cnt++) {
                  systhread_sleep(1000);
                  jk_log(logger, JK_LOG_DEBUG, "jk_init, a second passed\n");
                  if(init_on_other_thread_is_done) {
                      break;
                  }
              }
  
              if(init_on_other_thread_is_done &&
                 init_on_other_thread_is_ok) {
                  magnus_atrestart(jk_term, NULL);
                  rc = REQ_PROCEED;
              }
  
  /*            if(wc_open(init_map, logger)) {
                  magnus_atrestart(jk_term, NULL);
                  rc = REQ_PROCEED;
              }
  */
          }
          
          map_free(&init_map);
      }
  
      return rc;    
  }
  
  NSAPI_PUBLIC void jk_term(void *p)
  {
      wc_close(logger);
      if(logger) {
          jk_close_file_logger(&logger);
      }
  }
  
  NSAPI_PUBLIC int jk_service(pblock *pb,
                              Session *sn,
                              Request *rq)
  {
      char *worker_name = pblock_findval(JK_WORKER_NAME_TAG, pb); 
      char *uri_pattern = pblock_findval(URI_PATTERN, pb);     
      jk_worker_t *worker;    
      int rc = REQ_ABORTED;
  
      if(uri_pattern) {
          char *uri = pblock_findval("uri", rq->reqpb);
  
          if(0 != shexp_match(uri, uri_pattern)) {
              return REQ_NOACTION;
          }        
      }
  
      if(!worker_name) {
          worker_name = JK_AJP12_WORKER_NAME;
      }
  
      worker = wc_get_worker_for_name(worker_name, logger);
      if(worker) {
          nsapi_private_data_t private_data;
          jk_ws_service_t s;
          jk_pool_atom_t buf[SMALL_POOL_SIZE];
  
          jk_open_pool(&private_data.p, buf, sizeof(buf));
  
          private_data.request_started = JK_FALSE;
          private_data.pb = pb;
          private_data.sn = sn;
          private_data.rq = rq;
  
          jk_init_ws_service(&s);
  
          s.ws_private = &private_data;
          s.pool = &private_data.p;
  
          if(init_ws_service(&private_data, &s)) {
              jk_endpoint_t *e = NULL;
              if(worker->get_endpoint(worker, &e, logger)) {                
                  int recover = JK_FALSE;
                  if(e->service(e, &s, logger, &recover)) {
                      rc = REQ_PROCEED;
                  }
                  e->done(&e, logger);
              }
          }
          jk_close_pool(&private_data.p);
      }
  
      return rc;
  }
  
  static int init_ws_service(nsapi_private_data_t *private_data,
                             jk_ws_service_t *s) 
  {
      char *tmp;
      int rc;
  
      s->jvm_route = NULL;
      s->start_response = start_response;
      s->read = ws_read;
      s->write = ws_write;
      
      s->auth_type        = pblock_findval("auth-type", private_data->rq->vars);
      s->remote_user      = pblock_findval("auth-user", private_data->rq->vars);
  
      s->content_length   = 0;
      tmp = NULL;
      rc  = request_header("content-length", 
                           &tmp, 
                           private_data->sn, 
                           private_data->rq);
  
      if((rc != REQ_ABORTED) && tmp) {
          s->content_length = atoi(tmp);
      }
      
      s->method           = pblock_findval("method", private_data->rq->reqpb);
      s->protocol         = pblock_findval("protocol", private_data->rq->reqpb);
      
      s->remote_host      = session_dns(private_data->sn);
      s->remote_addr      = pblock_findval("ip", private_data->sn->client);
      
      s->req_uri          = pblock_findval("uri", private_data->rq->reqpb);
      s->query_string     = pblock_findval("query", private_data->rq->reqpb);
  
      s->server_name      = server_hostname;
      s->server_port      = server_portnum;
      s->server_software  = system_version();
  
  
      s->headers_names    = NULL;
      s->headers_values   = NULL;
      s->num_headers      = 0;
      
      s->is_ssl           = security_active;
      if(s->is_ssl) {
          s->ssl_cert     = pblock_findval("auth-cert", private_data->rq->vars);
          if(s->ssl_cert) {
              s->ssl_cert_len = strlen(s->ssl_cert);
          }
          s->ssl_cipher   = pblock_findval("cipher", private_data->sn->client);
          s->ssl_session  = pblock_findval("ssl-id", private_data->sn->client);
      } else {
          s->ssl_cert     = NULL;
          s->ssl_cert_len = 0;
          s->ssl_cipher   = NULL;
          s->ssl_session  = NULL;
      }
  
      return setup_http_headers(private_data, s);
  }
  
  static int setup_http_headers(nsapi_private_data_t *private_data,
                                jk_ws_service_t *s) 
  {
      pblock *headers_jar = private_data->rq->headers;
      int cnt;
      int i;
  
      for(i = 0, cnt = 0 ; i < headers_jar->hsize ; i++) {
          struct pb_entry *h = headers_jar->ht[i];
          while(h && h->param) {
              cnt++;
              h = h->next;
          }
      }
  
      if(cnt) {
          s->headers_names  = jk_pool_alloc(&private_data->p, cnt * sizeof(char *));
          s->headers_values = jk_pool_alloc(&private_data->p, cnt * sizeof(char *));
  
          if(s->headers_names && s->headers_values) {            
              for(i = 0, cnt = 0 ; i < headers_jar->hsize ; i++) {
                  struct pb_entry *h = headers_jar->ht[i];
                  while(h && h->param) {
                      s->headers_names[cnt]  = h->param->name;
                      s->headers_values[cnt] = h->param->value;
                      cnt++;
                      h = h->next;
                  }
              }
              s->num_headers = cnt;
              return JK_TRUE;
          }
      } else {
          s->num_headers = cnt;
          s->headers_names  = NULL;
          s->headers_values = NULL;
          return JK_TRUE;
      }
  
      return JK_FALSE;
  }
  
  
  
  1.1                  jakarta-tomcat/proposals/web-connector/native/netscape/nsapi.dsp
  
  Index: nsapi.dsp
  ===================================================================
  # Microsoft Developer Studio Project File - Name="nsapi" - Package Owner=<4>
  # Microsoft Developer Studio Generated Build File, Format Version 6.00
  # ** DO NOT EDIT **
  
  # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
  
  CFG=nsapi - Win32 Debug
  !MESSAGE This is not a valid makefile. To build this project using NMAKE,
  !MESSAGE use the Export Makefile command and run
  !MESSAGE 
  !MESSAGE NMAKE /f "nsapi.mak".
  !MESSAGE 
  !MESSAGE You can specify a configuration when running NMAKE
  !MESSAGE by defining the macro CFG on the command line. For example:
  !MESSAGE 
  !MESSAGE NMAKE /f "nsapi.mak" CFG="nsapi - Win32 Debug"
  !MESSAGE 
  !MESSAGE Possible choices for configuration are:
  !MESSAGE 
  !MESSAGE "nsapi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
  !MESSAGE "nsapi - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
  !MESSAGE 
  
  # Begin Project
  # PROP AllowPerConfigDependencies 0
  # PROP Scc_ProjName ""
  # PROP Scc_LocalPath ""
  CPP=cl.exe
  MTL=midl.exe
  RSC=rc.exe
  
  !IF  "$(CFG)" == "nsapi - Win32 Release"
  
  # PROP BASE Use_MFC 0
  # PROP BASE Use_Debug_Libraries 0
  # PROP BASE Output_Dir "Release"
  # PROP BASE Intermediate_Dir "Release"
  # PROP BASE Target_Dir ""
  # PROP Use_MFC 0
  # PROP Use_Debug_Libraries 0
  # PROP Output_Dir "nsapi_release"
  # PROP Intermediate_Dir "nsapi_release"
  # PROP Ignore_Export_Lib 0
  # PROP Target_Dir ""
  # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NSAPI_EXPORTS" /YX /FD /c
  # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\common" /I "$(NS_HOME)\include" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NSAPI_EXPORTS" /D "XP_WIN32" /YX /FD /c
  # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
  # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
  # ADD BASE RSC /l 0x409 /d "NDEBUG"
  # ADD RSC /l 0x409 /d "NDEBUG"
  BSC32=bscmake.exe
  # ADD BASE BSC32 /nologo
  # ADD BSC32 /nologo
  LINK32=link.exe
  # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
  # ADD LINK32 wsock32.lib ns-httpd36.lib /nologo /dll /machine:I386 /out:"nsapi_release/nsapi_redirect.dll" /libpath:"$(NS_HOME)\lib"
  
  !ELSEIF  "$(CFG)" == "nsapi - Win32 Debug"
  
  # PROP BASE Use_MFC 0
  # PROP BASE Use_Debug_Libraries 1
  # PROP BASE Output_Dir "nsapi___Win32_Debug"
  # PROP BASE Intermediate_Dir "nsapi___Win32_Debug"
  # PROP BASE Target_Dir ""
  # PROP Use_MFC 0
  # PROP Use_Debug_Libraries 1
  # PROP Output_Dir "nsapi_debug"
  # PROP Intermediate_Dir "nsapi_debug"
  # PROP Ignore_Export_Lib 0
  # PROP Target_Dir ""
  # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NSAPI_EXPORTS" /YX /FD /GZ /c
  # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\common" /I "$(NS_HOME)\include" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NSAPI_EXPORTS" /D "XP_WIN32" /D "MCC_HTTPD" /D "SPAPI20" /YX /FD /GZ /c
  # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
  # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
  # ADD BASE RSC /l 0x409 /d "_DEBUG"
  # ADD RSC /l 0x409 /d "_DEBUG"
  BSC32=bscmake.exe
  # ADD BASE BSC32 /nologo
  # ADD BSC32 /nologo
  LINK32=link.exe
  # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
  # ADD LINK32 wsock32.lib ns-httpd36.lib /nologo /dll /debug /machine:I386 /out:"nsapi_debug/nsapi_redirect.dll" /pdbtype:sept /libpath:"$(NS_HOME)\lib"
  
  !ENDIF 
  
  # Begin Target
  
  # Name "nsapi - Win32 Release"
  # Name "nsapi - Win32 Debug"
  # Begin Group "Source Files"
  
  # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
  # Begin Source File
  
  SOURCE=..\common\jk_ajp12_worker.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_ajp13.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_ajp13_worker.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_connect.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_jni_worker.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_lb_worker.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_map.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_msg_buff.c
  # End Source File
  # Begin Source File
  
  SOURCE=.\jk_nsapi_plugin.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_pool.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_sockbuf.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_uri_worker_map.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_util.c
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_worker.c
  # End Source File
  # End Group
  # Begin Group "Header Files"
  
  # PROP Default_Filter "h;hpp;hxx;hm;inl"
  # Begin Source File
  
  SOURCE=..\common\jk_ajp12_worker.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_ajp13.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_ajp13_worker.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_connect.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_global.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_jni_worker.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_lb_worker.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_logger.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_map.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_msg_buff.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_mt.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_pool.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_service.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_sockbuf.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_uri_worker_map.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_util.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_worker.h
  # End Source File
  # Begin Source File
  
  SOURCE=..\common\jk_worker_list.h
  # End Source File
  # End Group
  # Begin Group "Resource Files"
  
  # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
  # End Group
  # End Target
  # End Project
  
  
  
  1.1                  jakarta-tomcat/proposals/web-connector/native/netscape/nsapi.dsw
  
  Index: nsapi.dsw
  ===================================================================
  Microsoft Developer Studio Workspace File, Format Version 6.00
  # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
  
  ###############################################################################
  
  Project: "nsapi"=".\nsapi.dsp" - Package Owner=<4>
  
  Package=<5>
  {{{
  }}}
  
  Package=<4>
  {{{
  }}}
  
  ###############################################################################
  
  Global:
  
  Package=<5>
  {{{
  }}}
  
  Package=<3>
  {{{
  }}}
  
  ###############################################################################