X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Fperlhost.h;h=61f87659df46c3f674e2da9d13bc61bb1e54f44c;hb=e5973ed5ed7077edf70f4112414ae22c6300aec8;hp=c8a0406b6c9964b0cc0a4acbd54944ffce32ecfb;hpb=6a04c2460440e11ec69d2ce463d6d46a2d5d7155;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/perlhost.h b/win32/perlhost.h index c8a0406..61f8765 100644 --- a/win32/perlhost.h +++ b/win32/perlhost.h @@ -7,20 +7,29 @@ * 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); END_EXTERN_C @@ -509,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 @@ -608,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 } @@ -641,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 } @@ -734,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; @@ -823,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]; @@ -870,6 +881,9 @@ PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf) fsetpos(pfdup, &pos); } return pfdup; +#else + return 0; +#endif } struct IPerlStdIO perlStdIO = @@ -977,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 @@ -1065,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); } @@ -1599,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 @@ -1693,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; @@ -1723,6 +1743,12 @@ win32_start_child(LPVOID arg) 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, (LPARAM)w32_message_hwnd); + /* push a zero on the stack (we are the child) */ { dSP; @@ -1736,7 +1762,7 @@ win32_start_child(LPVOID arg) { dJMPENV; - volatile int oldscope = PL_scopestack_ix; + volatile int oldscope = 1; /* We are responsible for all scopes */ restart: JMPENV_PUSH(status); @@ -1758,7 +1784,7 @@ restart: 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"); @@ -1770,7 +1796,7 @@ 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); @@ -1809,7 +1835,8 @@ PerlProcFork(struct IPerlProc* piPerl) return -1; } h = new CPerlHost(*(CPerlHost*)w32_internal_host); - PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX, 1, + PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX, + CLONEf_COPY_STACKS, h->m_pHostperlMem, h->m_pHostperlMemShared, h->m_pHostperlMemParse, @@ -1826,6 +1853,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); @@ -2120,6 +2152,10 @@ 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); @@ -2216,16 +2252,15 @@ char* CPerlHost::GetChildDir(void) { dTHX; - int length; char* ptr; + size_t length; + Newx(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; - } + 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; } @@ -2414,13 +2449,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; }