static SLCONST char *get_import_module_path (void) { char *path; if (Module_Path != NULL) return Module_Path; if (NULL != (path = _pSLsecure_getenv (MODULE_PATH_ENV_NAME))) return path; return MODULE_INSTALL_DIR; }
SLterminfo_Type *_pSLtt_tigetent (SLCONST char *term) { SLCONST char **tidirs, *tidir; FILE *fp = NULL; char file[1024]; static char home_ti [1024]; char *env; SLterminfo_Type *ti; if ( (term == NULL) #ifdef SLANG_UNTIC && (SLang_Untic_Terminfo_File == NULL) #endif ) return NULL; if (_pSLsecure_issetugid () && ((term[0] == '.') || (NULL != strchr (term, '/')))) return NULL; if (NULL == (ti = (SLterminfo_Type *) SLmalloc (sizeof (SLterminfo_Type)))) { return NULL; } memset ((char *)ti, 0, sizeof (SLterminfo_Type)); #ifdef SLANG_UNTIC if (SLang_Untic_Terminfo_File != NULL) { fp = open_terminfo (SLang_Untic_Terminfo_File, ti); goto fp_open_label; } else #endif /* If we are on a termcap based system, use termcap */ if (0 == tcap_getent (term, ti)) return ti; if (NULL != (env = _pSLsecure_getenv ("TERMINFO"))) Terminfo_Dirs[0] = env; if (NULL != (env = _pSLsecure_getenv ("HOME"))) { strncpy (home_ti, env, sizeof (home_ti) - 11); home_ti [sizeof(home_ti) - 11] = 0; strcat (home_ti, "/.terminfo"); Terminfo_Dirs [1] = home_ti; } tidirs = Terminfo_Dirs; while (NULL != (tidir = *tidirs++)) { if (*tidir == 0) continue; if (sizeof (file) > strlen (tidir) + 5 + strlen (term)) { sprintf (file, "%s/%c/%s", tidir, *term, term); if (NULL != (fp = open_terminfo (file, ti))) break; sprintf (file, "%s/%02x/%s", tidir, (unsigned char)*term, term); if (NULL != (fp = open_terminfo (file, ti))) break; } } #ifdef SLANG_UNTIC fp_open_label: #endif if (fp == NULL) { SLfree ((char *) ti); return NULL; } ti->flags = SLTERMINFO; if ((NULL == read_terminal_names (fp, ti)) || (NULL == read_boolean_flags (fp, ti)) || (NULL == read_numbers (fp, ti)) || (NULL == read_string_offsets (fp, ti)) || (NULL == read_string_table (fp, ti))) { _pSLtt_tifreeent (ti); ti = NULL; } (void) fclose (fp); return ti; }
static Handle_Type *dynamic_link_module (SLFUTURE_CONST char *module) { Handle_Type *h; VOID_STAR handle; SLFUTURE_CONST char *err; char filebuf[1024]; char *save_file; char *save_err; int api_version; int *api_version_ptr; #define MAX_MODULE_NAME_SIZE 256 char module_so[MAX_MODULE_NAME_SIZE + 32]; char *module_name; char *file, *pathfile; if (strlen (module) >= MAX_MODULE_NAME_SIZE) { _pSLang_verror (SL_LimitExceeded_Error, "module name too long"); return NULL; } SLsnprintf (module_so, sizeof(module_so), "%s-module.%s", module, SO_SUFFIX); if (Module_Path != NULL) pathfile = SLpath_find_file_in_path (Module_Path, module_so); else pathfile = NULL; if ((pathfile == NULL) && (NULL != (pathfile = _pSLsecure_getenv (MODULE_PATH_ENV_NAME)))) pathfile = SLpath_find_file_in_path (pathfile, module_so); if (pathfile == NULL) pathfile = SLpath_find_file_in_path (MODULE_INSTALL_DIR, module_so); if (pathfile != NULL) file = pathfile; else file = module_so; save_err = NULL; save_file = file; while (1) { #ifndef RTLD_GLOBAL # define RTLD_GLOBAL 0 #endif #ifdef RTLD_NOW handle = (VOID_STAR) dlopen (file, RTLD_NOW | RTLD_GLOBAL); #else handle = (VOID_STAR) dlopen (file, RTLD_LAZY | RTLD_GLOBAL); #endif if (handle != NULL) { if (_pSLang_Load_File_Verbose & SLANG_LOAD_MODULE_VERBOSE) SLang_vmessage ("Importing %s", file); if (save_err != NULL) SLfree (save_err); break; } /* Purify reports that dlerror returns a pointer that generates UMR * errors. There is nothing that I can do about that.... */ if ((NULL == strchr (file, '/')) && (strlen(file) < sizeof(filebuf))) { err = (char *) dlerror (); if (err != NULL) save_err = SLmake_string (err); SLsnprintf (filebuf, sizeof (filebuf), "./%s", file); file = filebuf; continue; } if ((NULL == (err = save_err)) && (NULL == (err = (char *) dlerror ()))) err = "UNKNOWN"; _pSLang_verror (SL_Import_Error, "Error linking to %s: %s", save_file, err); if (save_err != NULL) SLfree (save_err); if (pathfile != NULL) SLfree (pathfile); return NULL; } /* Using SLpath_basename allows, e.g., import ("/path/to/module"); */ module_name = SLpath_basename (module); api_version_ptr = (int *) do_dlsym (handle, file, 0, "SLmodule_%s_api_version", module_name); if (api_version_ptr == NULL) api_version_ptr = (int *) do_dlsym (handle, file, 0, "_SLmodule_%s_api_version", module_name); if (api_version_ptr == NULL) api_version = 0; else api_version = *api_version_ptr; if ((-1 == check_api_version (file, api_version)) || (NULL == (h = allocate_handle_type (module, handle)))) { SLfree (pathfile); /* NULL ok */ dlclose (handle); return NULL; } if (NULL == (h->ns_init_fun = (int (*)(SLCONST char *)) do_dlsym (handle, file, 1, "init_%s_module_ns", module_name))) { SLfree (pathfile); free_handle_type (h); dlclose (handle); return NULL; } h->deinit_fun = (void (*)(void)) do_dlsym (handle, file, 0, "deinit_%s_module", module_name); SLfree (pathfile); /* NULL ok */ h->next = Handle_List; Handle_List = h; return h; }
SLterminfo_Type *_pSLtt_tigetent (char *term) { char *tidir; int i; FILE *fp = NULL; char file[1024]; static char home_ti [1024]; char *home; SLterminfo_Type *ti; if ( (term == NULL) #ifdef SLANG_UNTIC && (SLang_Untic_Terminfo_File == NULL) #endif ) return NULL; if (_pSLsecure_issetugid () && ((term[0] == '.') || (NULL != strchr (term, '/')))) return NULL; if (NULL == (ti = (SLterminfo_Type *) SLmalloc (sizeof (SLterminfo_Type)))) { return NULL; } #ifdef SLANG_UNTIC if (SLang_Untic_Terminfo_File != NULL) { fp = open_terminfo (SLang_Untic_Terminfo_File, ti); goto fp_open_label; } else #endif /* If we are on a termcap based system, use termcap */ if (0 == tcap_getent (term, ti)) return ti; if (NULL != (home = _pSLsecure_getenv ("HOME"))) { size_t len = strlen (home); if (len > sizeof (home_ti) - sizeof ("/.terminfo")) len = sizeof (home_ti) - sizeof ("/.terminfo"); memcpy (home_ti, home, len); memcpy (home_ti + len, "/.terminfo", sizeof ("/.terminfo")); Terminfo_Dirs [0] = home_ti; } Terminfo_Dirs[1] = _pSLsecure_getenv ("TERMINFO"); i = 0; while (1) { tidir = Terminfo_Dirs[i]; if (tidir != NULL) { if (*tidir == 0) break; /* last one */ if (sizeof (file) >= strlen (tidir) + 4 + strlen (term)) { sprintf (file, "%s/%c/%s", tidir, *term, term); if (NULL != (fp = open_terminfo (file, ti))) break; } } i++; } #ifdef SLANG_UNTIC fp_open_label: #endif if (fp != NULL) { if (NULL != read_terminal_names (fp, ti)) { if (NULL != read_boolean_flags (fp, ti)) { if (NULL != read_numbers (fp, ti)) { if (NULL != read_string_offsets (fp, ti)) { if (NULL != read_string_table (fp, ti)) { /* success */ fclose (fp); ti->flags = SLTERMINFO; return ti; } SLfree ((char *)ti->string_offsets); } SLfree ((char *)ti->numbers); } SLfree ((char *)ti->boolean_flags); } SLfree ((char *)ti->terminal_names); } fclose (fp); } SLfree ((char *)ti); return NULL; }