X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Fperlhost.h;h=6e3fcd27a65112f0980f433b939574e1a70d80cd;hb=cee5ec9732ebca977c261523aced14be1615ddb5;hp=c91d9a8b90e1af4ae60e8bab8c94ccbd8d474bbd;hpb=57ab3dfef762780a52fccd428b2a630bc33a48f4;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/perlhost.h b/win32/perlhost.h index c91d9a8..6e3fcd2 100644 --- a/win32/perlhost.h +++ b/win32/perlhost.h @@ -7,22 +7,30 @@ * License or the Artistic License, as specified in the README file. */ +#ifndef UNDER_CE #define CHECK_HOST_INTERP +#endif #ifndef ___PerlHost_H___ #define ___PerlHost_H___ +#ifndef UNDER_CE #include +#endif #include "iperlsys.h" #include "vmem.h" #include "vdir.h" +#ifndef WC_NO_BEST_FIT_CHARS +# define WC_NO_BEST_FIT_CHARS 0x00000400 +#endif + START_EXTERN_C -extern char * g_win32_get_privlib(const char *pl); -extern char * g_win32_get_sitelib(const char *pl); -extern char * g_win32_get_vendorlib(const char *pl); +extern char * g_win32_get_privlib(const char *pl, STRLEN *const len); +extern char * g_win32_get_sitelib(const char *pl, STRLEN *const len); +extern char * g_win32_get_vendorlib(const char *pl, + STRLEN *const len); extern char * g_getlogin(void); -extern int do_spawn2(char *cmd, int exectype); END_EXTERN_C class CPerlHost @@ -510,21 +518,22 @@ PerlEnvOsId(struct IPerlEnv* piPerl) } char* -PerlEnvLibPath(struct IPerlEnv* piPerl, const char *pl) +PerlEnvLibPath(struct IPerlEnv* piPerl, const char *pl, STRLEN *const len) { - return g_win32_get_privlib(pl); + return g_win32_get_privlib(pl, len); } char* -PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl) +PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl, STRLEN *const len) { - return g_win32_get_sitelib(pl); + return g_win32_get_sitelib(pl, len); } char* -PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl) +PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl, + STRLEN *const len) { - return g_win32_get_vendorlib(pl); + return g_win32_get_vendorlib(pl, len); } void @@ -609,14 +618,14 @@ PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf) return win32_getc(pf); } -char* +STDCHAR* PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf) { #ifdef FILE_base FILE *f = pf; return FILE_base(f); #else - return Nullch; + return NULL; #endif } @@ -642,14 +651,14 @@ PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf) #endif } -char* +STDCHAR* PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf) { #ifdef USE_STDIO_PTR FILE *f = pf; return FILE_ptr(f); #else - return Nullch; + return NULL; #endif } @@ -735,7 +744,7 @@ PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n) } void -PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, char * ptr) +PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, STDCHAR * ptr) { #ifdef STDIO_PTR_LVALUE FILE *f = pf; @@ -824,6 +833,7 @@ PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum) FILE* PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf) { +#ifndef UNDER_CE FILE* pfdup; fpos_t pos; char mode[3]; @@ -871,6 +881,9 @@ PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf) fsetpos(pfdup, &pos); } return pfdup; +#else + return 0; +#endif } struct IPerlStdIO perlStdIO = @@ -940,9 +953,9 @@ PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t g } int -PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size) +PerlLIOChsize(struct IPerlLIO* piPerl, int handle, Off_t size) { - return chsize(handle, size); + return win32_chsize(handle, size); } int @@ -978,7 +991,14 @@ PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, Stat_t *buffer) int PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data) { - return win32_ioctlsocket((SOCKET)i, (long)u, (u_long*)data); + u_long u_long_arg; + int retval; + + /* mauke says using memcpy avoids alignment issues */ + memcpy(&u_long_arg, data, sizeof u_long_arg); + retval = win32_ioctlsocket((SOCKET)i, (long)u, &u_long_arg); + memcpy(data, &u_long_arg, sizeof u_long_arg); + return retval; } int @@ -1066,7 +1086,7 @@ PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename) } int -PerlLIOUtime(struct IPerlLIO* piPerl, char *filename, struct utimbuf *times) +PerlLIOUtime(struct IPerlLIO* piPerl, const char *filename, struct utimbuf *times) { return win32_utime(filename, times); } @@ -1137,7 +1157,7 @@ PerlDirClose(struct IPerlDir* piPerl, DIR *dirp) } DIR* -PerlDirOpen(struct IPerlDir* piPerl, char *filename) +PerlDirOpen(struct IPerlDir* piPerl, const char *filename) { return win32_opendir(filename); } @@ -1600,9 +1620,7 @@ PerlProcKill(struct IPerlProc* piPerl, int pid, int sig) int PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig) { - dTHX; - Perl_croak(aTHX_ "killpg not implemented!\n"); - return 0; + return win32_kill(pid, -sig); } int @@ -1694,6 +1712,7 @@ win32_start_child(LPVOID arg) PerlInterpreter *my_perl = (PerlInterpreter*)arg; GV *tmpgv; int status; + HWND parent_message_hwnd; #ifdef PERL_SYNC_FORK static long sync_fork_id = 0; long id = ++sync_fork_id; @@ -1720,7 +1739,15 @@ win32_start_child(LPVOID arg) sv_setiv(sv, -(IV)w32_pseudo_id); SvREADONLY_on(sv); } +#ifdef PERL_USES_PL_PIDSTATUS hv_clear(PL_pidstatus); +#endif + + /* create message window and tell parent about it */ + parent_message_hwnd = w32_message_hwnd; + w32_message_hwnd = win32_create_message_window(); + if (parent_message_hwnd != NULL) + PostMessage(parent_message_hwnd, WM_USER_MESSAGE, w32_pseudo_id, (LONG)w32_message_hwnd); /* push a zero on the stack (we are the child) */ { @@ -1751,13 +1778,13 @@ restart: PL_curstash = PL_defstash; if (PL_endav && !PL_minus_c) call_list(oldscope, PL_endav); - status = STATUS_NATIVE_EXPORT; + status = STATUS_EXIT; break; case 3: if (PL_restartop) { POPSTACK_TO(PL_mainstack); PL_op = PL_restartop; - PL_restartop = Nullop; + PL_restartop = (OP*)NULL; goto restart; } PerlIO_printf(Perl_error_log, "panic: restartop\n"); @@ -1769,15 +1796,15 @@ restart: /* XXX hack to avoid perl_destruct() freeing optree */ win32_checkTLS(my_perl); - PL_main_root = Nullop; + PL_main_root = (OP*)NULL; } win32_checkTLS(my_perl); /* close the std handles to avoid fd leaks */ { - do_close(gv_fetchpv("STDIN", TRUE, SVt_PVIO), FALSE); - do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE); - do_close(gv_fetchpv("STDERR", TRUE, SVt_PVIO), FALSE); + do_close(PL_stdingv, FALSE); + do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE); /* PL_stdoutgv - ISAGN */ + do_close(PL_stderrgv, FALSE); } /* destroy everything (waits for any pseudo-forked children) */ @@ -1825,6 +1852,11 @@ PerlProcFork(struct IPerlProc* piPerl) id = win32_start_child((LPVOID)new_perl); PERL_SET_THX(aTHX); # else + if (w32_message_hwnd == INVALID_HANDLE_VALUE) + w32_message_hwnd = win32_create_message_window(); + new_perl->Isys_intern.message_hwnd = w32_message_hwnd; + w32_pseudo_child_message_hwnds[w32_num_pseudo_children] = + (w32_message_hwnd == NULL) ? (HWND)NULL : (HWND)INVALID_HANDLE_VALUE; # ifdef USE_RTL_THREAD_API handle = (HANDLE)_beginthreadex((void*)NULL, 0, win32_start_child, (void*)new_perl, 0, (unsigned*)&id); @@ -1871,19 +1903,6 @@ PerlProcGetOSError(struct IPerlProc* piPerl, SV* sv, DWORD dwErr) win32_str_os_error(sv, dwErr); } -BOOL -PerlProcDoCmd(struct IPerlProc* piPerl, char *cmd) -{ - do_spawn2(cmd, EXECF_EXEC); - return FALSE; -} - -int -PerlProcSpawn(struct IPerlProc* piPerl, char* cmds) -{ - return do_spawn2(cmds, EXECF_SPAWN); -} - int PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv) { @@ -1891,12 +1910,6 @@ PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const c } int -PerlProcASpawn(struct IPerlProc* piPerl, void *vreally, void **vmark, void **vsp) -{ - return do_aspawn(vreally, vmark, vsp); -} - -int PerlProcLastHost(struct IPerlProc* piPerl) { dTHX; @@ -1935,10 +1948,7 @@ struct IPerlProc perlProc = PerlProcGetpid, PerlProcDynaLoader, PerlProcGetOSError, - PerlProcDoCmd, - PerlProcSpawn, PerlProcSpawnvp, - PerlProcASpawn, PerlProcLastHost, PerlProcPopenList, PerlProcGetTimeOfDay @@ -2080,7 +2090,7 @@ CPerlHost::CPerlHost(CPerlHost& host) CPerlHost::~CPerlHost(void) { -// Reset(); + Reset(); InterlockedDecrement(&num_hosts); delete m_pvDir; m_pVMemParse->Release(); @@ -2141,6 +2151,12 @@ lookup(const void *arg1, const void *arg2) LPSTR* CPerlHost::Lookup(LPCSTR lpStr) { +#ifdef UNDER_CE + if (!m_lppEnvList || !m_dwEnvCount) + return NULL; +#endif + if (!lpStr) + return NULL; return (LPSTR*)bsearch(&lpStr, m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), lookup); } @@ -2192,20 +2208,24 @@ CPerlHost::Add(LPCSTR lpStr) // replacing ? lpPtr = Lookup(szBuffer); - if(lpPtr != NULL) { - Renew(*lpPtr, length, char); + if (lpPtr != NULL) { + // must allocate things via host memory allocation functions + // rather than perl's Renew() et al, as the perl interpreter + // may either not be initialized enough when we allocate these, + // or may already be dead when we go to free these + *lpPtr = (char*)Realloc(*lpPtr, length * sizeof(char)); strcpy(*lpPtr, lpStr); } else { - ++m_dwEnvCount; - Renew(m_lppEnvList, m_dwEnvCount, LPSTR); - New(1, m_lppEnvList[m_dwEnvCount-1], length, char); - if(m_lppEnvList[m_dwEnvCount-1] != NULL) { - strcpy(m_lppEnvList[m_dwEnvCount-1], lpStr); - qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare); + m_lppEnvList = (LPSTR*)Realloc(m_lppEnvList, (m_dwEnvCount+1) * sizeof(LPSTR)); + if (m_lppEnvList) { + m_lppEnvList[m_dwEnvCount] = (char*)Malloc(length * sizeof(char)); + if (m_lppEnvList[m_dwEnvCount] != NULL) { + strcpy(m_lppEnvList[m_dwEnvCount], lpStr); + ++m_dwEnvCount; + qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare); + } } - else - --m_dwEnvCount; } } @@ -2231,16 +2251,15 @@ char* CPerlHost::GetChildDir(void) { dTHX; - int length; char* ptr; - New(0, ptr, MAX_PATH+1, char); - if(ptr) { - m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr); - length = strlen(ptr); - if (length > 3) { - if ((ptr[length-1] == '\\') || (ptr[length-1] == '/')) - ptr[length-1] = 0; - } + size_t length; + + Newx(ptr, MAX_PATH+1, char); + m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr); + length = strlen(ptr); + if (length > 3) { + if ((ptr[length-1] == '\\') || (ptr[length-1] == '/')) + ptr[length-1] = 0; } return ptr; } @@ -2280,7 +2299,7 @@ CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir) // add the additional space used by changes made to the environment dwSize += CalculateEnvironmentSpace(); - New(1, lpStr, dwSize, char); + Newx(lpStr, dwSize, char); lpPtr = lpStr; if(lpStr != NULL) { // build the local environment @@ -2348,11 +2367,13 @@ CPerlHost::Reset(void) dTHX; if(m_lppEnvList != NULL) { for(DWORD index = 0; index < m_dwEnvCount; ++index) { - Safefree(m_lppEnvList[index]); + Free(m_lppEnvList[index]); m_lppEnvList[index] = NULL; } } m_dwEnvCount = 0; + Free(m_lppEnvList); + m_lppEnvList = NULL; } void @@ -2427,13 +2448,7 @@ CPerlHost::Chdir(const char *dirname) errno = ENOENT; return -1; } - if (USING_WIDE()) { - WCHAR wBuffer[MAX_PATH]; - A2WHELPER(dirname, wBuffer, sizeof(wBuffer)); - ret = m_pvDir->SetCurrentDirectoryW(wBuffer); - } - else - ret = m_pvDir->SetCurrentDirectoryA((char*)dirname); + ret = m_pvDir->SetCurrentDirectoryA((char*)dirname); if(ret < 0) { errno = ENOENT; }