Lucho, thanks for the review.
On Wed, Sep 10, 2008 at 3:59 PM, Latchesar Ionkov <[EMAIL PROTECTED]> wrote:
>
> I don't like the fact that there is a maximum number of entries allowed in
> a conf file. I am not sure what the format of ld.so.conf file is, but I
> would guess that it allows # comments at the end of lines even if they
> specify a library path.
There is no limit on the maximum number of entries now. You are right,
ldconfig allows # comments at the end of the line too. That should work now.
>
>
> It looks like it is possible to write over the last element of the ret
> array (if (n>maxentries) breaks the loop and then ret[n] = NULL writes
> outside of its boundaries).
>
> I don't think it is a good idea of having FILE * passed to a function that
> at the end closes the file. Who opens the file should take care of closing
> it.
Fixed. I also removed the _GNU_SOURCE define here.
Thanks,
-- Abhishek
>
> Thanks,
> Lucho
>
>
> On Sep 10, 2008, at 3:02 PM, Abhishek Kulkarni wrote:
>
> xp_ldd can now read from ld.so.conf for additional library paths.
>> It also supports the new ld.so.conf file format with the 'include'
>> directive.
>>
>> Signed-off-by: Abhishek Kulkarni <[EMAIL PROTECTED]>
>> <all.patch>
>>
>
>
Index: libxcpu/ldd.c
===================================================================
--- libxcpu/ldd.c (revision 693)
+++ libxcpu/ldd.c (working copy)
@@ -42,12 +42,16 @@
#include <errno.h>
#include <libelf.h>
#include <gelf.h>
+#include <limits.h>
+#include <glob.h>
#include "spfs.h"
#include "spclient.h"
#include "libxauth.h"
#include "libxcpu.h"
#include "xcpuimpl.h"
+#define LD_SO_CONF "/etc/ld.so.conf"
+
int xp_ldd_support = 1;
typedef struct Dep Dep;
@@ -233,6 +237,100 @@
}
static char **
+parse_conf(char *file)
+{
+ char *line = NULL, *end = NULL;
+ char **ret = NULL, **temp;
+ FILE *fp;
+
+ int n = 0, i, result;
+ glob_t libglob;
+
+ line = sp_malloc(PATH_MAX);
+ if(!line)
+ return NULL;
+
+ if ((fp = fopen(file, "r")) == NULL)
+ return NULL;
+
+ while(fgets(line, PATH_MAX, fp)) {
+
+ /* Skip the initial whitespace */
+ while(*line==' ' || *line=='\t')
+ line++;
+
+ /* Strip comments */
+ if ((end = strchr(line, '#')) != NULL)
+ *end = '\0';
+
+ /* Strip newline character */
+ if ((end = strchr(line, '\n')) != NULL)
+ *end = '\0';
+
+ if (*line == '\0')
+ continue;
+
+ /* Strip trailing whitespaces and tabs */
+ end = line + strlen(line) - 1;
+ while(*end == ' ' || *end == '\t')
+ end--;
+
+ *(end+1) = '\0';
+
+ if (!strncmp(line, "include" , 7)) {
+ line += 8;
+ result = glob(line, GLOB_NOSORT, NULL, &libglob);
+
+ switch(result) {
+ case 0:
+ for(i = 0; i < libglob.gl_pathc; i++) {
+ if ((temp = parse_conf(libglob.gl_pathv[i]))) {
+ while(*temp != NULL) {
+ ret = realloc(ret, (n+1)*sizeof(char *));
+ if (!ret)
+ return NULL;
+
+ ret[n] = sp_malloc(PATH_MAX);
+ strcpy(ret[n], *temp);
+ n++;
+ temp++;
+ }
+ }
+ }
+
+ globfree(&libglob);
+ break;
+
+ case GLOB_NOMATCH:
+ break;
+
+ case GLOB_NOSPACE:
+ sp_werror(Enomem, EIO, line);
+ break;
+
+ case GLOB_ABORTED:
+ sp_werror("%s: Cannot read directory: %s\n", EIO, file, line);
+ break;
+ }
+
+ } else {
+ ret = realloc(ret, (n+1)*sizeof(char *));
+ if (!ret)
+ return NULL;
+ ret[n] = sp_malloc(PATH_MAX);
+ strcpy(ret[n], line);
+ n++;
+ }
+
+ }
+
+ fclose(fp);
+
+ ret[n] = NULL;
+ return ret;
+}
+
+static char **
parse_path(char *path)
{
int n;
@@ -362,7 +460,7 @@
dl->ldlibpath = parse_path(s);
/* ld.so.conf */
- // TODO
+ dl->ldsoconf = parse_conf(LD_SO_CONF);
}
int
@@ -448,6 +546,9 @@
}
free(dl.interp);
+
+ for(i=0; dl.ldsoconf[i] != NULL; i++)
+ free(dl.ldsoconf[i]);
free(dl.ldsoconf);
free(dl.ldlibpath);
return n;