void set_path_env(void) { /*make our codec dirs available for LoadLibraryA()*/ char tmppath[MAX_PATH*2 + 1]; char win32path[MAX_PATH]; char realpath[MAX_PATH]; #ifdef __CYGWIN__ cygwin_conv_to_full_win32_path(WIN32_PATH,win32path); strcpy(tmppath,win32path); #ifdef CONFIG_REALCODECS cygwin_conv_to_full_win32_path(REALCODEC_PATH,realpath); sprintf(tmppath,"%s;%s",win32path,realpath); #endif /*CONFIG_REALCODECS*/ #else /*__CYGWIN__*/ /* Expand to absolute path unless it's already absolute */ if (!strstr(WIN32_PATH,":") && WIN32_PATH[0] != '\\'){ GetModuleFileNameA(NULL, win32path, MAX_PATH); strcpy(strrchr(win32path, '\\') + 1, WIN32_PATH); } else strcpy(win32path,WIN32_PATH); strcpy(tmppath,win32path); #ifdef CONFIG_REALCODECS /* Expand to absolute path unless it's already absolute */ if (!strstr(REALCODEC_PATH,":") && REALCODEC_PATH[0] != '\\'){ GetModuleFileNameA(NULL, realpath, MAX_PATH); strcpy(strrchr(realpath, '\\') + 1, REALCODEC_PATH); } else strcpy(realpath,REALCODEC_PATH); sprintf(tmppath,"%s;%s",win32path,realpath); #endif /*CONFIG_REALCODECS*/ #endif /*__CYGWIN__*/ mp_msg(MSGT_WIN32, MSGL_V,"Setting PATH to %s\n",tmppath); if (!SetEnvironmentVariableA("PATH", tmppath)) mp_msg(MSGT_WIN32, MSGL_WARN, "Cannot set PATH!"); }
void set_path_env(void) { /*make our codec dirs available for LoadLibraryA()*/ char win32path[MAX_PATH]; #ifdef __CYGWIN__ cygwin_conv_to_full_win32_path(BINARY_CODECS_PATH, win32path); #else /*__CYGWIN__*/ /* Expand to absolute path unless it's already absolute */ if (!strstr(BINARY_CODECS_PATH,":") && BINARY_CODECS_PATH[0] != '\\') { GetModuleFileNameA(NULL, win32path, MAX_PATH); strcpy(strrchr(win32path, '\\') + 1, BINARY_CODECS_PATH); } else strcpy(win32path, BINARY_CODECS_PATH); #endif /*__CYGWIN__*/ mp_msg(MSGT_WIN32, MSGL_V, "Setting PATH to %s\n", win32path); if (!SetEnvironmentVariableA("PATH", win32path)) mp_msg(MSGT_WIN32, MSGL_WARN, "Cannot set PATH!"); }
/* * Try to figure out how deep we can go in our tests. Assumes that * the first call to this function has the longest starting cwd (which * is currently "<testdir>/original"). This is mostly to work around * limits in our Win32 support. * * Background: On Posix systems, PATH_MAX is merely a limit on the * length of the string passed into a system call. By repeatedly * calling chdir(), you can work with arbitrarily long paths on such * systems. In contrast, Win32 APIs apply PATH_MAX limits to the full * absolute path, so the permissible length of a system call argument * varies with the cwd. Some APIs actually enforce limits * significantly less than PATH_MAX to ensure that you can create * files within the current working directory. The Win32 limits also * apply to Cygwin before 1.7. * * Someday, I want to convert the Win32 support to use newer * wide-character paths with '\\?\' prefix, which has a 32k PATH_MAX * instead of the rather anemic 260 character limit of the older * system calls. Then we can drop this mess (unless we want to * continue to special-case Cygwin 1.5 and earlier). */ static int compute_loop_max(void) { #if defined(_WIN32) && !defined(__CYGWIN__) static int LOOP_MAX = 0; char buf[MAX_PATH]; size_t cwdlen; if (LOOP_MAX == 0) { assert(_getcwd(buf, MAX_PATH) != NULL); cwdlen = strlen(buf); /* 12 characters = length of 8.3 filename */ /* 4 characters = length of "/../" used in symlink tests */ /* 1 character = length of extra "/" separator */ LOOP_MAX = MAX_PATH - (int)cwdlen - 12 - 4 - 1; } return LOOP_MAX; #elif defined(__CYGWIN__) && !defined(HAVE_CYGWIN_CONV_PATH) static int LOOP_MAX = 0; if (LOOP_MAX == 0) { char wbuf[PATH_MAX]; char pbuf[PATH_MAX]; size_t wcwdlen; size_t pcwdlen; size_t cwdlen; assert(getcwd(pbuf, PATH_MAX) != NULL); pcwdlen = strlen(pbuf); cygwin_conv_to_full_win32_path(pbuf, wbuf); wcwdlen = strlen(wbuf); cwdlen = ((wcwdlen > pcwdlen) ? wcwdlen : pcwdlen); /* Cygwin helper needs an extra few characters. */ LOOP_MAX = PATH_MAX - (int)cwdlen - 12 - 4 - 4; } return LOOP_MAX; #else /* cygwin-1.7 ends up here, along with "normal" unix */ return 200; /* restore pre-r278 depth */ #endif }
BOOL tt32_loaddll() { char* pszDLLName; char tt32_dllname_in_buff [ MAX_PATH ]; char tt32_dllname_out_buff [ MAX_PATH ] = {0}; static int tt32_init_done = 0; if (!tt32_init_done) { InitializeCriticalSection( &g_tt32_lock ); tt32_init_done = 1; } EnterCriticalSection(&g_tt32_lock); if (g_tt32_hmoddll) { LeaveCriticalSection(&g_tt32_lock); return TRUE; } // First, determine the name of the DLL we should try loading... if ( !( pszDLLName = getenv( "HERCULES_IFC" ) ) ) pszDLLName = DEF_TT32_DLLNAME; ASSERT( pszDLLName && *pszDLLName ); // Then check to see if the "name" contains path information or not... if ( strchr( pszDLLName, '/' ) || strchr( pszDLLName, '\\' ) ) { // It's already a path... strlcpy( tt32_dllname_in_buff, pszDLLName, sizeof(tt32_dllname_in_buff) ); } else { // It's not a path, so make it one... strlcpy( tt32_dllname_in_buff, MODULESDIR, sizeof(tt32_dllname_in_buff) ); strlcat( tt32_dllname_in_buff, "/" , sizeof(tt32_dllname_in_buff) ); strlcat( tt32_dllname_in_buff, pszDLLName, sizeof(tt32_dllname_in_buff) ); } // Now convert it to a full path... // PROGRAMMING NOTE: It's important here to ensure that our end result is a path // with BACKWARD slashes in it and NOT forward slashes! LoadLibrary is one of the // few Win32 functions that cannot handle paths with forward slashes in it. For // 'open', etc, yeah, forward slashes are fine, but for LoadLibrary they're not! #ifdef _MSVC_ if ( !_fullpath( tt32_dllname_out_buff, tt32_dllname_in_buff, sizeof(tt32_dllname_out_buff) ) ) strlcpy( tt32_dllname_out_buff, tt32_dllname_in_buff, sizeof(tt32_dllname_out_buff) ); #else // (presumed cygwin) cygwin_conv_to_full_win32_path( tt32_dllname_in_buff, tt32_dllname_out_buff ); #endif // _MSVC_ tt32_dllname_out_buff[ sizeof(tt32_dllname_out_buff) - 1 ] = 0; // Finally, copy it to our global home for it... strlcpy( g_tt32_dllname, tt32_dllname_out_buff, sizeof(g_tt32_dllname) ); ASSERT(g_tt32_dllname[0]); g_tt32_hmoddll = LoadLibraryEx( g_tt32_dllname, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); if (!g_tt32_hmoddll) { // Try again WITHOUT the path this time... strlcpy( g_tt32_dllname, pszDLLName, sizeof(g_tt32_dllname) ); g_tt32_hmoddll = LoadLibraryEx( g_tt32_dllname, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); if (!g_tt32_hmoddll) { DWORD dwLastError = GetLastError(); LeaveCriticalSection(&g_tt32_lock); logmsg("** tt32_loaddll: LoadLibraryEx(\"%s\") failed; rc=%ld: %s\n", g_tt32_dllname,dwLastError,strerror(dwLastError)); return FALSE; } } // Resolve our required DLL entry-point variables... if (!GetTT32ProcAddrs()) return FALSE; logmsg("%s version %s initiated\n", g_tt32_dllname, g_tt32_pfn_version_string()); #if defined(DEBUG) || defined(_DEBUG) enable_tt32_debug_tracing(1); // (enable debug tracing by default for DEBUG builds) #endif return TRUE; }
const wxChar* wxGetHomeDir(wxString *pstr) { wxString& strDir = *pstr; // first branch is for Cygwin #if defined(__UNIX__) && !defined(__WINE__) const wxChar *szHome = wxGetenv("HOME"); if ( szHome == NULL ) { // we're homeless... wxLogWarning(_("can't find user's HOME, using current directory.")); strDir = wxT("."); } else strDir = szHome; // add a trailing slash if needed if ( strDir.Last() != wxT('/') ) strDir << wxT('/'); #ifdef __CYGWIN__ // Cygwin returns unix type path but that does not work well static wxChar windowsPath[MAX_PATH]; cygwin_conv_to_full_win32_path(strDir, windowsPath); strDir = windowsPath; #endif #elif defined(__WXWINCE__) strDir = wxT("\\"); #else strDir.clear(); // If we have a valid HOME directory, as is used on many machines that // have unix utilities on them, we should use that. const wxChar *szHome = wxGetenv(wxT("HOME")); if ( szHome != NULL ) { strDir = szHome; } else // no HOME, try HOMEDRIVE/PATH { szHome = wxGetenv(wxT("HOMEDRIVE")); if ( szHome != NULL ) strDir << szHome; szHome = wxGetenv(wxT("HOMEPATH")); if ( szHome != NULL ) { strDir << szHome; // the idea is that under NT these variables have default values // of "%systemdrive%:" and "\\". As we don't want to create our // config files in the root directory of the system drive, we will // create it in our program's dir. However, if the user took care // to set HOMEPATH to something other than "\\", we suppose that he // knows what he is doing and use the supplied value. if ( wxStrcmp(szHome, wxT("\\")) == 0 ) strDir.clear(); } } if ( strDir.empty() ) { // If we have a valid USERPROFILE directory, as is the case in // Windows NT, 2000 and XP, we should use that as our home directory. szHome = wxGetenv(wxT("USERPROFILE")); if ( szHome != NULL ) strDir = szHome; } if ( !strDir.empty() ) { // sometimes the value of HOME may be "%USERPROFILE%", so reexpand the // value once again, it shouldn't hurt anyhow strDir = wxExpandEnvVars(strDir); } else // fall back to the program directory { // extract the directory component of the program file name wxSplitPath(wxGetFullModuleName(), &strDir, NULL, NULL); } #endif // UNIX/Win return strDir.c_str(); }
PRIVATE char *blat_cmd( char *mail_cmd, char *filename, char *address, char *subject, char *ccaddr, char *mail_addr) { static char *b_cmd; #ifdef USE_ALT_BLAT_MAILER HTSprintf0(&b_cmd, "%s %s -t \"%s\" -s \"%s\" %s%s%s%s", mail_cmd, filename, address, subject, system_mail_flags, ccaddr? " -c \"" : "", NonNull(ccaddr), ccaddr? "\"" : ""); #else /* !USE_ALT_BLAT_MAILER */ static char bl_cmd_file[512]; FILE *fp; #ifdef __CYGWIN__ char dosname[LY_MAXPATH]; #endif bl_cmd_file[0] = '\0'; if ((fp = LYOpenTemp(bl_cmd_file, ".blt", "w")) == NULL) { HTAlert(FORM_MAILTO_FAILED); return NULL; } #ifdef __CYGWIN__ cygwin_conv_to_full_win32_path(filename, dosname); fprintf(fp, "%s\n", dosname); #else fprintf(fp, "%s\n", filename); #endif fprintf(fp, "-t\n%s\n", address); if (subject) fprintf(fp, "-s\n%s\n", subject); if (!isEmpty(mail_addr)) { fprintf(fp, "-f\n%s\n", mail_addr); } if (!isEmpty(ccaddr)) { fprintf(fp, "-c\n%s\n", ccaddr); } LYCloseOutput(fp); #ifdef __CYGWIN__ cygwin_conv_to_full_win32_path(bl_cmd_file, dosname); HTSprintf0(&b_cmd, "%s \"@%s\"", mail_cmd, dosname); #else HTSprintf0(&b_cmd, "%s @%s", mail_cmd, bl_cmd_file); #endif #endif /* USE_ALT_BLAT_MAILER */ return b_cmd; }
/* A function called through the vtable to open a module with this loader. Returns an opaque representation of the newly opened module for processing with this loader's other vtable functions. */ static lt_module vm_open (lt_user_data LT__UNUSED loader_data, const char *filename, lt_dladvise LT__UNUSED advise) { lt_module module = 0; char *ext; char wpath[MAX_PATH]; size_t len; if (!filename) { /* Get the name of main module */ *wpath = 0; GetModuleFileName (NULL, wpath, sizeof (wpath)); filename = wpath; } else { len = LT_STRLEN (filename); if (len >= MAX_PATH) { LT__SETERROR (CANNOT_OPEN); return 0; } #if HAVE_DECL_CYGWIN_CONV_PATH if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, filename, wpath, MAX_PATH)) { LT__SETERROR (CANNOT_OPEN); return 0; } len = 0; #elif defined __CYGWIN__ cygwin_conv_to_full_win32_path (filename, wpath); len = 0; #else strcpy(wpath, filename); #endif ext = strrchr (wpath, '.'); if (!ext) { /* Append a '.' to stop Windows from adding an implicit '.dll' extension. */ if (!len) len = strlen (wpath); if (len + 1 >= MAX_PATH) { LT__SETERROR (CANNOT_OPEN); return 0; } wpath[len] = '.'; wpath[len+1] = '\0'; } } { /* Silence dialog from LoadLibrary on some failures. */ DWORD errormode = getthreaderrormode (); DWORD last_error; setthreaderrormode (errormode | SEM_FAILCRITICALERRORS, NULL); module = LoadLibrary (wpath); /* Restore the error mode. */ last_error = GetLastError (); setthreaderrormode (errormode, NULL); SetLastError (last_error); } /* libltdl expects this function to fail if it is unable to physically load the library. Sadly, LoadLibrary will search the loaded libraries for a match and return one of them if the path search load fails. We check whether LoadLibrary is returning a handle to an already loaded module, and simulate failure if we find one. */ { lt_dlhandle cur = 0; while ((cur = lt_dlhandle_iterate (iface_id, cur))) { if (!cur->module) { cur = 0; break; } if (cur->module == module) { break; } } if (!module) LOADLIB_SETERROR (CANNOT_OPEN); else if (cur) { LT__SETERROR (CANNOT_OPEN); module = 0; } } return module; }
extern int unlink(const char* path) { int r; int drive; int mask; int suffix; int stop; int oerrno; unsigned long base; char buf[PATH_MAX]; char tmp[MAX_PATH]; #define DELETED_DIR_1 7 #define DELETED_DIR_2 16 static char deleted[] = "%c:\\temp\\.deleted\\%08x.%03x"; static int count = 0; #if __CYGWIN__ DWORD fattr = FILE_ATTRIBUTE_NORMAL|FILE_FLAG_DELETE_ON_CLOSE; DWORD share = FILE_SHARE_DELETE; HANDLE hp; struct stat st; char nat[MAX_PATH]; oerrno = errno; if (lstat(path, &st) || !S_ISREG(st.st_mode)) goto try_unlink; cygwin_conv_to_full_win32_path(path, nat); if (!strncasecmp(nat + 1, ":\\temp\\", 7)) goto try_unlink; drive = nat[0]; path = (const char*)nat; for (;;) { hp = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_DELETE_ON_CLOSE, NULL); if (hp != INVALID_HANDLE_VALUE) { CloseHandle(hp); errno = oerrno; return 0; } if (GetLastError() != ERROR_FILE_NOT_FOUND) break; if (path == (const char*)buf || !execrate(path, buf, sizeof(buf), 1)) { errno = ENOENT; return -1; } path = (const char*)buf; } #else if (sysaccess(path, 0)) #if _win32_botch_access { if (errno != ENOENT || !execrate(path, buf, sizeof(buf), 1) || sysaccess(buf, 0)) return -1; path = (const char*)buf; } #else return -1; #endif drive = 'C': #endif /* * rename to a `deleted' path just in case the file is open * otherwise directory readers may choke on phantom entries */ base = ((getuid() & 0xffff) << 16) | (time(NiL) & 0xffff); suffix = (getpid() & 0xfff) + count++; snprintf(tmp, sizeof(tmp), deleted, drive, base, suffix); if (!sysrename(path, tmp)) { path = (const char*)tmp; goto try_delete; } if (errno != ENOTDIR && errno != ENOENT) goto try_unlink; tmp[DELETED_DIR_2] = 0; if (sysaccess(tmp, 0)) { mask = umask(0); tmp[DELETED_DIR_1] = 0; if (sysaccess(tmp, 0) && mkdir(tmp, S_IRWXU|S_IRWXG|S_IRWXO)) { umask(mask); goto try_unlink; } tmp[DELETED_DIR_1] = '\\'; r = mkdir(tmp, S_IRWXU|S_IRWXG|S_IRWXO); umask(mask); if (r) goto try_unlink; errno = 0; } tmp[DELETED_DIR_2] = '\\'; if (!errno && !sysrename(path, tmp)) { path = (const char*)tmp; goto try_delete; } #if !__CYGWIN__ if (errno == ENOENT) { #if !_win32_botch_access if (execrate(path, buf, sizeof(buf), 1) && !sysrename(buf, tmp)) path = (const char*)tmp; #endif goto try_unlink; } #endif stop = suffix; do { snprintf(tmp, sizeof(tmp), deleted, drive, base, suffix); if (!sysrename(path, tmp)) { path = (const char*)tmp; goto try_delete; } if (++suffix > 0xfff) suffix = 0; } while (suffix != stop); try_delete: #if __CYGWIN__ hp = CreateFile(path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_DELETE_ON_CLOSE, NULL); if (hp != INVALID_HANDLE_VALUE) { CloseHandle(hp); errno = oerrno; return 0; } #endif try_unlink: errno = oerrno; return sysunlink(path); }
// ************************************************************************** // リクエストされたURIのファイルをチェック // documet_rootと、skin置き場をセットで探す。 // // Sets http_recv_info_p->file_type to one of the following: // -2: Directory without the slash // -1: File not found // 0: Normal file // 1: Directory // 2: SVI // 3: plw/upl // 4: tsv // 5: VOB video file // 6: CGI script // 7: ISO DVD image // ************************************************************************** static int http_file_check( HTTP_RECV_INFO *http_recv_info_p) { struct stat send_filestat; int result; int len; unsigned char file_extension[16]; debug_log_output("http_file_check() start."); // --------------- // 作業用変数初期化 // --------------- memset(http_recv_info_p->send_filename, '\0', sizeof(http_recv_info_p->send_filename)); memset(file_extension, '\0', sizeof(file_extension)); // ------------------------- // ファイルチェック // ------------------------- // 要求パスのフルパス生成。 strncpy(http_recv_info_p->send_filename, global_param.document_root, sizeof(http_recv_info_p->send_filename)); strncat(http_recv_info_p->send_filename, http_recv_info_p->recv_uri, sizeof(http_recv_info_p->send_filename)); // Check if the URI is an alias // printf("uri1 is %s\n", http_recv_info_p->recv_uri); // printf("send_filename1 %s\n", http_recv_info_p->send_filename); if(global_param.num_aliases && (http_recv_info_p->recv_uri[0] == '/')) { int i,j,len, skip_stat; char *p; for(i=0; i<global_param.num_aliases; i++) { len = strlen(global_param.alias_name[i]); if ((strncmp(http_recv_info_p->recv_uri + 1, global_param.alias_name[i], len) == 0) && (http_recv_info_p->recv_uri[len+1] == '/') ) { // see code in set_thumb_file in wizd_menu.c p = strrchr(http_recv_info_p->recv_uri, '.'); if (p && isdigit(p[1]) && isdigit(p[2]) && !p[3]) { p[0] = 0; p++; j = atoi(p); skip_stat = 1; } else { j = i; skip_stat = 0; } debug_log_output("substituting alias path '%s' for '%s'\n", global_param.alias_path[j], global_param.alias_name[j]); // The name matches an alias - substitute the alias path strncpy(http_recv_info_p->send_filename, global_param.alias_path[j], sizeof(http_recv_info_p->send_filename)); strncat(http_recv_info_p->send_filename, http_recv_info_p->recv_uri+len+1, sizeof(http_recv_info_p->send_filename)-strlen(http_recv_info_p->send_filename)); if (!skip_stat && stat(http_recv_info_p->send_filename, &send_filestat) != 0) continue; // Set the default allplay type, if it was not specified in the http request if(http_recv_info_p->default_file_type == TYPE_UNKNOWN) { http_recv_info_p->default_file_type = global_param.alias_default_file_type[j]; debug_log_output("Setting default file type to %d\n",http_recv_info_p->default_file_type); } else { debug_log_output("Leaving default file type set at %d\n",http_recv_info_p->default_file_type); } break; } } } // fix up shortcuts # ifdef HAVE_W32API len = strlen(http_recv_info_p->recv_uri); if (len > 4 && strcmp(&http_recv_info_p->recv_uri[len - 4], ".lnk") == 0) { char retPath1[256]; char retPath2[256]; char *p1, *p2; cygwin_conv_to_full_win32_path(http_recv_info_p->send_filename, retPath1); if (get_target(retPath1, retPath2) == 0) { cygwin_conv_to_full_posix_path(retPath2, http_recv_info_p->send_filename); p1 = strrchr(http_recv_info_p->recv_uri, '/'); p1++; p2 = strrchr(http_recv_info_p->send_filename, '/'); p2++; strcpy(p1, p2); } } # endif // printf("send_filename2 %s\n", http_recv_info_p->send_filename); // printf("uri2 is %s\n\n", http_recv_info_p->recv_uri); // '/' が重なってるところの重複を排除。 duplex_character_to_unique(http_recv_info_p->send_filename, '/'); debug_log_output("http_recv_info_p->send_filename='%s'\n", http_recv_info_p->send_filename); // Return "File not found" unless we get a match http_recv_info_p->file_type = -1; // ------------------------------------------------------------ // ファイルあるかチェック。 // ------------------------------------------------------------ result = stat(http_recv_info_p->send_filename, &send_filestat); debug_log_output("stat: result=%d, st_mode=0x%04X, S_ISREG=%d, S_ISDIR=%d size=%lld\n", result, send_filestat.st_mode, S_ISREG(send_filestat.st_mode), S_ISDIR(send_filestat.st_mode), send_filestat.st_size ); http_recv_info_p->file_size = send_filestat.st_size; if(result < 0) { debug_log_output("stat() error\n", result); // ---------------------------------------------------------------------------- // もし、実体が存在しなかったら、skin置き場に変えてもう一度チェック // Skin置き場は実体ファイルのみ認める。 // ---------------------------------------------------------------------------- debug_log_output("DocumentRoot not found. SkinDir Check."); debug_log_output("global_param.skin_root='%s'", global_param.skin_root); debug_log_output("global_param.skin_name='%s'", global_param.skin_name); // skin置き場にあるモノとして、フルパス生成。 strncpy(http_recv_info_p->send_filename, global_param.skin_root, sizeof(http_recv_info_p->send_filename)); strncat(http_recv_info_p->send_filename, global_param.skin_name, sizeof(http_recv_info_p->send_filename)); strncat(http_recv_info_p->send_filename, http_recv_info_p->recv_uri, sizeof(http_recv_info_p->send_filename)); // '/' が重なってるところの重複を排除。 duplex_character_to_unique(http_recv_info_p->send_filename, '/'); debug_log_output("SkinDir:http_recv_info_p->send_filename='%s'\n", http_recv_info_p->send_filename); // ------------------------------------------------------------ // Skin置き場にファイルあるかチェック。 // ------------------------------------------------------------ result = stat(http_recv_info_p->send_filename, &send_filestat); debug_log_output("stat: result=%d, st_mode=%04X, S_ISREG=%d\n", result, send_filestat.st_mode, S_ISREG(send_filestat.st_mode)); if( result < 0 ) { // Strip off the path, and try just the filename in the skin directory unsigned char *ptr = strrchr(http_recv_info_p->recv_uri, '/'); if((ptr != NULL) && (ptr != http_recv_info_p->recv_uri)) { strncpy(http_recv_info_p->send_filename, global_param.skin_root, sizeof(http_recv_info_p->send_filename)); strncat(http_recv_info_p->send_filename, global_param.skin_name, sizeof(http_recv_info_p->send_filename)-strlen(http_recv_info_p->send_filename)); strncat(http_recv_info_p->send_filename, ptr, sizeof(http_recv_info_p->send_filename)-strlen(http_recv_info_p->send_filename)); duplex_character_to_unique(http_recv_info_p->send_filename, '/'); debug_log_output("SkinDir:http_recv_info_p->send_filename='%s'\n", http_recv_info_p->send_filename); result = stat(http_recv_info_p->send_filename, &send_filestat); debug_log_output("stat: result=%d, st_mode=%04X, S_ISREG=%d\n", result, send_filestat.st_mode, S_ISREG(send_filestat.st_mode)); } } // ファイル実体と検知。 if ( ( result < 0 ) || !(S_ISREG(send_filestat.st_mode)) ) { // ------------------------------------- // File Not Found. // やっぱり、404にしよう。 // ------------------------------------- http_recv_info_p->file_type = -1; // Not found return(http_recv_info_p->file_type); } } // stat()の結果で分岐。 if ( ( result == 0 ) && ( S_ISREG(send_filestat.st_mode) == 1 ) ) { // ファイル実体と検知 debug_log_output("'%s' is File!!", http_recv_info_p->send_filename); debug_log_output("send_filestat.st_size= %lld\n", send_filestat.st_size); // Hack to overcome Linkplayer bug - it limits bookmark offset to (2^31)-1 // so we remember the last bookmark served so we can recover the real offset if((http_recv_info_p->range_start_pos == 2147483647) && global_param.bookmark_threshold) { // Check for the real bookmark FILE *fp; off_t offset; char work_buf[WIZD_FILENAME_MAX]; snprintf(work_buf, sizeof(work_buf), "%s.wizd.bookmark", http_recv_info_p->send_filename); debug_log_output("Double-checking bookmark: '%s'", work_buf); fp = fopen(work_buf, "r"); if(fp != NULL) { fgets(work_buf, sizeof(work_buf), fp); fclose(fp); offset = atoll(work_buf); if(offset > http_recv_info_p->range_start_pos) { debug_log_output("Detected LinkPlayer2 bookmark bug, replacing 'Range: %lld-' with 'Range: %lld-'", http_recv_info_p->range_start_pos, offset); http_recv_info_p->range_start_pos = offset; } } } // ------------------------------------------- // ファイルの拡張子より、Content-type を決定 // ------------------------------------------- filename_to_extension(http_recv_info_p->send_filename, file_extension, sizeof(file_extension)); debug_log_output("http_recv_info_p->send_filename='%s', file_extension='%s'\n", http_recv_info_p->send_filename, file_extension); // 拡張子から、mime_typeを導く。 http_recv_info_p->menu_file_type = check_file_extension_to_mime_type(file_extension, http_recv_info_p->mime_type, sizeof(http_recv_info_p->mime_type)); // SVIファイルと実体ファイルで分岐 if (( strcasecmp(file_extension, "svi") == 0 ) || ( strcasecmp(file_extension, "sv3") == 0 )) { http_recv_info_p->file_type = SVI_TYPE; // sviファイル } else if ( ( http_recv_info_p->menu_file_type == TYPE_PLAYLIST ) || ( http_recv_info_p->menu_file_type == TYPE_MUSICLIST )) /*( strcasecmp(file_extension, "plw") == 0 ) || ( strcasecmp(file_extension, "pls") == 0 ) || ( strcasecmp(file_extension, "m3u") == 0 ) || ( strcasecmp(file_extension, "upl") == 0 ) )*/ { http_recv_info_p->file_type = PLW_UPL_TYPE; // plw/upl ファイル } else if (( strcasecmp(file_extension, "vob") == 0 ) || ( strcasecmp(file_extension, "ts") == 0 ) || ( strcasecmp(file_extension, "tp") == 0 ) ) { // VOB_TYPE files combine files with increasing digits at the end of the filename // into one large virtual file http_recv_info_p->file_type = VOB_TYPE; // vobファイル } else if ( strcasecmp(file_extension, "tsv") == 0 ) { http_recv_info_p->file_type = TSV_TYPE; // tsvファイル } else if ( strcasecmp(file_extension, "cgi") == 0 ) { // CGIの実行が不許可なら、Not Found. http_recv_info_p->file_type = (global_param.flag_execute_cgi ? CGI_TYPE : -1 ); // cgiファイル } else if ( http_recv_info_p->menu_file_type == TYPE_ISO ) { http_recv_info_p->file_type = ISO_TYPE; } else { http_recv_info_p->file_type = GENERAL_FILE_TYPE; // File実体 } } else if ( ( result == 0 ) && ( S_ISDIR(send_filestat.st_mode) == 1 ) ) // ディレクトリ { int len; len = strlen(http_recv_info_p->recv_uri); if (len > 0 && http_recv_info_p->recv_uri[len - 1] != '/') { // '/' で終端していないディレクトリ要求の場合... http_recv_info_p->file_type = -2; } // ディレクトリと検知 debug_log_output("'%s' is Dir!!", http_recv_info_p->send_filename); http_recv_info_p->file_type = DIRECTORY_TYPE ; // ディレクトリ } return( http_recv_info_p->file_type ); }
/*************************************************************************** * Function : FP_FullName * * Description: expand relative path to absolute one * * Returns: RESULT_ERR/RESULT_OK * * Notes: None * **************************************************************************/ LOGICAL FP_FullName( char * dest, const char * src ) { #if (OSTYPE!=WIN32) || (COMPILER!=MSVC) size_t i; char *home; #endif if ( !dest ) return RESULT_ERR; *dest = 0; if ( !src ) { getcwd( dest, PATH_MAX ); return RESULT_OK; } #if (OSTYPE==WIN32) && (COMPILER==MSVC) if (!_fullpath(dest, src, PATH_MAX)) return RESULT_ERR; return RESULT_OK; #else /* The realpath() function derives, from the pathname pointed to by file_name, an absolute pathname that names the same file, whose resolution does not involve ".", "..", or sym- bolic links. The generated pathname is stored, up to a max- imum of PATH_MAX bytes, in the buffer pointed to by resolved_name. The realpath() function can handle both relative and abso- lute path names. For absolute path names and the relative names whose resolved name cannot be expressed relatively (for example, ../../reldir), it returns the resolved abso- lute name. For the other relative path names, it returns the resolved relative name. RETURN VALUES On successful completion, realpath() returns a pointer to the resolved name. Otherwise, realpath() returns a null pointer and sets errno to indicate the error, and the con- tents of the buffer pointed to by resolved_name are unde- fined. */ if (src[0]=='~') { /* check for explicit "~" */ if (src[1]=='/' || src[1]==0) { home = getenv("HOME"); dest[0] = 0; if (home) { strcpy(dest, home); } strcat(dest, &src[1]); return RESULT_OK; } else { strcpy(dest, src); return RESULT_OK; } } #if OSTYPE==WIN32 cygwin_conv_to_full_win32_path(src,dest); FP_NormalizePath(dest); return RESULT_OK; #else if (realpath(src, dest)) { return RESULT_OK; } else { /* if path is relative, add current dir before */ if (src[0]!='/') { getcwd( dest, PATH_MAX ); strcat( dest, "/"); strcat( dest, src); return RESULT_OK; } else { strcpy(dest, src); return RESULT_OK; } } #endif return RESULT_ERR; #endif }
void help(char *file) { char fullspec[1024], *temp, *pt; if ( browser[0]=='\0' ) findbrowser(); #ifndef __CygWin if ( browser[0]=='\0' ) { gwwv_post_error(_("No Browser"),_("Could not find a browser. Set the BROWSER environment variable to point to one")); return; } #endif if ( strstr(file,"http://")==NULL ) { fullspec[0] = 0; if ( ! GFileIsAbsolute(file) ) { if ( helpdir==NULL || *helpdir=='\0' ) { #ifdef DOCDIR strcpy(fullspec,DOCDIR "/"); #elif defined(SHAREDIR) strcpy(fullspec,SHAREDIR "/doc/fontforge/"); #else strcpy(fullspec,"/usr/local/share/doc/fontforge/"); #endif } else { strcpy(fullspec,helpdir); } } strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; if ( !GFileReadable( fullspec )) { if ( *file!='/' ) { strcpy(fullspec,"/usr/share/doc/fontforge/"); strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; } } if ( !GFileReadable( fullspec )) { strcpy(fullspec,"http://fontforge.sf.net/"); AppendSupportedLocale(fullspec); strcat(fullspec,file); } else if ( pt!=NULL ) *pt = '#'; } else strcpy(fullspec,file); #if __CygWin if ( (strstrmatch(browser,"/cygdrive")!=NULL || browser[0]=='\0') && strstr(fullspec,":/")==NULL ) { /* It looks as though the browser is a windows application, so we */ /* should give it a windows file name */ char *pt, *tpt; temp = galloc(1024); cygwin_conv_to_full_win32_path(fullspec,temp); for ( pt = fullspec, tpt = temp; *tpt && pt<fullspec+sizeof(fullspec)-3; *pt++ = *tpt++ ) if ( *tpt=='\\' ) *pt++ = '\\'; *pt = '\0'; free(temp); } #endif #if __Mac if ( strcmp(browser,"open")==0 ) /* open doesn't want "file:" prepended */; else #endif if ( strstr(fullspec,":/")==NULL ) { char *t1 = galloc(strlen(fullspec)+strlen("file:")+20); #if __CygWin sprintf( t1, "file:\\\\\\%s", fullspec ); #else sprintf( t1, "file:%s", fullspec); #endif strcpy(fullspec,t1); free(t1); } #if 0 && __Mac /* Starting a Mac application is weird... system() can't do it */ /* Thanks to Edward H. Trager giving me an example... */ if ( strstr(browser,".app")!=NULL ) { *strstr(browser,".app") = '\0'; pt = strrchr(browser,'/'); if ( pt==NULL ) pt = browser-1; ++pt; temp = galloc(strlen(pt)+strlen(fullspec) + strlen( "osascript -l AppleScript -e \"Tell application \"\" to getURL \"\"\"" )+ 20); /* this doesn't work on Max OS X.0 (osascript does not support -e) */ sprintf( temp, "osascript -l AppleScript -e \"Tell application \"%s\" to getURL \"%s\"\"", pt, fullspec); system(temp); ff_post_notice(_("Leave X"),_("A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A")); } else { #elif __Mac /* This seems a bit easier... Thanks to riggle */ if ( strcmp(browser,"open")==0 ) { char *str = "DYLD_LIBRARY_PATH=\"\"; open "; temp = galloc(strlen(str) + strlen(fullspec) + 20); sprintf( temp, "%s \"%s\" &", str, fullspec ); system(temp); } else { #elif __CygWin if ( browser[0]=='\0' ) { do_windows_browser(fullspec); temp = NULL; } else { #else { #endif temp = galloc(strlen(browser) + strlen(fullspec) + 20); sprintf( temp, strcmp(browser,"kfmclient openURL")==0 ? "%s \"%s\" &" : "\"%s\" \"%s\" &", browser, fullspec ); system(temp); } free(temp); } #endif static void UI_IError(const char *format,...) { va_list ap; char buffer[300]; va_start(ap,format); vsnprintf(buffer,sizeof(buffer),format,ap); GDrawIError("%s",buffer); va_end(ap); } #define MAX_ERR_LINES 400 static struct errordata { char *errlines[MAX_ERR_LINES]; GFont *font; int fh, as; GGadget *vsb; GWindow gw, v; int cnt, linecnt; int offtop; int showing; int start_l, start_c, end_l, end_c; int down; } errdata; static void ErrHide(void) { GDrawSetVisible(errdata.gw,false); errdata.showing = false; } static void ErrScroll(struct sbevent *sb) { int newpos = errdata.offtop; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= errdata.linecnt; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += errdata.linecnt; break; case et_sb_bottom: newpos = errdata.cnt-errdata.linecnt; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>errdata.cnt-errdata.linecnt ) newpos = errdata.cnt-errdata.linecnt; if ( newpos<0 ) newpos =0; if ( newpos!=errdata.offtop ) { errdata.offtop = newpos; GScrollBarSetPos(errdata.vsb,errdata.offtop); GDrawRequestExpose(errdata.v,NULL,false); } }
wxChar *wxDoGetCwd(wxChar *buf, int sz) { if ( !buf ) { buf = new wxChar[sz + 1]; } bool ok = false; // for the compilers which have Unicode version of _getcwd(), call it // directly, for the others call the ANSI version and do the translation #if !wxUSE_UNICODE #define cbuf buf #else // wxUSE_UNICODE bool needsANSI = true; #if !defined(HAVE_WGETCWD) char cbuf[_MAXPATHLEN]; #endif #ifdef HAVE_WGETCWD char *cbuf = NULL; // never really used because needsANSI will always be false { ok = _wgetcwd(buf, sz) != NULL; needsANSI = false; } #endif if ( needsANSI ) #endif // wxUSE_UNICODE { #if defined(_MSC_VER) || defined(__MINGW32__) ok = _getcwd(cbuf, sz) != NULL; #else // !Win32/VC++ !Mac ok = getcwd(cbuf, sz) != NULL; #endif // platform #if wxUSE_UNICODE // finally convert the result to Unicode if needed wxConvFile.MB2WC(buf, cbuf, sz); #endif // wxUSE_UNICODE } if ( !ok ) { wxLogSysError(_("Failed to get the working directory")); // VZ: the old code used to return "." on error which didn't make any // sense at all to me - empty string is a better error indicator // (NULL might be even better but I'm afraid this could lead to // problems with the old code assuming the return is never NULL) buf[0] = wxT('\0'); } else // ok, but we might need to massage the path into the right format { // MBN: we hope that in the case the user is compiling a GTK+/Motif app, // he needs Unix as opposed to Win32 pathnames #if defined( __CYGWIN__ ) && defined( __WINDOWS__ ) // another example of DOS/Unix mix (Cygwin) wxString pathUnix = buf; #if wxUSE_UNICODE #if CYGWIN_VERSION_DLL_MAJOR >= 1007 cygwin_conv_path(CCP_POSIX_TO_WIN_W, pathUnix.mb_str(wxConvFile), buf, sz); #else char bufA[_MAXPATHLEN]; cygwin_conv_to_full_win32_path(pathUnix.mb_str(wxConvFile), bufA); wxConvFile.MB2WC(buf, bufA, sz); #endif #else #if CYGWIN_VERSION_DLL_MAJOR >= 1007 cygwin_conv_path(CCP_POSIX_TO_WIN_A, pathUnix, buf, sz); #else cygwin_conv_to_full_win32_path(pathUnix, buf); #endif #endif // wxUSE_UNICODE #endif // __CYGWIN__ } return buf; #if !wxUSE_UNICODE #undef cbuf #endif }
/* A function called through the vtable to open a module with this loader. Returns an opaque representation of the newly opened module for processing with this loader's other vtable functions. */ static lt_module vm_open (lt_user_data LT__UNUSED loader_data, const char *filename, lt_dladvise LT__UNUSED advise) { lt_module module = 0; char *ext; char wpath[MAX_PATH]; size_t len; if (!filename) { /* Get the name of main module */ *wpath = 0; GetModuleFileName (NULL, wpath, sizeof (wpath)); filename = wpath; } else { len = LT_STRLEN (filename); if (len >= MAX_PATH) { LT__SETERROR (CANNOT_OPEN); return 0; } #if defined(__CYGWIN__) cygwin_conv_to_full_win32_path (filename, wpath); len = 0; #else strcpy(wpath, filename); #endif ext = strrchr (wpath, '.'); if (!ext) { /* Append a `.' to stop Windows from adding an implicit `.dll' extension. */ if (!len) len = LT_STRLEN (wpath); if (len + 1 >= MAX_PATH) { LT__SETERROR (CANNOT_OPEN); return 0; } wpath[len] = '.'; wpath[len+1] = '\0'; } } { /* Silence dialog from LoadLibrary on some failures. No way to get the error mode, but to set it, so set it twice to preserve any previous flags. */ UINT errormode = SetErrorMode(SEM_FAILCRITICALERRORS); SetErrorMode(errormode | SEM_FAILCRITICALERRORS); module = LoadLibrary (wpath); /* Restore the error mode. */ SetErrorMode(errormode); } /* libltdl expects this function to fail if it is unable to physically load the library. Sadly, LoadLibrary will search the loaded libraries for a match and return one of them if the path search load fails. We check whether LoadLibrary is returning a handle to an already loaded module, and simulate failure if we find one. */ { lt__handle * cur = 0; while ((cur = (lt__handle *) lt_dlhandle_iterate (iface_id, (lt_dlhandle) cur))) { if (!cur->module) { cur = 0; break; } if (cur->module == module) { break; } } if (cur || !module) { LT__SETERROR (CANNOT_OPEN); module = 0; } } return module; }
static char * pgwin32_CommandLine(bool registration) { static char cmdLine[MAXPGPATH]; int ret; #ifdef __CYGWIN__ char buf[MAXPGPATH]; #endif if (registration) { ret = find_my_exec(argv0, cmdLine); if (ret != 0) { write_stderr(_("%s: could not find own program executable\n"), progname); exit(1); } } else { ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR, cmdLine); if (ret != 0) { write_stderr(_("%s: could not find postgres program executable\n"), progname); exit(1); } } #ifdef __CYGWIN__ /* need to convert to windows path */ #if CYGWIN_VERSION_DLL_MAJOR >= 1007 cygwin_conv_path(CCP_POSIX_TO_WIN_A, cmdLine, buf, sizeof(buf)); #else cygwin_conv_to_full_win32_path(cmdLine, buf); #endif strcpy(cmdLine, buf); #endif if (registration) { if (pg_strcasecmp(cmdLine + strlen(cmdLine) - 4, ".exe")) { /* If commandline does not end in .exe, append it */ strcat(cmdLine, ".exe"); } strcat(cmdLine, " runservice -N \""); strcat(cmdLine, register_servicename); strcat(cmdLine, "\""); } if (pg_data) { strcat(cmdLine, " -D \""); strcat(cmdLine, pg_data); strcat(cmdLine, "\""); } if (registration && do_wait) strcat(cmdLine, " -w"); if (registration && wait_seconds != DEFAULT_WAIT) /* concatenate */ sprintf(cmdLine + strlen(cmdLine), " -t %d", wait_seconds); if (post_opts) { strcat(cmdLine, " "); if (registration) strcat(cmdLine, " -o \""); strcat(cmdLine, post_opts); if (registration) strcat(cmdLine, "\""); } return cmdLine; }
void help(char *file) { char fullspec[1024], *temp, *pt; if ( browser[0]=='\0' ) findbrowser(); #ifndef __CygWin if ( browser[0]=='\0' ) { gwwv_post_error(_("No Browser"),_("Could not find a browser. Set the BROWSER environment variable to point to one")); return; } #endif if ( strstr(file,"http://")==NULL ) { fullspec[0] = 0; if ( *file!='/' ) { if ( helpdir==NULL || *helpdir=='\0' ) { #ifdef DOCDIR strcpy(fullspec,DOCDIR "/"); #elif defined(SHAREDIR) strcpy(fullspec,SHAREDIR "/doc/fontforge/"); #else strcpy(fullspec,"/usr/local/share/doc/fontforge/"); #endif } else strcpy(fullspec,helpdir); } strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; if ( !GFileReadable( fullspec )) { if ( *file!='/' ) { strcpy(fullspec,"/usr/share/doc/fontforge/"); strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; } } if ( !GFileReadable( fullspec )) { strcpy(fullspec,"http://fontforge.sf.net/"); AppendSupportedLocale(fullspec); strcat(fullspec,file); } else if ( pt!=NULL ) *pt = '#'; } else strcpy(fullspec,file); #if __CygWin if ( (strstrmatch(browser,"/cygdrive")!=NULL || browser[0]=='\0') && strstr(fullspec,":/")==NULL ) { /* It looks as though the browser is a windows application, so we */ /* should give it a windows file name */ char *pt, *tpt; temp = galloc(1024); cygwin_conv_to_full_win32_path(fullspec,temp); for ( pt = fullspec, tpt = temp; *tpt && pt<fullspec+sizeof(fullspec)-3; *pt++ = *tpt++ ) if ( *tpt=='\\' ) *pt++ = '\\'; *pt = '\0'; free(temp); } #endif #if __Mac if ( strcmp(browser,"open")==0 ) /* open doesn't want "file:" prepended */; else #endif if ( strstr(fullspec,":/")==NULL ) { char *t1 = galloc(strlen(fullspec)+strlen("file:")+20); #if __CygWin sprintf( t1, "file:\\\\\\%s", fullspec ); #else sprintf( t1, "file:%s", fullspec); #endif strcpy(fullspec,t1); free(t1); } #if 0 && __Mac /* Starting a Mac application is weird... system() can't do it */ /* Thanks to Edward H. Trager giving me an example... */ if ( strstr(browser,".app")!=NULL ) { *strstr(browser,".app") = '\0'; pt = strrchr(browser,'/'); if ( pt==NULL ) pt = browser-1; ++pt; temp = galloc(strlen(pt)+strlen(fullspec) + strlen( "osascript -l AppleScript -e \"Tell application \"\" to getURL \"\"\"" )+ 20); /* this doesn't work on Max OS X.0 (osascript does not support -e) */ sprintf( temp, "osascript -l AppleScript -e \"Tell application \"%s\" to getURL \"%s\"\"", pt, fullspec); system(temp); ff_post_notice(_("Leave X"),_("A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A")); } else { #elif __Mac /* This seems a bit easier... Thanks to riggle */ if ( strcmp(browser,"open")==0 ) { temp = galloc(strlen(browser) + strlen(fullspec) + 20); sprintf( temp, "open \"%s\" &", fullspec ); system(temp); ff_post_notice(_("Leave X"),_("A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A")); } else { #elif __CygWin if ( browser[0]=='\0' ) { do_windows_browser(fullspec); temp = NULL; } else { #else { #endif temp = galloc(strlen(browser) + strlen(fullspec) + 20); sprintf( temp, strcmp(browser,"kfmclient openURL")==0 ? "%s \"%s\" &" : "\"%s\" \"%s\" &", browser, fullspec ); system(temp); } free(temp); } #define MAX_ERR_LINES 200 static struct errordata { char *errlines[MAX_ERR_LINES]; int fh, as; GtkWidget *vsb; GtkWidget *gw, *v; PangoLayout *layout; int cnt, linecnt; int offtop; int showing; } errdata; static void Warning_Hide(void) { gdk_window_hide(errdata.gw->window); errdata.showing = false; } static void Warning_VScroll(GtkRange *vsb, gpointer user_data) { GtkAdjustment *sb; sb = gtk_range_get_adjustment(GTK_RANGE(vsb)); if ( sb->value!=errdata.offtop) { int diff = sb->value-errdata.offtop; errdata.offtop = sb->value; gdk_window_scroll(GDK_WINDOW(errdata.v->window),0,diff*errdata.fh); } } static gboolean Warning_Resize(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { GtkAdjustment *sb; errdata.linecnt = widget->allocation.width/errdata.fh; sb = gtk_range_get_adjustment(GTK_RANGE(errdata.vsb)); sb->lower = 0; sb->upper = errdata.cnt; sb->page_size = errdata.linecnt; sb->step_increment = 1; sb->page_increment = errdata.linecnt; if ( errdata.offtop>=errdata.cnt-errdata.linecnt ) errdata.offtop = errdata.cnt-errdata.linecnt; if ( errdata.offtop<0 ) errdata.offtop =0; sb->value = errdata.offtop; gtk_range_set_adjustment(GTK_RANGE(errdata.vsb),sb); return 0; }
void help(char *file) { if(file) { int len = strlen(file); char* p_file = (char*) malloc(len+1); char* p_uri = (char*) malloc(len+1024); char* p_param = NULL; strcpy(p_file, file); { char* delim = strrchr(p_file, '#'); if(delim) { p_param = (char*) malloc(len+1); strcpy(p_param, delim); *delim = '\0'; } } strcpy(p_uri, p_file); if(! GFileIsAbsolute(p_uri)) { char* p_helpdir = (char*) malloc(1024); #if __CygWin { /* cygwin */ #if defined(DOCDIR) strncpy( p_helpdir, DOCDIR "/", 1024 ); #elif defined(SHAREDIR) strncpy( p_helpdir, SHAREDIR "/doc/fontforge/", 1024 ); #else strncpy( p_helpdir, "/usr/local/share/doc/fontforge/", 1024 ); #endif } #else { /* mingw */ strcpy( p_helpdir, GResourceProgramDir ); strcat( p_helpdir, "/doc/fontforge/"); } #endif /* /usr/share/fontforge/doc/ja/file */ strcpy(p_uri, p_helpdir); AppendSupportedLocale(p_uri); strcat(p_uri, p_file); if(!GFileReadable(p_uri)) { strcpy(p_uri, p_helpdir); strcat(p_uri, p_file); if(!GFileReadable(p_uri)) { strcpy(p_uri, "http://fontforge.org/"); /* AppendSupportedLocale(p_uri); */ strcat(p_uri, p_file); } } free(p_helpdir); } #if __CygWin if( strncmp(p_uri, "http:", 5) != 0 ) { char* temp = (char*) malloc(1024); cygwin_conv_to_full_win32_path(p_uri, temp); free(p_uri); p_uri = temp; } #endif if(p_param) { strcat(p_uri, p_param); free(p_param); } /* using default browser */ ShellExecute(NULL, "open", p_uri, NULL, NULL, SW_SHOWDEFAULT); free(p_uri); free(p_file); } }