svn commit: r195433 - projects/jbuild/usr.bin/jbuild/filemon

Craig Rodrigues rodrigc at FreeBSD.org
Wed Jul 8 02:12:48 UTC 2009


Author: rodrigc
Date: Wed Jul  8 02:12:47 2009
New Revision: 195433
URL: http://svn.freebsd.org/changeset/base/195433

Log:
  Provide support for using a 32-bit jbuild binary
  on a 64-bit host.
  
  Submitted by:  Artem Belevich (@ Juniper Networks)

Modified:
  projects/jbuild/usr.bin/jbuild/filemon/filemon.c
  projects/jbuild/usr.bin/jbuild/filemon/filemon_wrapper.c

Modified: projects/jbuild/usr.bin/jbuild/filemon/filemon.c
==============================================================================
--- projects/jbuild/usr.bin/jbuild/filemon/filemon.c	Wed Jul  8 01:43:47 2009	(r195432)
+++ projects/jbuild/usr.bin/jbuild/filemon/filemon.c	Wed Jul  8 02:12:47 2009	(r195433)
@@ -22,7 +22,16 @@
 #include <sys/uio.h>
 #include "filemon.h"
 
+#ifdef COMPAT_IA32
+#include <compat/freebsd32/freebsd32_syscall.h>
+#include <compat/freebsd32/freebsd32_proto.h>
+
+extern struct sysentvec ia32_freebsd_sysvec;
+
+#endif
+
 extern struct sysentvec elf32_freebsd_sysvec;
+extern struct sysentvec elf64_freebsd_sysvec;
 
 static d_close_t	filemon_close;
 static d_ioctl_t	filemon_ioctl;

Modified: projects/jbuild/usr.bin/jbuild/filemon/filemon_wrapper.c
==============================================================================
--- projects/jbuild/usr.bin/jbuild/filemon/filemon_wrapper.c	Wed Jul  8 01:43:47 2009	(r195432)
+++ projects/jbuild/usr.bin/jbuild/filemon/filemon_wrapper.c	Wed Jul  8 02:12:47 2009	(r195433)
@@ -132,6 +132,43 @@ filemon_wrapper_execve(struct thread *td
 	return(ret);
 }
 
+#ifdef COMPAT_IA32
+static int
+filemon_wrapper_freebsd32_execve(struct thread *td, struct freebsd32_execve_args *uap)
+{
+	char fname[MAXPATHLEN];
+	int ret;
+	size_t done;
+	size_t len;
+	struct filemon *filemon;
+
+	copyinstr(uap->fname, fname, sizeof(fname), &done);
+
+	if ((ret = freebsd32_execve(td, uap)) == 0) {
+		/* Grab a read lock on the filemon inuse list. */
+		filemon_lock_read();
+
+		if ((filemon = filemon_pid_check(curproc)) != NULL) {
+			/* Lock the found filemon structure. */
+			filemon_filemon_lock(filemon);
+
+			len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), "E %d %s\n",
+			    curproc->p_pid, fname);
+
+			filemon_output(filemon, filemon->msgbufr, len);
+
+			/* Unlock the found filemon structure. */
+			filemon_filemon_unlock(filemon);
+		}
+
+		/* Release the read lock. */
+		filemon_unlock_read();
+	}
+
+	return(ret);
+}
+#endif
+
 static int
 filemon_wrapper_fork(struct thread *td, struct fork_args *uap)
 {
@@ -147,8 +184,8 @@ filemon_wrapper_fork(struct thread *td, 
 			/* Lock the found filemon structure. */
 			filemon_filemon_lock(filemon);
 
-			len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), "F %d %d\n",
-			    curproc->p_pid, curthread->td_retval[0]);
+			len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), "F %d %ld\n",
+			   curproc->p_pid, (long)curthread->td_retval[0]);
 
 			filemon_output(filemon, filemon->msgbufr, len);
 
@@ -266,6 +303,42 @@ filemon_wrapper_stat(struct thread *td, 
 	return(ret);
 }
 
+#ifdef COMPAT_IA32
+static int
+filemon_wrapper_freebsd32_stat(struct thread *td, struct freebsd32_stat_args *uap)
+{
+	int ret;
+	size_t done;
+	size_t len;
+	struct filemon *filemon;
+
+	if ((ret = freebsd32_stat(td, uap)) == 0) {
+		/* Grab a read lock on the filemon inuse list. */
+		filemon_lock_read();
+
+		if ((filemon = filemon_pid_check(curproc)) != NULL) {
+			/* Lock the found filemon structure. */
+			filemon_filemon_lock(filemon);
+
+			copyinstr(uap->path, filemon->fname1, sizeof(filemon->fname1), &done);
+
+			len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), "S %d %s\n",
+			    curproc->p_pid, filemon->fname1);
+
+			filemon_output(filemon, filemon->msgbufr, len);
+
+			/* Unlock the found filemon structure. */
+			filemon_filemon_unlock(filemon);
+		}
+
+		/* Release the read lock. */
+		filemon_unlock_read();
+	}
+
+	return(ret);
+}
+#endif
+
 static void
 filemon_wrapper_sys_exit(struct thread *td, struct sys_exit_args *uap)
 {
@@ -349,8 +422,8 @@ filemon_wrapper_vfork(struct thread *td,
 			/* Lock the found filemon structure. */
 			filemon_filemon_lock(filemon);
 
-			len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), "F %d %d\n",
-			    curproc->p_pid, curthread->td_retval[0]);
+			len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), "F %d %ld\n",
+			    curproc->p_pid, (long)curthread->td_retval[0]);
 
 			filemon_output(filemon, filemon->msgbufr, len);
 
@@ -385,6 +458,22 @@ filemon_wrapper_install(void)
 	sv_table[SYS_stat].sy_call = (sy_call_t *) filemon_wrapper_stat;
 	sv_table[SYS_unlink].sy_call = (sy_call_t *) filemon_wrapper_unlink;
 	sv_table[SYS_vfork].sy_call = (sy_call_t *) filemon_wrapper_vfork;
+
+#ifdef COMPAT_IA32
+	sv_table = ia32_freebsd_sysvec.sv_table;
+
+	sv_table[FREEBSD32_SYS_chdir].sy_call = (sy_call_t *) filemon_wrapper_chdir;
+	sv_table[FREEBSD32_SYS_exit].sy_call = (sy_call_t *) filemon_wrapper_sys_exit;
+	sv_table[FREEBSD32_SYS_freebsd32_execve].sy_call = (sy_call_t *) filemon_wrapper_freebsd32_execve;
+	sv_table[FREEBSD32_SYS_fork].sy_call = (sy_call_t *) filemon_wrapper_fork;
+	sv_table[FREEBSD32_SYS_open].sy_call = (sy_call_t *) filemon_wrapper_open;
+	sv_table[FREEBSD32_SYS_rename].sy_call = (sy_call_t *) filemon_wrapper_rename;
+	sv_table[FREEBSD32_SYS_freebsd32_stat].sy_call = (sy_call_t *) filemon_wrapper_freebsd32_stat;
+	sv_table[FREEBSD32_SYS_unlink].sy_call = (sy_call_t *) filemon_wrapper_unlink;
+	sv_table[FREEBSD32_SYS_vfork].sy_call = (sy_call_t *) filemon_wrapper_vfork;
+#endif
+
+
 }
 
 static void
@@ -407,4 +496,19 @@ filemon_wrapper_deinstall(void)
 	sv_table[SYS_stat].sy_call = (sy_call_t *) stat;
 	sv_table[SYS_unlink].sy_call = (sy_call_t *) unlink;
 	sv_table[SYS_vfork].sy_call = (sy_call_t *) vfork;
+
+#ifdef COMPAT_IA32
+	sv_table = ia32_freebsd_sysvec.sv_table;
+
+	sv_table[FREEBSD32_SYS_chdir].sy_call = (sy_call_t *) chdir;
+	sv_table[FREEBSD32_SYS_exit].sy_call = (sy_call_t *) sys_exit;
+	sv_table[FREEBSD32_SYS_freebsd32_execve].sy_call = (sy_call_t *)freebsd32_execve;
+	sv_table[FREEBSD32_SYS_fork].sy_call = (sy_call_t *) fork;
+	sv_table[FREEBSD32_SYS_open].sy_call = (sy_call_t *) open;
+	sv_table[FREEBSD32_SYS_rename].sy_call = (sy_call_t *) rename;
+	sv_table[FREEBSD32_SYS_freebsd32_stat].sy_call = (sy_call_t *) freebsd32_stat;
+	sv_table[FREEBSD32_SYS_unlink].sy_call = (sy_call_t *) unlink;
+	sv_table[FREEBSD32_SYS_vfork].sy_call = (sy_call_t *) vfork;
+#endif
+
 }


More information about the svn-src-projects mailing list