summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libdl/_dl_search.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libdl/_dl_search.c')
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_search.c81
1 files changed, 54 insertions, 27 deletions
diff --git a/mdk-stage1/dietlibc/libdl/_dl_search.c b/mdk-stage1/dietlibc/libdl/_dl_search.c
index 5e3217d46..ccf9c51c5 100644
--- a/mdk-stage1/dietlibc/libdl/_dl_search.c
+++ b/mdk-stage1/dietlibc/libdl/_dl_search.c
@@ -1,68 +1,95 @@
-#include <unistd.h>
#include <stdlib.h>
-#include <string.h>
#include <dlfcn.h>
#include <fcntl.h>
-#include <stdio.h>
+
+#include "_dl_int.h"
#define WANT_LD_SO_CONF_SEARCH
static const char *_dl_search_rpath=0;
+
+#ifndef __DIET_LD_SO__
+#include <unistd.h>
+#include <string.h>
void _dl_set_rpath(const char *path) { _dl_search_rpath=path; }
+const char* _dl_get_rpath() { return _dl_search_rpath; }
+#endif
/* search a colon (semicolon) seperated path for the libraray "filename" */
-static int _dl_search_path(char *buf, int len, const char*path, const int pathlen, const char *filename)
-{
- int fd,l=len,i=1;
- const char *c,*pe=path+pathlen;
+static int _dl_search_path(char*buf,int len,const char*path,const int pathlen,const char*filename) {
+ int fd,i=1,fl=strlen(filename),ml=len-fl;
+ const char*c,*pe=path+pathlen;
if (path) {
- for (c=path; c<pe; c+=i) {
+ for (c=path;c<pe;c+=i) {
+ int l=len-1;
if ((*c==':')||(*c==';')) ++c;
i=strcspn(c,":;");
if (i) {
- strncpy(buf, c, i); buf[i]=0;
- l-=i;
- strncat(buf, "/", l);
+ if (i>ml) continue; /* if len(path-entry)+len(filename)+2 is greater than the buffer ? SKIP */
+ memcpy(buf,c,i);
+ buf[i]='/';
+ l-=++i;
}
- else
- buf[0]=0;
- strncat(buf, filename, --l);
-// printf("_dl_search: %s\n",buf);
+ memcpy(buf+i,filename,fl);
+ buf[i+fl]=0;
+#ifdef DEBUG
+// pf(__func__": "); pf(buf); pf("\n");
+#endif
+#ifdef __DIET_LD_SO__
+ if ((fd=_dl_sys_open(buf,O_RDONLY,0))>-1) return fd;
+#else
if ((fd=open(buf,O_RDONLY))!=-1) return fd;
+#endif
}
}
return -1;
}
/* parse the SMALL file "conf" for lib directories (aem... hang me if you can :) ) */
-static int _dl_search_conf(char *buf, int len, const char *conf, const char *filename)
-{
+static int _dl_search_conf(char*buf,int len,const char*conf,const char*filename) {
char ld_so_conf[1024];
- int i,l,fd=open(conf,O_RDONLY);
- if (fd!=-1) {
+ int i,l,fd;
+#ifdef __DIET_LD_SO__
+ if ((fd=_dl_sys_open(conf,O_RDONLY,0))>-1) {
+ l=_dl_sys_read(fd,ld_so_conf,sizeof(ld_so_conf)-1);
+#else
+ if ((fd=open(conf,O_RDONLY))!=-1) {
l=read(fd,ld_so_conf,sizeof(ld_so_conf)-1);
+#endif
ld_so_conf[sizeof(ld_so_conf)-1]=0;
+#ifdef __DIET_LD_SO__
+ _dl_sys_close(fd);
+#else
close(fd);
- if (ld_so_conf[l-1]=='\n') ld_so_conf[--l]=0;
- for (i=0;i<l;i++) if (ld_so_conf[i]=='\n') ld_so_conf[i]=':';
- if ((fd=_dl_search_path(buf,len,ld_so_conf,l,filename))!=-1) return fd;
+#endif
+ if (l>0) {
+ if (ld_so_conf[l-1]=='\n') ld_so_conf[--l]=0;
+ for (i=0;i<l;i++) if (ld_so_conf[i]=='\n') ld_so_conf[i]=':';
+ if ((fd=_dl_search_path(buf,len,ld_so_conf,l,filename))!=-1) return fd;
+ }
}
return -1;
}
-int _dl_search(char *buf, int len, const char *filename)
-{
+#ifdef __DIET_LD_SO__
+static
+#endif
+int _dl_search(char*buf,int len,const char*filename) {
int fd;
- /* 1. search the LD_RUN_PATH (from the executable */
+ /* 1. search the LD_RUN_PATH (from the executable) */
if (_dl_search_rpath) {
if ((fd=_dl_search_path(buf,len,_dl_search_rpath,strlen(_dl_search_rpath),filename))!=-1) return fd;
}
/* 2. IF we have a "secure" enviroment THEN search LD_LIBRARY_PATH */
- if (getuid()==geteuid()) {
+#ifdef __DIET_LD_SO__
+ if ((at_uid==at_euid)&&(at_gid==at_egid)) {
+#else
+ if ((getuid()==geteuid())&&(getgid()==getegid())) {
+#endif
char *p=getenv("LD_LIBRARY_PATH");
if (p)
if ((fd=_dl_search_path(buf,len,p,strlen(p),filename))!=-1) return fd;
@@ -78,7 +105,7 @@ int _dl_search(char *buf, int len, const char *filename)
/* default path search */
{
- const char* def_path="/usr/lib:/lib";
+ const char def_path[]="/usr/lib:/lib";
return _dl_search_path(buf,len,def_path,strlen(def_path),filename);
}
}