CVS update: php31/sapi

From: Date: Sat, 22 Aug 1998 23:33:12 +0000
Subject: CVS update: php31/sapi
Groups: php.dev 
Request: Send a blank email to php-dev+get-497@lists.php.net to get a copy of this message
Date: Saturday August 22, 1998 @ 19:33 Author: shane Update of /repository/php31/sapi In directory asf:/tmp/cvs-serv16801/sapi Modified Files: nsapi_sapi.c phpsapi_nsapi.dsp Added Files: nsapi-readme.txt Log Message: NSAPI now works! work likely needs to be done on headers, cookies and authentication, all untested. Only simple scripts tested at this time. See sapi/nsapi-readme.txt for configuration information. Index: php31/sapi/nsapi_sapi.c diff -c php31/sapi/nsapi_sapi.c:2.2 php31/sapi/nsapi_sapi.c:2.3 *** php31/sapi/nsapi_sapi.c:2.2 Fri Aug 21 09:48:44 1998 --- php31/sapi/nsapi_sapi.c Sat Aug 22 19:33:12 1998 *************** *** 39,45 **** #include "modules.h" #include "ext/standard/file.h" #include "head.h" ! #include "ext/standard/post.h" #include "head.h" #include "ext/standard/type.h" #include "highlight.h" --- 39,45 ---- #include "modules.h" #include "ext/standard/file.h" #include "head.h" ! #include "post.h" #include "head.h" #include "ext/standard/type.h" #include "highlight.h" *************** *** 75,81 **** #include <stdio.h> #endif /* XP_WIN32 */ ! struct ns_request_info { pblock *pb; Session *sn; --- 75,87 ---- #include <stdio.h> #endif /* XP_WIN32 */ ! #define DEBUG_MESSAGE(debugmessage) OutputDebugString(debugmessage) ! /* { \ ! char logmessage[1024]; \ ! snprintf(logmessage, 1024, "%d:debugmessage\n", GetCurrentThreadId()); \ ! OutputDebugString(logmessage); \ ! } ! */ struct ns_request_info { pblock *pb; Session *sn; *************** *** 157,162 **** --- 163,171 ---- Request *rq = (Request *) ns_rqst->rq; int i = 0; + #ifdef DEBUG + DEBUG_MESSAGE("enter _php3_nsapi_env_get\n"); + #endif /* we need to go through the table above, and see if we can get what is being looked for from netscape, otherwise, try the regular environment *************** *** 230,235 **** --- 239,247 ---- char *sapi_getenv(SAPI_GLOBAL_INCLUDE char *var) { SAPI_FUNC_VARS; + #ifdef DEBUG + DEBUG_MESSAGE("called sapi_getenv\n"); + #endif return _php3_nsapi_env_get(ns_rqst, var); } *************** *** 315,324 **** /*********************************************************/ /*FIXME need to make nsapi correctly handle redirects and status strings */ ! int sapi_insert_header(SAPI_GLOBAL_INCLUDE char *header) { char *tempstr = NULL; SAPI_FUNC_VARS; /*inserts header into a list of headers */ /* header is in form of "headername: info" need to split into two strings and handle from there --- 327,339 ---- /*********************************************************/ /*FIXME need to make nsapi correctly handle redirects and status strings */ ! int sapi_insert_header(SAPI_GLOBAL_INCLUDE unsigned char *header) { char *tempstr = NULL; SAPI_FUNC_VARS; + #ifdef DEBUG + DEBUG_MESSAGE("enter sapi_insert_header\n"); + #endif /*inserts header into a list of headers */ /* header is in form of "headername: info" need to split into two strings and handle from there *************** *** 327,332 **** --- 342,350 ---- pblock_remove("content-type", rq->srvhdrs); pblock_nvinsert("content-type", "text/html", rq->srvhdrs); } + #ifdef DEBUG + DEBUG_MESSAGE("exit sapi_insert_header\n"); + #endif return SUCCESS; } *************** *** 335,345 **** SAPI_FUNC_VARS; /* this is sending ok on every call. need to figure out how we can handle other status codes */ if (!rq->senthdrs) { /*just verify headers not already sent */ protocol_status(sn, rq, PROTOCOL_OK, NULL); ! if (protocol_start_response(sn, rq) == REQ_NOACTION) return REQ_PROCEED; } return SUCCESS; } --- 353,373 ---- SAPI_FUNC_VARS; /* this is sending ok on every call. need to figure out how we can handle other status codes */ + #ifdef DEBUG + DEBUG_MESSAGE("enter sapi_send_header\n"); + #endif if (!rq->senthdrs) { /*just verify headers not already sent */ protocol_status(sn, rq, PROTOCOL_OK, NULL); ! if (protocol_start_response(sn, rq) == REQ_NOACTION){ ! #ifdef DEBUG ! DEBUG_MESSAGE("exit sapi_send_header, failed\n"); ! #endif return REQ_PROCEED; + } } + #ifdef DEBUG + DEBUG_MESSAGE("exit sapi_send_header, success\n"); + #endif return SUCCESS; } *************** *** 401,418 **** void sapi_treat_headers(SAPI_GLOBAL_INCLUDE_V) { - char *s = NULL; - char *t; - char *user, *type = "Basic "; int len; ! char *escaped_str; SAPI_FUNC_VARS; if (rq->headers) ! s = pblock_findval("Authorization", rq->headers); ! if (!s) return; ! /* Check to make sure that this URL isn't authenticated using a traditional auth module mechanism Not yet sure how to do this with NSAPI --- 429,449 ---- void sapi_treat_headers(SAPI_GLOBAL_INCLUDE_V) { int len; ! char *escaped_str, *decoded, *r, *password, *authinfo, *auth; SAPI_FUNC_VARS; + #ifdef DEBUG + DEBUG_MESSAGE("enter sapi_treat_headers\n"); + #endif if (rq->headers) ! authinfo = pblock_findval("Authorization", rq->headers); ! if (!authinfo){ ! #ifdef DEBUG ! DEBUG_MESSAGE("enter sapi_treat_headers, no auth\n"); ! #endif return; ! } /* Check to make sure that this URL isn't authenticated using a traditional auth module mechanism Not yet sure how to do this with NSAPI *************** *** 420,471 **** return; } */ ! if (strncmp(type, s, 6)) { ! /* Client tried to authenticate using wrong auth scheme */ ! php3_error(E_WARNING, "client used wrong authentication scheme"); return; } ! t = _php3_base64_decode(s, strlen(s), &len); ! /* FIXME ! user = getword_nulls_nc(php3_rqst->pool, &t, ':'); ! */ ! if (user) { ! if (GLOBAL(php3_ini)->magic_quotes_gpc) { ! escaped_str = _php3_addslashes(user, 0, &len, 0); ! SET_VAR_STRINGL("PHP_AUTH_USER", escaped_str, len); ! } else { ! SET_VAR_STRING("PHP_AUTH_USER", estrdup(user)); } ! } ! if (t) { ! if (GLOBAL(php3_ini)->magic_quotes_gpc) { ! escaped_str = _php3_addslashes(t, 0, &len, 0); ! SET_VAR_STRINGL("PHP_AUTH_PW", escaped_str, len); ! } else { ! SET_VAR_STRING("PHP_AUTH_PW", estrdup(t)); } ! } ! if (type) { ! if (GLOBAL(php3_ini)->magic_quotes_gpc) { ! escaped_str = _php3_addslashes(type, 0, &len, 0); ! SET_VAR_STRINGL("PHP_AUTH_TYPE", escaped_str, len); ! } else { ! SET_VAR_STRING("PHP_AUTH_TYPE", estrdup(type)); } } } /********************************************************* / input / output functions /*********************************************************/ ! int sapi_readclient(SAPI_GLOBAL_INCLUDE char *buf, int len) { SAPI_FUNC_VARS; return net_read(sn->csd, buf, len, 10); } ! int sapi_writeclient(SAPI_GLOBAL_INCLUDE char *string, int len) { SAPI_FUNC_VARS; return net_write(sn->csd, string, len); --- 451,515 ---- return; } */ ! if (strncmp("Basic ", authinfo, 6)) { ! #ifdef DEBUG ! DEBUG_MESSAGE("enter sapi_treat_headers, not basic\n"); ! #endif return; } ! auth = authinfo + 6; ! decoded = _php3_base64_decode(auth, strlen(auth), &len); ! r = strchr(decoded, ':'); ! if (r) { ! *r = '\0'; ! password = r + 1; ! #ifdef DEBUG ! { ! char logmessage[1024]; ! snprintf(logmessage, 79, "%d:sapi_treat_headers:decoded: %s - %s\n", ! GetCurrentThreadId(), ! decoded, password); ! OutputDebugString(logmessage); } ! #endif ! if (decoded) { ! if (GLOBAL(php3_ini)->magic_quotes_gpc) { ! len = strlen(decoded); ! escaped_str = _php3_addslashes(decoded, 0, &len, 0); ! SET_VAR_STRINGL("PHP_AUTH_USER", escaped_str, len); ! } else { ! SET_VAR_STRING("PHP_AUTH_USER", estrdup(decoded)); ! } } ! if (password) { ! if (GLOBAL(php3_ini)->magic_quotes_gpc) { ! len = strlen(password); ! escaped_str = _php3_addslashes(password, 0, &len, 0); ! SET_VAR_STRINGL("PHP_AUTH_PW", escaped_str, len); ! } else { ! SET_VAR_STRING("PHP_AUTH_PW", estrdup(password)); ! } } + *r = ':'; + efree(decoded); } + SET_VAR_STRING("PHP_AUTH_TYPE", estrdup("Basic")); + #ifdef DEBUG + DEBUG_MESSAGE("exit sapi_treat_headers\n"); + #endif } /********************************************************* / input / output functions /*********************************************************/ ! int sapi_readclient(SAPI_GLOBAL_INCLUDE unsigned char *buf, int len) { SAPI_FUNC_VARS; return net_read(sn->csd, buf, len, 10); } ! int sapi_writeclient(SAPI_GLOBAL_INCLUDE unsigned char *string, int len) { SAPI_FUNC_VARS; return net_write(sn->csd, string, len); *************** *** 488,510 **** int i = 0; char *temp; SAPI_FUNC_VARS; ! PUTS(SAPI_GLOBAL_PASS "<center><h2>NSAPI Environment</h2></center>"); ! PUTS(SAPI_GLOBAL_PASS "<table border=5 width=\"600\">\n"); ! PUTS(SAPI_GLOBAL_PASS "<tr><th bgcolor=\"" HEADER_COLOR "\">Variable</th><th bgcolor=\"" HEADER_COLOR "\">Value</th></tr>\n"); /* print out the server environment table here */ while (nsapi_env[i].type != -1) { temp = _php3_nsapi_env_get(ns_rqst, nsapi_env[i].name1); ! PUTS(SAPI_GLOBAL_PASS "<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">"); ! PUTS(SAPI_GLOBAL_PASS nsapi_env[i].name1); ! PUTS(SAPI_GLOBAL_PASS "</td><td bgcolor=\"" CONTENTS_COLOR "\">"); ! PUTS(SAPI_GLOBAL_PASS temp); ! PUTS(SAPI_GLOBAL_PASS "&nbsp;</td></tr>\n"); i++; } PUTS(SAPI_GLOBAL_PASS "</table>\n"); } /********************************************************* --- 532,563 ---- int i = 0; char *temp; SAPI_FUNC_VARS; + + #ifdef DEBUG + DEBUG_MESSAGE("enter sapi_print_info\n"); + #endif ! PUTS("<center><h2>NSAPI Environment</h2></center>"); ! PUTS("<table border=5 width=\"600\">\n"); ! PUTS("<tr><th bgcolor=\"" HEADER_COLOR "\">Variable</th><th bgcolor=\"" HEADER_COLOR "\">Value</th></tr>\n"); /* print out the server environment table here */ while (nsapi_env[i].type != -1) { temp = _php3_nsapi_env_get(ns_rqst, nsapi_env[i].name1); ! if(temp){ ! PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">"); ! PUTS(nsapi_env[i].name1); ! PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">"); ! PUTS(temp); ! PUTS("&nbsp;</td></tr>\n"); ! } i++; } PUTS(SAPI_GLOBAL_PASS "</table>\n"); + #ifdef DEBUG + DEBUG_MESSAGE("exit sapi_print_info\n"); + #endif } /********************************************************* *************** *** 526,535 **** void sapi_request_shutdown(SAPI_GLOBAL_INCLUDE_V) { } - int sapi_aborted(SAPI_GLOBAL_INCLUDE_V) - { - return 0; - } /****************************************************************************** /* code from main.c in _php3_hash_environment() --- 579,584 ---- *************** *** 543,548 **** --- 592,600 ---- char *phpsn, *pi; int l = 0; + #ifdef DEBUG + DEBUG_MESSAGE("enter sapi__php3_hash_server_env\n"); + #endif phpsn = sapi_info->script_name; pi = sapi_info->path_info; if (sn) *************** *** 557,562 **** --- 609,617 ---- tmp.value.str.len = _php3_sprintf(tmp.value.str.val, "%s%s", (phpsn ? phpsn : ""), (pi ? pi : "")); /* SAFE */ tmp.type = IS_STRING; _php3_hash_update(&php3_globals->symbol_table, "PHP_SELF", sizeof("PHP_SELF"), (void *) & tmp, sizeof(pval), NULL); + #ifdef DEBUG + DEBUG_MESSAGE("exit sapi__php3_hash_server_env\n"); + #endif } #if defined(CRASH_DETECTION) *************** *** 582,600 **** pblock *pb = (pblock *) ns_rqst->pb; Session *sn = (Session *) ns_rqst->sn; Request *rq = (Request *) ns_rqst->rq; ! /* for cgi we dont use request id's */ sapi_info->scid = ns_rqst; sapi_info->path_info = pblock_findval("path-info", rq->vars); sapi_info->path_translated = pblock_findval("path", rq->vars); ! sapi_info->filename = estrdup(sapi_info->path_translated); sapi_info->query_string = pblock_findval("query", rq->vars); sapi_info->request_method = pblock_findval("method", rq->reqpb); sapi_info->script_name = pblock_findval("path", rq->vars); ! sapi_info->content_length = atoi(pblock_findval("content-length", rq->headers)); sapi_info->content_type = pblock_findval("content-type", rq->srvhdrs); sapi_info->getenv = sapi_getenv; sapi_info->writeclient = sapi_writeclient; sapi_info->flush = sapi_flush; --- 637,683 ---- pblock *pb = (pblock *) ns_rqst->pb; Session *sn = (Session *) ns_rqst->sn; Request *rq = (Request *) ns_rqst->rq; ! char *temp; ! #ifdef DEBUG ! DEBUG_MESSAGE("enter sapi_init\n"); ! #endif /* for cgi we dont use request id's */ sapi_info->scid = ns_rqst; sapi_info->path_info = pblock_findval("path-info", rq->vars); + #ifdef DEBUG + DEBUG_MESSAGE("done with path_info\n"); + #endif sapi_info->path_translated = pblock_findval("path", rq->vars); ! #ifdef DEBUG ! DEBUG_MESSAGE("done with path_translated\n"); ! #endif ! sapi_info->rqst_filename = strdup(sapi_info->path_translated); ! #ifdef DEBUG ! DEBUG_MESSAGE("done with rqst_filename\n"); ! #endif sapi_info->query_string = pblock_findval("query", rq->vars); + #ifdef DEBUG + DEBUG_MESSAGE("done with query_string\n"); + #endif sapi_info->request_method = pblock_findval("method", rq->reqpb); + #ifdef DEBUG + DEBUG_MESSAGE("done with request_method\n"); + #endif sapi_info->script_name = pblock_findval("path", rq->vars); ! #ifdef DEBUG ! DEBUG_MESSAGE("done with script_name\n"); ! #endif ! temp=pblock_findval("content-length", rq->headers); ! if(temp)sapi_info->content_length = atol(temp); ! #ifdef DEBUG ! DEBUG_MESSAGE("done with content_length\n"); ! #endif sapi_info->content_type = pblock_findval("content-type", rq->srvhdrs); + #ifdef DEBUG + DEBUG_MESSAGE("done with content_type\n"); + #endif sapi_info->getenv = sapi_getenv; sapi_info->writeclient = sapi_writeclient; sapi_info->flush = sapi_flush; *************** *** 603,614 **** sapi_info->unblockalarms = sapi_unblock; sapi_info->log = sapi_log; sapi_info->info = sapi_print_info; - sapi_info->aborted = sapi_aborted; sapi_info->insert_header = sapi_insert_header; sapi_info->treat_headers = sapi_treat_headers; sapi_info->send_header = sapi_send_header; sapi_info->headers = NULL; sapi_info->_php3_hash_server_env = sapi__php3_hash_server_env; sapi_info->register_clean = sapi_reqister_cleanup; --- 686,697 ---- sapi_info->unblockalarms = sapi_unblock; sapi_info->log = sapi_log; sapi_info->info = sapi_print_info; sapi_info->insert_header = sapi_insert_header; sapi_info->treat_headers = sapi_treat_headers; sapi_info->send_header = sapi_send_header; sapi_info->headers = NULL; + sapi_info->cookies = NULL; sapi_info->_php3_hash_server_env = sapi__php3_hash_server_env; sapi_info->register_clean = sapi_reqister_cleanup; *************** *** 628,674 **** sapi_info->page_uid = 0; sapi_info->page_inode = 0; sapi_info->page_mtime = 0; } ! void close_nsapi_mod(void *vparam) { //global shutdown for all php threads //do we use dllmain or this? What about thread start/end? //_php3_sapi_process_end(); } ! int init_nsapi_mod(pblock * pb, Session * sn, Request * rq) { //global initialization for all php threads //do we use dllmain or this? What about thread start/end? //_php3_sapi_process_start(module_info); daemon_atrestart(close_nsapi_mod, NULL); return REQ_PROCEED; } ! int nsapi_php_main(pblock * pb, Session * sn, Request * rq) { ! struct ns_request_info *ns_rqst = malloc(sizeof(struct ns_request_info)); ! struct sapi_request_info *sapi_info = malloc(sizeof(struct sapi_request_info)); ns_rqst->pb = pb; ns_rqst->sn = sn; ns_rqst->rq = rq; ! ns_rqst->cookie_recv = _php3_nsapi_get_cookie_pblock(rq); //get cookies up front // we can now get cookies like this: // char *cookiename=pblock_findval("cookiename", cookie_recv); sapi_init(ns_rqst, sapi_info); ! if (!php3_sapi_main(sapi_info, module_info)) { ! free(sapi_info); ! free(ns_rqst); ! return REQ_ABORTED; /*FAILURE */ ! } free(sapi_info); free(ns_rqst); ! return REQ_PROCEED; /*SUCCESS */ } --- 711,798 ---- sapi_info->page_uid = 0; sapi_info->page_inode = 0; sapi_info->page_mtime = 0; + #ifdef DEBUG + DEBUG_MESSAGE("sapi_init exit\n"); + #endif } ! void EXPORT close_nsapi_mod(void *vparam) { + OutputDebugString("close_nsapi_mod"); //global shutdown for all php threads //do we use dllmain or this? What about thread start/end? //_php3_sapi_process_end(); + #ifdef DEBUG + DEBUG_MESSAGE("close_nsapi_mod"); + #endif } ! int EXPORT init_nsapi_mod(pblock * pb, Session * sn, Request * rq) { + OutputDebugString("init_nsapi_mod"); //global initialization for all php threads //do we use dllmain or this? What about thread start/end? //_php3_sapi_process_start(module_info); daemon_atrestart(close_nsapi_mod, NULL); + #ifdef DEBUG + DEBUG_MESSAGE("init_nsapi_mod"); + #endif return REQ_PROCEED; } ! ! int EXPORT nsapi_php_main(pblock * pb, Session * sn, Request * rq) { ! struct ns_request_info *ns_rqst; ! struct sapi_request_info *sapi_info; ! int ret; ! #ifdef DEBUG ! DEBUG_MESSAGE("nsapi entry\n"); ! #endif + ns_rqst = malloc(sizeof(struct ns_request_info)); + sapi_info = malloc(sizeof(struct sapi_request_info)); + + #ifdef DEBUG + DEBUG_MESSAGE("memory alloced\n"); + #endif + // protocol_status(sn,rq,PROTOCOL_OK,NULL); + // if(protocol_start_response(sn,rq)==REQ_NOACTION)return REQ_PROCEED; + + #ifdef DEBUG + DEBUG_MESSAGE("response started\n"); + #endif ns_rqst->pb = pb; ns_rqst->sn = sn; ns_rqst->rq = rq; ! // ns_rqst->cookie_recv = _php3_nsapi_get_cookie_pblock(rq); //get cookies up front // we can now get cookies like this: // char *cookiename=pblock_findval("cookiename", cookie_recv); + #ifdef DEBUG + DEBUG_MESSAGE("nsapi starting sapi init\n"); + #endif sapi_init(ns_rqst, sapi_info); + #ifdef DEBUG + DEBUG_MESSAGE("nsapi sapi init done"); + #endif ! ret=php3_sapi_main(sapi_info, module_info); ! free(sapi_info); free(ns_rqst); ! if (ret == SUCCESS){ ! #ifdef DEBUG ! DEBUG_MESSAGE("nsapi success"); ! #endif ! return REQ_PROCEED; /*SUCCESS */ ! } else { ! #ifdef DEBUG ! DEBUG_MESSAGE("nsapi failed"); ! #endif ! return REQ_ABORTED; /*FAILURE */ ! } } *************** *** 685,698 **** --- 809,834 ---- switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: return _php3_sapi_process_start(module_info); + #ifdef DEBUG + DEBUG_MESSAGE("nsapi DLL_PROCESS_ATTACH"); + #endif break; case DLL_THREAD_ATTACH: + #ifdef DEBUG + DEBUG_MESSAGE("nsapi DLL_THREAD_ATTACH"); + #endif return _php3_sapi_thread_start(module_info); break; case DLL_THREAD_DETACH: + #ifdef DEBUG + DEBUG_MESSAGE("nsapi DLL_THREAD_DETACH"); + #endif return _php3_sapi_thread_end(); break; case DLL_PROCESS_DETACH: + #ifdef DEBUG + DEBUG_MESSAGE("nsapi DLL_PROCESS_DETACH"); + #endif return _php3_sapi_process_end(); break; } Index: php31/sapi/phpsapi_nsapi.dsp diff -c php31/sapi/phpsapi_nsapi.dsp:2.0 php31/sapi/phpsapi_nsapi.dsp:2.1 *** php31/sapi/phpsapi_nsapi.dsp:2.0 Fri Jul 3 09:19:26 1998 --- php31/sapi/phpsapi_nsapi.dsp Sat Aug 22 19:33:12 1998 *************** *** 64,75 **** # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 ! # PROP Output_Dir "sapi_Debug" # PROP Intermediate_Dir "sapi_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" /YX /FD /c ! # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "./" /I "../" /I "../main" /I "c:\netscape\suitespot\include" /D "XP_WIN32" /D "MSVC5" /D "CRASH_DETECTION" /D "THREAD_SAFE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" --- 64,75 ---- # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 ! # PROP Output_Dir "c:\php31" # PROP Intermediate_Dir "sapi_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" /YX /FD /c ! # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "./" /I "../" /I "../main" /I "c:\netscape\suitespot\include" /D "XP_WIN32" /D "MSVC5" /D "DEBUG" /D "CRASH_DETECTION" /D "THREAD_SAFE" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" -- PHP Development Mailing List http://www.php.net/ To unsubscribe send an empty message to php-dev-unsubscribe@lists.php.net For help: php-dev-help@lists.php.net

« previous php.dev (#497) next »