« Return to Thread: Two small ld.so and ldconfig cleanups

Two small ld.so and ldconfig cleanups

by Matthew Dempsky-3 :: Rate this Message:

| View in Thread

Diff below contains two small cleanups for ld.so and ldconfig:

  1. Introduce a _dl_dirdesc struct for ld.so to use for its
     _dl_{open,read,close}dir functions instead of reusing libc's
     _dirdesc.  (I have a followup diff for libc to change DIR into
     an opaque type and change dirfd(3) from a macro into a function.)

  2. Switch ldconfig to use futimens() instead of futimes().

ok?


Index: dir.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/libexec/ld.so/dir.c,v
retrieving revision 1.15
diff -u -p -r1.15 dir.c
--- dir.c 14 Jul 2011 02:16:00 -0000 1.15
+++ dir.c 22 Jul 2011 18:52:29 -0000
@@ -43,16 +43,22 @@
 #include "util.h"
 #include "dir.h"
 
-long _dl_telldir(const DIR *dirp);
-void _dl_seekdir(DIR *dirp, long loc);
+struct _dl_dirdesc {
+ int dd_fd; /* file descriptor associated with directory */
+ long dd_loc; /* offset in current buffer */
+ long dd_size; /* amount of data returned by getdirentries */
+ char *dd_buf; /* data buffer */
+ int dd_len; /* size of data buffer */
+ off_t dd_seek; /* magic cookie returned by getdirentries */
+};
 
 /*
  * Open a directory.
  */
-DIR *
+_dl_DIR *
 _dl_opendir(const char *name)
 {
- DIR *dirp;
+ _dl_DIR *dirp;
  int fd;
  struct stat sb;
 
@@ -63,7 +69,7 @@ _dl_opendir(const char *name)
  return (NULL);
  }
  if (_dl_fcntl(fd, F_SETFD, FD_CLOEXEC) < 0 ||
-    (dirp = (DIR *)_dl_malloc(sizeof(DIR))) == NULL) {
+    (dirp = _dl_malloc(sizeof(*dirp))) == NULL) {
  _dl_close(fd);
  return (NULL);
  }
@@ -87,7 +93,7 @@ _dl_opendir(const char *name)
  * close a directory.
  */
 int
-_dl_closedir(DIR *dirp)
+_dl_closedir(_dl_DIR *dirp)
 {
  int fd;
  int ret;
@@ -106,7 +112,7 @@ _dl_closedir(DIR *dirp)
  * get next entry in a directory.
  */
 struct dirent *
-_dl_readdir(DIR *dirp)
+_dl_readdir(_dl_DIR *dirp)
 {
  struct dirent *dp;
 
Index: dir.h
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/libexec/ld.so/dir.h,v
retrieving revision 1.2
diff -u -p -r1.2 dir.h
--- dir.h 2 Jun 2003 19:38:24 -0000 1.2
+++ dir.h 22 Jul 2011 18:37:08 -0000
@@ -29,6 +29,8 @@
  * SUCH DAMAGE.
  */
 
-DIR *_dl_opendir(const char *name);
-int _dl_closedir(DIR *dirp);
-struct dirent *_dl_readdir(DIR *dirp);
+typedef struct _dl_dirdesc _dl_DIR;
+
+_dl_DIR *_dl_opendir(const char *name);
+int _dl_closedir(_dl_DIR *dirp);
+struct dirent *_dl_readdir(_dl_DIR *dirp);
Index: library_subr.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/libexec/ld.so/library_subr.c,v
retrieving revision 1.35
diff -u -p -r1.35 library_subr.c
--- library_subr.c 28 Nov 2011 20:59:03 -0000 1.35
+++ library_subr.c 28 Feb 2012 02:22:11 -0000
@@ -131,7 +131,7 @@ _dl_find_shlib(struct sod *sodp, const c
  struct dirent *dp;
  const char *pp;
  int match, len;
- DIR *dd;
+ _dl_DIR *dd;
  struct sod tsod, bsod; /* transient and best sod */
 
  /* if we are to search default directories, and hints
Index: ldconfig/prebind.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/libexec/ld.so/ldconfig/prebind.c,v
retrieving revision 1.14
diff -u -p -r1.14 prebind.c
--- ldconfig/prebind.c 28 Nov 2011 20:59:03 -0000 1.14
+++ ldconfig/prebind.c 28 Feb 2012 02:22:11 -0000
@@ -1925,7 +1925,7 @@ int
 prebind_writenewfile(int infd, char *name, struct stat *st, off_t orig_size,
     struct prebind_info *info)
 {
- struct timeval tv[2];
+ struct timespec ts[2];
  char *newname, *buf;
  ssize_t len, wlen;
  int outfd;
@@ -1979,9 +1979,9 @@ prebind_writenewfile(int infd, char *nam
  prebind_writefile(outfd, info);
 
  /* move new file into place */
- TIMESPEC_TO_TIMEVAL(&tv[0], &st->st_atimespec);
- TIMESPEC_TO_TIMEVAL(&tv[1], &st->st_mtimespec);
- if (futimes(outfd, tv) == -1)
+ ts[0] = st->st_atimespec;
+ ts[1] = st->st_mtimespec;
+ if (futimens(outfd, ts) == -1)
  goto fail;
  if (fchown(outfd, st->st_uid, st->st_gid) == -1)
  goto fail;
Index: ldconfig/prebind_delete.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/libexec/ld.so/ldconfig/prebind_delete.c,v
retrieving revision 1.10
diff -u -p -r1.10 prebind_delete.c
--- ldconfig/prebind_delete.c 30 Mar 2010 17:42:50 -0000 1.10
+++ ldconfig/prebind_delete.c 26 Jul 2011 21:22:19 -0000
@@ -216,7 +216,7 @@ done:
 int
 prebind_newfile(int infd, char *name, struct stat *st, off_t orig_size)
 {
- struct timeval tv[2];
+ struct timespec ts[2];
  char *newname, *buf;
  ssize_t len, wlen;
  int outfd;
@@ -269,9 +269,9 @@ prebind_newfile(int infd, char *name, st
  goto fail;
 
  /* move new file into place */
- TIMESPEC_TO_TIMEVAL(&tv[0], &st->st_atimespec);
- TIMESPEC_TO_TIMEVAL(&tv[1], &st->st_mtimespec);
- if (futimes(outfd, tv) == -1)
+ ts[0] = st->st_atimespec;
+ ts[1] = st->st_mtimespec;
+ if (futimens(outfd, ts) == -1)
  goto fail;
  if (fchown(outfd, st->st_uid, st->st_gid) == -1)
  goto fail;

 « Return to Thread: Two small ld.so and ldconfig cleanups