[darwinbuild-changes] [924] branches/PR-8817822/darwintrace/darwintrace.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Feb 8 10:53:50 PST 2011


Revision: 924
          http://trac.macosforge.org/projects/darwinbuild/changeset/924
Author:   wsiegrist at apple.com
Date:     2011-02-08 10:53:50 -0800 (Tue, 08 Feb 2011)
Log Message:
-----------
Cleanup whitespace, switch from macros to inline functions, general cleanup

Modified Paths:
--------------
    branches/PR-8817822/darwintrace/darwintrace.c

Modified: branches/PR-8817822/darwintrace/darwintrace.c
===================================================================
--- branches/PR-8817822/darwintrace/darwintrace.c	2011-02-08 18:17:59 UTC (rev 923)
+++ branches/PR-8817822/darwintrace/darwintrace.c	2011-02-08 18:53:50 UTC (rev 924)
@@ -46,43 +46,44 @@
 
 #define DARWINTRACE_LOG_FULL_PATH 1
 #define DARWINTRACE_DEBUG_OUTPUT 0
-
 #define START_FD 81
-static int __darwintrace_fd = -2;
 #define BUFFER_SIZE	1024
 
-static char __darwintrace_progname[BUFFER_SIZE];
-static pid_t __darwintrace_pid = -1;
-
 #if DARWINTRACE_DEBUG_OUTPUT
 #define dprintf(...) fprintf(stderr, __VA_ARGS__)
 #else
 #define dprintf(...)
 #endif
 
+static int __darwintrace_fd = -2;
+static char __darwintrace_progname[BUFFER_SIZE];
+static pid_t __darwintrace_pid = -1;
+
 /**
  * Redirect file access 
  */
 static char *__darwintrace_redirect = NULL; 
 static char *__darwintrace_buildroot = NULL;
-static const char *__redirect_exceptions[] = {"/Developer/Library/Private",
-					      "/Developer/Library/Frameworks",
-					      "/Developer/usr/bin/../../Library/Private",
-					      "/Developer/usr/bin/../../Library/Frameworks",
-					      "/Developer/Library/Xcode",
-					      "/Developer/Platforms/",
-					      "/Developer/usr/bin/xcode",
-					      "/System/Library/Frameworks/Carbon",
-					      "/Volumes/BuildRoot_",
-					      "/usr/bin/xcrun",
-					      "/usr/bin/xcode",
-					      "/usr/local/share/darwin",
-					      "/usr/share/xcode",
-					      "/var/folders/",
-					      "/var/tmp/",
-					      "/.vol/",
-					      "/tmp/",
-					      "/dev/"};
+static const char *__redirect_exceptions[] = {
+  "/Developer/Library/Private",
+  "/Developer/Library/Frameworks",
+  "/Developer/usr/bin/../../Library/Private",
+  "/Developer/usr/bin/../../Library/Frameworks",
+  "/Developer/Library/Xcode",
+  "/Developer/Platforms/",
+  "/Developer/usr/bin/xcode",
+  "/System/Library/Frameworks/Carbon",
+  "/Volumes/BuildRoot_",
+  "/usr/bin/xcrun",
+  "/usr/bin/xcode",
+  "/usr/local/share/darwin",
+  "/usr/share/xcode",
+  "/var/folders/",
+  "/var/tmp/",
+  "/.vol/",
+  "/tmp/",
+  "/dev/",
+};
 
 /* check if str starts with one of the exceptions */
 static inline bool __except(const char *str) {
@@ -95,23 +96,25 @@
   return false;
 }
 
-/* create __darwintrace_path and write the potentially-redirected path to it */
-#define __redirect_path()						\
-  char *__darwintrace_path;						\
-  __darwintrace_path = (char *)path;					\
-  if (__darwintrace_redirect						\
-      && path[0] == '/'							\
-      && !__except(path)						\
-      && strncmp(__darwintrace_buildroot, path, strlen(__darwintrace_buildroot))!=0 \
-      && strncmp(__darwintrace_redirect, path, strlen(__darwintrace_redirect))!=0 ) { \
-    asprintf(&__darwintrace_path, "%s%s%s", __darwintrace_redirect, (*path == '/' ? "" : "/"), path); \
-    dprintf("darwintrace: redirect %s -> %s\n", path, __darwintrace_path);		\
+/* apply redirection heuristic to path */
+static inline char* __redirect_path(const char* path) {	
+  char *redirpath;
+  redirpath = (char *)path;
+  if (__darwintrace_redirect
+      && path[0] == '/'
+      && !__except(path)
+      && strncmp(__darwintrace_buildroot, path, strlen(__darwintrace_buildroot))!=0
+      && strncmp(__darwintrace_redirect, path, strlen(__darwintrace_redirect))!=0 ) {
+    asprintf(&redirpath, "%s%s%s", __darwintrace_redirect, (*path == '/' ? "" : "/"), path);
+    dprintf("darwintrace: redirect %s -> %s\n", path, redirpath);
   }
-#define __free_path()				    \
-  if (__darwintrace_path != path) {		    \
-    free(__darwintrace_path);			    \
-  }
+  return redirpath;
+}
 
+/* free path if not the same as test */
+static inline void __free_path(char* path, const char* test) {
+  if (path != test) free(path);
+}
 
 static inline void __darwintrace_setup() {
 	if (__darwintrace_fd == -2) {
@@ -179,9 +182,9 @@
   rsrclen = strlen(_PATH_RSRCFORKSPEC);
   if(pathlen > rsrclen
      && 0 == strncmp(path + pathlen - rsrclen,
-		     _PATH_RSRCFORKSPEC, rsrclen)) {
-    path[pathlen - rsrclen] = '\0';
-    pathlen -= rsrclen;
+                     _PATH_RSRCFORKSPEC, rsrclen)) {
+       path[pathlen - rsrclen] = '\0';
+       pathlen -= rsrclen;
   }
 
   /* for each position in string (including
@@ -192,15 +195,15 @@
   for(i=0, shiftamount=0; i <= pathlen; i++) {
     if(state == SAWSLASH) {
       if(path[i] == '/') {
-	/* consume it */
-	shiftamount++;
+        /* consume it */
+        shiftamount++;
       } else {
-	state = NOTHING;
-	path[i - shiftamount] = path[i];
+        state = NOTHING;
+        path[i - shiftamount] = path[i];
       }
     } else {
       if(path[i] == '/') {
-	state = SAWSLASH;
+        state = SAWSLASH;
       }
       path[i - shiftamount] = path[i];
     }
@@ -223,12 +226,12 @@
 	int result;
 	va_list args;
 
-	__redirect_path();
+	char* redirpath = __redirect_path(path);
 
 	va_start(args, flags);
 	mode = va_arg(args, int);
 	va_end(args);
-	result = open(__darwintrace_path, flags, mode);
+	result = open(redirpath, flags, mode);
 	if (result >= 0 && (flags & (O_CREAT | O_WRONLY /*O_RDWR*/)) == 0 ) {
 	  __darwintrace_setup();
 	  if (__darwintrace_fd >= 0) {
@@ -239,35 +242,35 @@
 	    int usegetpath = 0;
 #endif
 
-	    dprintf("darwintrace: original open path is %s\n", __darwintrace_path);
+	    dprintf("darwintrace: original open path is %s\n", redirpath);
 
 	    /* for volfs paths, we need to do a GETPATH anyway */
-	    if(!usegetpath && strncmp(__darwintrace_path, "/.vol/", 6) == 0) {
+	    if(!usegetpath && strncmp(redirpath, "/.vol/", 6) == 0) {
 	      usegetpath = 1;
 	    }
 	    
 	    if(usegetpath) {
-	      if(0 == fcntl(result, F_GETPATH, realpath)) {
-		dprintf("darwintrace: resolved %s to %s\n", __darwintrace_path, realpath);
+        if(0 == fcntl(result, F_GETPATH, realpath)) {
+          dprintf("darwintrace: resolved %s to %s\n", redirpath, realpath);
 	      } else {
-		/* use original path */
-		dprintf("darwintrace: failed to resolve %s\n", __darwintrace_path);
-		if (strlcpy(realpath, __darwintrace_path, sizeof(realpath)) >= sizeof(realpath)) {
-		  dprintf("darwintrace: in open: original path too long to copy: %s\n", __darwintrace_path);
-		}
-	      }
-	    } else {
-	      if (strlcpy(realpath, __darwintrace_path, sizeof(realpath)) >= sizeof(realpath)) {
-		dprintf("darwintrace: in open (without getpath): path too long to copy: %s\n", __darwintrace_path);
-	      }
-	    }
+          /* use original path */
+          dprintf("darwintrace: failed to resolve %s\n", redirpath);
+          if (strlcpy(realpath, redirpath, sizeof(realpath)) >= sizeof(realpath)) {
+            dprintf("darwintrace: in open: original path too long to copy: %s\n", redirpath);
+          }
+        }
+      } else {
+	      if (strlcpy(realpath, redirpath, sizeof(realpath)) >= sizeof(realpath)) {
+          dprintf("darwintrace: in open (without getpath): path too long to copy: %s\n", redirpath);
+        }
+      }
 
 	    __darwintrace_cleanup_path(realpath);
-
 	    __darwintrace_logpath(__darwintrace_fd, NULL, "open", realpath);
 	  }
 	}
-	__free_path();
+
+	__free_path(redirpath, path);
 	return result;
 }
 
@@ -280,25 +283,25 @@
 #define readlink(x,y,z) syscall(SYS_readlink, (x), (y), (z))
 	ssize_t result;
 
-	__redirect_path();
-	result = readlink(__darwintrace_path, buf, bufsiz);
+	char* redirpath = __redirect_path(path);
+	result = readlink(redirpath, buf, bufsiz);
 	if (result >= 0) {
 	  __darwintrace_setup();
 	  if (__darwintrace_fd >= 0) {
 	    char realpath[MAXPATHLEN];
 
-	    dprintf("darwintrace: original readlink path is %s\n", __darwintrace_path);
+	    dprintf("darwintrace: original readlink path is %s\n", redirpath);
 
-	    if (strlcpy(realpath, __darwintrace_path, sizeof(realpath)) >= sizeof(realpath)) {
-	      dprintf("darwintrace: in readlink: path too long to copy: %s\n", __darwintrace_path);
+	    if (strlcpy(realpath, redirpath, sizeof(realpath)) >= sizeof(realpath)) {
+	      dprintf("darwintrace: in readlink: path too long to copy: %s\n", redirpath);
 	    }
 	    
 	    __darwintrace_cleanup_path(realpath);
-
 	    __darwintrace_logpath(__darwintrace_fd, NULL, "readlink", realpath);
 	  }
 	}
-	__free_path();
+  
+	__free_path(redirpath, path);
 	return result;
 }
 
@@ -306,7 +309,7 @@
 #define execve(x,y,z) syscall(SYS_execve, (x), (y), (z))
 	int result;
 	
-	__redirect_path();
+	char* redirpath = __redirect_path(path);
 	__darwintrace_setup();
 	if (__darwintrace_fd >= 0) {
 	  struct stat sb;
@@ -320,15 +323,15 @@
 	  int usegetpath = 0;
 #endif
 
-	  dprintf("darwintrace: original execve path is %s\n", __darwintrace_path);
+	  dprintf("darwintrace: original execve path is %s\n", redirpath);
 
 	  /* for symlinks, we wan't to capture
 	   * both the original path and the modified one,
 	   * since for /usr/bin/gcc -> gcc-4.0,
 	   * both "gcc_select" and "gcc" are contributors
 	   */
-	  if (lstat(__darwintrace_path, &sb) == 0) {
-	    if(__darwintrace_path[0] != '/') {
+	  if (lstat(redirpath, &sb) == 0) {
+	    if(redirpath[0] != '/') {
 	      /* for relative paths, only print full path */
 	      printreal = 1;
 	      printorig = 0;
@@ -343,15 +346,15 @@
 	    }
 
 	    if(printorig) {
-	      if (strlcpy(realpath, __darwintrace_path, sizeof(realpath)) >= sizeof(realpath)) {
-		dprintf("darwintrace: in execve: path too long to copy: %s\n", __darwintrace_path);
+	      if (strlcpy(realpath, redirpath, sizeof(realpath)) >= sizeof(realpath)) {
+          dprintf("darwintrace: in execve: path too long to copy: %s\n", redirpath);
 	      }
 
 	      __darwintrace_cleanup_path(realpath);
 	      __darwintrace_logpath(__darwintrace_fd, NULL, "execve", realpath);
 	    }
 		
-	    fd = open(__darwintrace_path, O_RDONLY, 0);
+	    fd = open(redirpath, O_RDONLY, 0);
 	    if (fd != -1) {
 
 	      char buffer[MAXPATHLEN];
@@ -359,73 +362,74 @@
 
 	      /* once we have an open fd, if a full path was requested, do it */
 	      if(printreal) {
-		
-		if(usegetpath) {
-		  if(0 == fcntl(fd, F_GETPATH, realpath)) {
-		    dprintf("darwintrace: resolved execve path %s to %s\n", __darwintrace_path, realpath);
-		  } else {
-		    dprintf("darwintrace: failed to resolve %s\n", __darwintrace_path);
-		    if (strlcpy(realpath, __darwintrace_path, sizeof(realpath)) >= sizeof(realpath)) {
-		      dprintf("darwintrace: in execve: original path too long to copy: %s\n", __darwintrace_path);
-		    }
-		  }
-		} else {
-		  if (strlcpy(realpath, __darwintrace_path, sizeof(realpath)) >= sizeof(realpath)) {
-		    dprintf("darwintrace: in execve (without getpath): path too long to copy: %s\n", __darwintrace_path);
-		  }
-		}
-		__darwintrace_cleanup_path(realpath);
 
-		__darwintrace_logpath(__darwintrace_fd, NULL, "execve", realpath);
+          if(usegetpath) {
+            if(0 == fcntl(fd, F_GETPATH, realpath)) {
+              dprintf("darwintrace: resolved execve path %s to %s\n", redirpath, realpath);
+            } else {
+              dprintf("darwintrace: failed to resolve %s\n", redirpath);
+              if (strlcpy(realpath, redirpath, sizeof(realpath)) >= sizeof(realpath)) {
+                dprintf("darwintrace: in execve: original path too long to copy: %s\n", redirpath);
+              }
+            }
+          } else {
+            if (strlcpy(realpath, redirpath, sizeof(realpath)) >= sizeof(realpath)) {
+              dprintf("darwintrace: in execve (without getpath): path too long to copy: %s\n", redirpath);
+            }
+          }
+          
+          __darwintrace_cleanup_path(realpath);
+          __darwintrace_logpath(__darwintrace_fd, NULL, "execve", realpath);
 	      }
 
 	      bzero(buffer, sizeof(buffer));
 
 	      bytes_read = read(fd, buffer, MAXPATHLEN);
 	      if (bytes_read > 2 &&
-		  buffer[0] == '#' && buffer[1] == '!') {
-		char* interp = &buffer[2];
-		int i;
-		/* skip past leading whitespace */
-		for (i = 2; i < bytes_read; ++i) {
-		  if (buffer[i] != ' ' && buffer[i] != '\t') {
-		    interp = &buffer[i];
-		    break;
-		  }
-		}
-		/* found interpreter (or ran out of data)
-		   skip until next whitespace, then terminate the string */
-		for (; i < bytes_read; ++i) {
-		  if (buffer[i] == ' ' || buffer[i] == '\t' || buffer[i] == '\n') {
-		    buffer[i] = 0;
-		    break;
-		  }
-		}
-		/* we have liftoff */
-		if (interp && interp[0] != '\0') {
-		  const char* procname = NULL;
+            buffer[0] == '#' && buffer[1] == '!') {
+          char* interp = &buffer[2];
+          int i;
+          /* skip past leading whitespace */
+          for (i = 2; i < bytes_read; ++i) {
+            if (buffer[i] != ' ' && buffer[i] != '\t') {
+              interp = &buffer[i];
+              break;
+            }
+          }
+          /* found interpreter (or ran out of data)
+           skip until next whitespace, then terminate the string */
+          for (; i < bytes_read; ++i) {
+            if (buffer[i] == ' ' || buffer[i] == '\t' || buffer[i] == '\n') {
+              buffer[i] = 0;
+              break;
+            }
+          }
+          /* we have liftoff */
+          if (interp && interp[0] != '\0') {
+            const char* procname = NULL;
 
-		  /* look for slash to get the basename */
-		  procname = strrchr(argv[0], '/');
-		  if (procname == NULL) {
-		    /* no slash found, so assume whole string is basename */
-		    procname = argv[0];
-		  } else {
-		    /* advance pointer to just after slash */
-		    procname++;
-		  }
+            /* look for slash to get the basename */
+            procname = strrchr(argv[0], '/');
+            if (procname == NULL) {
+              /* no slash found, so assume whole string is basename */
+              procname = argv[0];
+            } else {
+              /* advance pointer to just after slash */
+              procname++;
+            }
 
-		  __darwintrace_cleanup_path(interp);
-
-		  __darwintrace_logpath(__darwintrace_fd, procname, "execve", interp);
-		}
+            __darwintrace_cleanup_path(interp);
+            __darwintrace_logpath(__darwintrace_fd, procname, "execve", interp);
+          }
 	      }
+        
 	      close(fd);
 	    }
 	  }
 	}
-	result = execve(__darwintrace_path, argv, envp);
-	__free_path();
+  
+	result = execve(redirpath, argv, envp);
+	__free_path(redirpath, path);
 	return result;
 }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20110208/e1142044/attachment-0001.html>


More information about the darwinbuild-changes mailing list