[darwinbuild-changes] [80] trunk/darwintrace/darwintrace.c

source_changes at macosforge.org source_changes at macosforge.org
Wed Oct 4 01:43:12 PDT 2006


Revision: 80
          http://trac.macosforge.org/projects/darwinbuild/changeset/80
Author:   kevin
Date:     2006-10-04 01:43:11 -0700 (Wed, 04 Oct 2006)

Log Message:
-----------
- correctly handle #! by logging an execve for the interpreter

Modified Paths:
--------------
    trunk/darwintrace/darwintrace.c

Modified: trunk/darwintrace/darwintrace.c
===================================================================
--- trunk/darwintrace/darwintrace.c	2005-07-13 23:01:59 UTC (rev 79)
+++ trunk/darwintrace/darwintrace.c	2006-10-04 08:43:11 UTC (rev 80)
@@ -95,6 +95,44 @@
 #endif
 		write(__darwintrace_fd, __darwintrace_buf, size);
 		fsync(__darwintrace_fd);
+		
+		int fd = open(path, O_RDONLY, 0);
+		if (fd != -1) {
+			char buffer[MAXPATHLEN];
+			ssize_t bytes_read = read(fd, buffer, MAXPATHLEN);
+			if (buffer[0] == '#' && buffer[1] == '!') {
+				const char* interp = &buffer[2];
+				int i;
+				// skip past leading whitespace
+				for (i = 2; i < (MAXPATHLEN-1); ++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 < (MAXPATHLEN-1); ++i) {
+					if (buffer[i] == ' ' || buffer[i] == '\t' || buffer[i] == '\n') {
+						buffer[i] = 0;
+					}
+				}
+fprintf(stderr, "interp = %s\n", interp);	
+				// we have liftoff
+				if (interp) {
+#if DARWINTRACE_SHOW_PROCESS
+					const char* procname = strrchr(argv[0], '/') + 1;
+					if (procname == NULL) procname = argv[0];
+					int size = snprintf(__darwintrace_buf, BUFFER_SIZE, "%s[%d]\texecve\t%s\n", procname, 0, interp );
+#else
+					int size = snprintf(__darwintrace_buf, BUFFER_SIZE, "execve\t%s\n", interp );
+#endif
+					write(__darwintrace_fd, __darwintrace_buf, size);
+					fsync(__darwintrace_fd);
+				}
+			}
+			close(fd);
+		}
 	  }
 	}
 	int result = execve(path, argv, envp);

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20061004/3da591c5/attachment-0001.html


More information about the darwinbuild-changes mailing list