⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ltdl.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
📖 第 1 页 / 共 4 页
字号:
#endif		 && (path[1+ src] != '/'))	  {	    canonical[dest++] = '/';	  }      }    /* Add an end-of-string marker at the end.  */    canonical[dest] = LT_EOS_CHAR;  }  /* Assign new value.  */  *pcanonical = canonical;  return 0;}static intargzize_path (const char *path, char **pargz, size_t *pargz_len){  error_t error;  assert (path);  assert (pargz);  assert (pargz_len);  if ((error = argz_create_sep (path, LT_PATHSEP_CHAR, pargz, pargz_len)))    {      switch (error)	{	case ENOMEM:	  LT__SETERROR (NO_MEMORY);	  break;	default:	  LT__SETERROR (UNKNOWN);	  break;	}      return 1;    }  return 0;}/* Repeatedly call FUNC with each LT_PATHSEP_CHAR delimited element   of SEARCH_PATH and references to DATA1 and DATA2, until FUNC returns   non-zero or all elements are exhausted.  If BASE_NAME is non-NULL,   it is appended to each SEARCH_PATH element before FUNC is called.  */static intforeach_dirinpath (const char *search_path, const char *base_name,		   foreach_callback_func *func, void *data1, void *data2){  int	 result		= 0;  size_t filenamesize	= 0;  size_t lenbase	= LT_STRLEN (base_name);  size_t argz_len	= 0;  char *argz		= 0;  char *filename	= 0;  char *canonical	= 0;  if (!search_path || !*search_path)    {      LT__SETERROR (FILE_NOT_FOUND);      goto cleanup;    }  if (canonicalize_path (search_path, &canonical) != 0)    goto cleanup;  if (argzize_path (canonical, &argz, &argz_len) != 0)    goto cleanup;  {    char *dir_name = 0;    while ((dir_name = argz_next (argz, argz_len, dir_name)))      {	size_t lendir = LT_STRLEN (dir_name);	if (1+ lendir + lenbase >= filenamesize)	{	  FREE (filename);	  filenamesize	= 1+ lendir + 1+ lenbase; /* "/d" + '/' + "f" + '\0' */	  filename	= MALLOC (char, filenamesize);	  if (!filename)	    goto cleanup;	}	assert (filenamesize > lendir);	strcpy (filename, dir_name);	if (base_name && *base_name)	  {	    if (filename[lendir -1] != '/')	      filename[lendir++] = '/';	    strcpy (filename +lendir, base_name);	  }	if ((result = (*func) (filename, data1, data2)))	  {	    break;	  }      }  } cleanup:  FREE (argz);  FREE (canonical);  FREE (filename);  return result;}/* If FILEPATH can be opened, store the name of the directory component   in DATA1, and the opened FILE* structure address in DATA2.  Otherwise   DATA1 is unchanged, but DATA2 is set to a pointer to NULL.  */static intfind_file_callback (char *filename, void *data1, void *data2){  char	     **pdir	= (char **) data1;  FILE	     **pfile	= (FILE **) data2;  int	     is_done	= 0;  assert (filename && *filename);  assert (pdir);  assert (pfile);  if ((*pfile = fopen (filename, LT_READTEXT_MODE)))    {      char *dirend = strrchr (filename, '/');      if (dirend > filename)	*dirend   = LT_EOS_CHAR;      FREE (*pdir);      *pdir   = lt__strdup (filename);      is_done = (*pdir == 0) ? -1 : 1;    }  return is_done;}static FILE *find_file (const char *search_path, const char *base_name, char **pdir){  FILE *file = 0;  foreach_dirinpath (search_path, base_name, find_file_callback, pdir, &file);  return file;}static intfind_handle_callback (char *filename, void *data, void *data2){  lt_dlhandle  *handle		= (lt_dlhandle *) data;  int		notfound	= access (filename, R_OK);  lt_dladvise   advise		= (lt_dladvise) data2;  /* Bail out if file cannot be read...  */  if (notfound)    return 0;  /* Try to dlopen the file, but do not continue searching in any     case.  */  if (tryall_dlopen (handle, filename, advise, 0) != 0)    *handle = 0;  return 1;}/* If HANDLE was found return it, otherwise return 0.  If HANDLE was   found but could not be opened, *HANDLE will be set to 0.  */static lt_dlhandle *find_handle (const char *search_path, const char *base_name,	     lt_dlhandle *handle, lt_dladvise advise){  if (!search_path)    return 0;  if (!foreach_dirinpath (search_path, base_name, find_handle_callback,			  handle, advise))    return 0;  return handle;}#if !defined(LTDL_DLOPEN_DEPLIBS)static intload_deplibs (lt_dlhandle handle, char * LT__UNUSED deplibs){  ((lt__handle *) handle)->depcount = 0;  return 0;}#else /* defined(LTDL_DLOPEN_DEPLIBS) */static intload_deplibs (lt_dlhandle handle, char *deplibs){  char	*p, *save_search_path = 0;  int   depcount = 0;  int	i;  char	**names = 0;  int	errors = 0;  ((lt__handle *) handle)->depcount = 0;  if (!deplibs)    {      return errors;    }  ++errors;  if (user_search_path)    {      save_search_path = lt__strdup (user_search_path);      if (!save_search_path)	goto cleanup;    }  /* extract search paths and count deplibs */  p = deplibs;  while (*p)    {      if (!isspace ((unsigned char) *p))	{	  char *end = p+1;	  while (*end && !isspace((unsigned char) *end))	    {	      ++end;	    }	  if (strncmp(p, "-L", 2) == 0 || strncmp(p, "-R", 2) == 0)	    {	      char save = *end;	      *end = 0; /* set a temporary string terminator */	      if (lt_dladdsearchdir(p+2))		{		  goto cleanup;		}	      *end = save;	    }	  else	    {	      ++depcount;	    }	  p = end;	}      else	{	  ++p;	}    }  if (!depcount)    {      errors = 0;      goto cleanup;    }  names = MALLOC (char *, depcount);  if (!names)    goto cleanup;  /* now only extract the actual deplibs */  depcount = 0;  p = deplibs;  while (*p)    {      if (isspace ((unsigned char) *p))	{	  ++p;	}      else	{	  char *end = p+1;	  while (*end && !isspace ((unsigned char) *end))	    {	      ++end;	    }	  if (strncmp(p, "-L", 2) != 0 && strncmp(p, "-R", 2) != 0)	    {	      char *name;	      char save = *end;	      *end = 0; /* set a temporary string terminator */	      if (strncmp(p, "-l", 2) == 0)		{		  size_t name_len = 3+ /* "lib" */ LT_STRLEN (p + 2);		  name = MALLOC (char, 1+ name_len);		  if (name)		    sprintf (name, "lib%s", p+2);		}	      else		name = lt__strdup(p);	      if (!name)		goto cleanup_names;	      names[depcount++] = name;	      *end = save;	    }	  p = end;	}    }  /* load the deplibs (in reverse order)     At this stage, don't worry if the deplibs do not load correctly,     they may already be statically linked into the loading application     for instance.  There will be a more enlightening error message     later on if the loaded module cannot resolve all of its symbols.  */  if (depcount)    {      lt__handle *cur = (lt__handle *) handle;      int	j = 0;      cur->deplibs = (lt_dlhandle *) MALLOC (lt__handle, depcount);      if (!cur->deplibs)	goto cleanup_names;      for (i = 0; i < depcount; ++i)	{	  cur->deplibs[j] = lt_dlopenext(names[depcount-1-i]);	  if (cur->deplibs[j])	    {	      ++j;	    }	}      cur->depcount	= j;	/* Number of successfully loaded deplibs */      errors		= 0;    } cleanup_names:  for (i = 0; i < depcount; ++i)    {      FREE (names[i]);    } cleanup:  FREE (names);  /* restore the old search path */  if (save_search_path) {    MEMREASSIGN (user_search_path, save_search_path);  }  return errors;}#endif /* defined(LTDL_DLOPEN_DEPLIBS) */static intunload_deplibs (lt_dlhandle handle){  int i;  int errors = 0;  lt__handle *cur = (lt__handle *) handle;  if (cur->depcount)    {      for (i = 0; i < cur->depcount; ++i)	{	  if (!LT_DLIS_RESIDENT (cur->deplibs[i]))	    {	      errors += lt_dlclose (cur->deplibs[i]);	    }	}      FREE (cur->deplibs);    }  return errors;}static inttrim (char **dest, const char *str){  /* remove the leading and trailing "'" from str     and store the result in dest */  const char *end   = strrchr (str, '\'');  size_t len	    = LT_STRLEN (str);  char *tmp;  FREE (*dest);  if (!end)    return 1;  if (len > 3 && str[0] == '\'')    {      tmp = MALLOC (char, end - str);      if (!tmp)	return 1;      memcpy(tmp, &str[1], (end - str) - 1);      tmp[len-3] = LT_EOS_CHAR;      *dest = tmp;    }  else    {      *dest = 0;    }  return 0;}/* Read the .la file FILE. */static intparse_dotla_file(FILE *file, char **dlname, char **libdir, char **deplibs,    char **old_name, int *installed){  int		errors = 0;  size_t	line_len = LT_FILENAME_MAX;  char *	line = MALLOC (char, line_len);  if (!line)    {      LT__SETERROR (FILE_NOT_FOUND);      return 1;    }  while (!feof (file))    {      if (!fgets (line, (int) line_len, file))	{	  break;	}      /* Handle the case where we occasionally need to read a line	 that is longer than the initial buffer size.  */      while ((line[LT_STRLEN(line) -1] != '\n') && (!feof (file)))	{	  line = REALLOC (char, line, line_len *2);	  if (!line)	    {	      fclose (file);	      ++errors;	      goto cleanup;	    }	  if (!fgets (&line[line_len -1], (int) line_len +1, file))	    {	      break;	    }	  line_len *= 2;	}      if (line[0] == '\n' || line[0] == '#')	{	  continue;	}#undef  STR_DLNAME#define STR_DLNAME	"dlname="      if (strncmp (line, STR_DLNAME, sizeof (STR_DLNAME) - 1) == 0)	{	  errors += trim (dlname, &line[sizeof (STR_DLNAME) - 1]);	}#undef  STR_OLD_LIBRARY#define STR_OLD_LIBRARY	"old_library="      else if (strncmp (line, STR_OLD_LIBRARY,	    sizeof (STR_OLD_LIBRARY) - 1) == 0)	{	  errors += trim (old_name, &line[sizeof (STR_OLD_LIBRARY) - 1]);	}#undef  STR_LIBDIR#define STR_LIBDIR	"libdir="      else if (strncmp (line, STR_LIBDIR, sizeof (STR_LIBDIR) - 1) == 0)	{	  errors += trim (libdir, &line[sizeof(STR_LIBDIR) - 1]);	}#undef  STR_DL_DEPLIBS#define STR_DL_DEPLIBS	"dependency_libs="      else if (strncmp (line, STR_DL_DEPLIBS,	    sizeof (STR_DL_DEPLIBS) - 1) == 0)	{	  errors += trim (deplibs, &line[sizeof (STR_DL_DEPLIBS) - 1]);	}      else if (streq (line, "installed=yes\n"))	{	  *installed = 1;	}      else if (streq (line, "installed=no\n"))	{	  *installed = 0;	}#undef  STR_LIBRARY_NAMES#define STR_LIBRARY_NAMES "library_names="      else if (!*dlname && strncmp (line, STR_LIBRARY_NAMES,	    sizeof (STR_LIBRARY_NAMES) - 1) == 0)	{	  char *last_libname;	  errors += trim (dlname, &line[sizeof (STR_LIBRARY_NAMES) - 1]);	  if (!errors	      && *dlname	      && (last_libname = strrchr (*dlname, ' ')) != 0)	    {	      last_libname = lt__strdup (last_libname + 1);	      if (!last_libname)		{		  ++errors;		  goto cleanup;		}	      MEMREASSIGN (*dlname, last_libname);	    }	}      if (errors)	break;    }cleanup:  FREE (line);  return errors;}/* Try to open FILENAME as a module. */static inttry_dlopen (lt_dlhandle *phandle, const char *filename, const char *ext,	    lt_dladvise advise){  const char *	saved_error	= 0;  char *	canonical	= 0;  char *	base_name	= 0;  char *	dir		= 0;  char *	name		= 0;  char *        attempt		= 0;  int		errors		= 0;  lt_dlhandle	newhandle;  assert (phandle);  assert (*phandle == 0);#ifdef LT_DEBUG_LOADERS  fprintf (stderr, "try_dlopen (%s, %s)\n",	   filename ? filename : "(null)",	   ext ? ext : "(null)");#endif  LT__GETERROR (saved_error);  /* dlopen self? */  if (!filename)    {      *phandle = (lt_dlhandle) lt__zalloc (sizeof (lt__handle));      if (*phandle == 0)	return 1;      newhandle	= *phandle;      /* lt_dlclose()ing yourself is very bad!  Disallow it.  */      ((lt__handle *) newhandle)->info.is_resident = 1;      if (tryall_dlopen (&newhandle, 0, advise, 0) != 0)	{	  FREE (*phandle);	  return 1;	}      goto register_handle;    }  assert (filename && *filename);  if (ext)    {      attempt = MALLOC (char, LT_STRLEN (filename) + LT_STRLEN (ext) + 1);      if (!attempt)	return 1;      sprintf(attempt, "%s%s", filename, ext);    }  else    {      attempt = lt__strdup (filename);      if (!attempt)	return 1;    }  /* Doing this immediately allows internal functions to safely     assume only canonicalized paths are passed.  */  if (canonicalize_path (attempt, &canonical) != 0)    {      ++errors;      goto cleanup;    }  /* If the canonical module name is a path (relative or absolute)     then split it into a directory part and a name part.  */  base_name = strrchr (canonical, '/');  if (base_name)    {      size_t dirlen = (1+ base_name) - canonical;      dir = MALLOC (char, 1+ dirlen);      if (!dir)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -