174 lines
5.9 KiB
Diff
174 lines
5.9 KiB
Diff
|
--- psmisc-22.5/configure.ac.x86_64 2007-06-14 12:25:38.000000000 +0200
|
||
|
+++ psmisc-22.5/configure.ac 2007-06-14 12:30:28.000000000 +0200
|
||
|
@@ -58,13 +58,28 @@
|
||
|
AC_TYPE_SIZE_T
|
||
|
AC_CHECK_MEMBERS([struct stat.st_rdev])
|
||
|
AC_TYPE_UID_T
|
||
|
-AC_CHECK_MEMBERS([struct user_regs_struct.orig_eax, struct user_regs_struct.eax, struct user_regs_struct.ebx, struct user_regs_struct.ecx, struct user_regs_struct.edx], [],[], [#include <linux/user.h>])
|
||
|
-AM_CONDITIONAL(WANT_PEEKFD,
|
||
|
+AC_CHECK_MEMBERS([struct user_regs_struct.orig_eax,
|
||
|
+ struct user_regs_struct.eax,
|
||
|
+ struct user_regs_struct.ebx,
|
||
|
+ struct user_regs_struct.ecx,
|
||
|
+ struct user_regs_struct.edx,
|
||
|
+ struct user_regs_struct.orig_rax,
|
||
|
+ struct user_regs_struct.rax,
|
||
|
+ struct user_regs_struct.rdi,
|
||
|
+ struct user_regs_struct.rsi,
|
||
|
+ struct user_regs_struct.rdx], [],[], [#include <linux/user.h>])
|
||
|
+AM_CONDITIONAL(WANT_PEEKFD_I386,
|
||
|
test $ac_cv_member_struct_user_regs_struct_orig_eax = yes &&
|
||
|
test $ac_cv_member_struct_user_regs_struct_eax = yes &&
|
||
|
test $ac_cv_member_struct_user_regs_struct_ebx = yes &&
|
||
|
test $ac_cv_member_struct_user_regs_struct_ecx = yes &&
|
||
|
test $ac_cv_member_struct_user_regs_struct_edx = yes )
|
||
|
+AM_CONDITIONAL(WANT_PEEKFD_X86_64,
|
||
|
+ test $ac_cv_member_struct_user_regs_struct_orig_rax = yes &&
|
||
|
+ test $ac_cv_member_struct_user_regs_struct_rax = yes &&
|
||
|
+ test $ac_cv_member_struct_user_regs_struct_rdi = yes &&
|
||
|
+ test $ac_cv_member_struct_user_regs_struct_rsi = yes &&
|
||
|
+ test $ac_cv_member_struct_user_regs_struct_rdx = yes )
|
||
|
|
||
|
dnl Check for language stuff
|
||
|
AM_GNU_GETTEXT([external])
|
||
|
--- psmisc-22.5/src/peekfd.c.x86_64 2007-06-14 12:26:25.000000000 +0200
|
||
|
+++ psmisc-22.5/src/peekfd.c 2007-06-14 12:37:51.000000000 +0200
|
||
|
@@ -26,6 +26,7 @@
|
||
|
#include <sys/ptrace.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/wait.h>
|
||
|
+#include <sys/syscall.h>
|
||
|
#include <linux/user.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <getopt.h>
|
||
|
@@ -33,6 +34,20 @@
|
||
|
|
||
|
#include "i18n.h"
|
||
|
|
||
|
+#ifdef I386
|
||
|
+ #define REG_ORIG_ACCUM orig_eax
|
||
|
+ #define REG_ACCUM eax
|
||
|
+ #define REG_PARAM1 ebx
|
||
|
+ #define REG_PARAM2 ecx
|
||
|
+ #define REG_PARAM3 edx
|
||
|
+#elif X86_64
|
||
|
+ #define REG_ORIG_ACCUM orig_rax
|
||
|
+ #define REG_ACCUM rax
|
||
|
+ #define REG_PARAM1 rdi
|
||
|
+ #define REG_PARAM2 rsi
|
||
|
+ #define REG_PARAM3 rdx
|
||
|
+#endif
|
||
|
+
|
||
|
#define MAX_ATTACHED_PIDS 1024
|
||
|
int num_attached_pids = 0;
|
||
|
pid_t attached_pids[MAX_ATTACHED_PIDS];
|
||
|
@@ -106,11 +121,6 @@
|
||
|
{"version", 0, NULL, 'V'},
|
||
|
};
|
||
|
|
||
|
- if (argc < 2) {
|
||
|
- usage();
|
||
|
- return 1;
|
||
|
- }
|
||
|
-
|
||
|
/* Setup the i18n */
|
||
|
#ifdef ENABLE_NLS
|
||
|
setlocale(LC_ALL, "");
|
||
|
@@ -118,7 +128,12 @@
|
||
|
textdomain(PACKAGE);
|
||
|
#endif
|
||
|
|
||
|
- while ((optc = getopt_long(argc, argv, "8nfdhV",options, NULL)) != -1) {
|
||
|
+ if (argc < 2) {
|
||
|
+ usage();
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ while ((optc = getopt_long(argc, argv, "8ncdhV",options, NULL)) != -1) {
|
||
|
switch(optc) {
|
||
|
case '8':
|
||
|
eight_bit_clean = 1;
|
||
|
@@ -177,35 +192,50 @@
|
||
|
ptrace(PTRACE_GETREGS, pid, 0, ®s);
|
||
|
|
||
|
/*unsigned int b = ptrace(PTRACE_PEEKTEXT, pid, regs.eip, 0);*/
|
||
|
+ printf("orig_rax = %ld\n", regs.REG_ORIG_ACCUM);
|
||
|
+ printf("rax = %ld\n", regs.REG_ACCUM);
|
||
|
+ printf("rbx = %ld\n", regs.REG_PARAM1);
|
||
|
+ printf("rcx = %ld\n", regs.REG_PARAM2);
|
||
|
+ printf("rdx = %ld\n", regs.REG_PARAM3);
|
||
|
+ printf("r8 = %ld\n", regs.r8);
|
||
|
+ printf("r9 = %ld\n", regs.r9);
|
||
|
+ printf("r10 = %ld\n", regs.r10);
|
||
|
+ printf("r11 = %ld\n", regs.r11);
|
||
|
+ printf("r12 = %ld\n", regs.r12);
|
||
|
+ printf("r13 = %ld\n", regs.r13);
|
||
|
+ printf("r14 = %ld\n", regs.r14);
|
||
|
+ printf("r15 = %ld\n", regs.r15);
|
||
|
+ printf("rsi = %ld\n", regs.rsi);
|
||
|
+ printf("rdi = %ld\n", regs.rdi);
|
||
|
|
||
|
- if (follow_forks && (regs.orig_eax == 2 || regs.orig_eax == 120)) {
|
||
|
- if (regs.eax > 0)
|
||
|
- attach(regs.eax);
|
||
|
+ if (follow_forks && (regs.REG_ORIG_ACCUM == SYS_fork || regs.REG_ORIG_ACCUM == SYS_clone)) {
|
||
|
+ if (regs.REG_ACCUM > 0)
|
||
|
+ attach(regs.REG_ACCUM);
|
||
|
}
|
||
|
- if ((regs.orig_eax == 3 || regs.orig_eax == 4) && (regs.edx == regs.eax)) {
|
||
|
+ if ((regs.REG_ORIG_ACCUM == SYS_read || regs.REG_ORIG_ACCUM == SYS_write) && (regs.REG_PARAM3 == regs.REG_ACCUM)) {
|
||
|
for (i = 0; i < numfds; i++)
|
||
|
- if (fds[i] == regs.ebx)
|
||
|
+ if (fds[i] == regs.REG_PARAM1)
|
||
|
break;
|
||
|
if (i != numfds || numfds == 0) {
|
||
|
- if (regs.ebx != lastfd || regs.orig_eax != lastdir) {
|
||
|
- lastfd = regs.ebx;
|
||
|
- lastdir = regs.orig_eax;
|
||
|
+ if (regs.REG_PARAM1 != lastfd || regs.REG_ORIG_ACCUM != lastdir) {
|
||
|
+ lastfd = regs.REG_PARAM1;
|
||
|
+ lastdir = regs.REG_ORIG_ACCUM;
|
||
|
if (!no_headers)
|
||
|
- printf("\n%sing fd %i:\n", regs.orig_eax == 3 ? "read" : "writ", lastfd);
|
||
|
+ printf("\n%sing fd %i:\n", regs.REG_ORIG_ACCUM == SYS_read ? "read" : "writ", lastfd);
|
||
|
}
|
||
|
if (!remove_duplicates || lastbuf == NULL
|
||
|
- || last_buf_size != regs.edx ||
|
||
|
- bufdiff(pid, lastbuf, regs.ecx, regs.edx)) {
|
||
|
+ || last_buf_size != regs.REG_PARAM3 ||
|
||
|
+ bufdiff(pid, lastbuf, regs.REG_PARAM2, regs.REG_PARAM3)) {
|
||
|
|
||
|
if (remove_duplicates) {
|
||
|
if (lastbuf)
|
||
|
free(lastbuf);
|
||
|
- lastbuf = malloc(regs.edx);
|
||
|
- last_buf_size = regs.edx;
|
||
|
+ lastbuf = malloc(regs.REG_PARAM3);
|
||
|
+ last_buf_size = regs.REG_PARAM3;
|
||
|
}
|
||
|
|
||
|
- for (i = 0; i < regs.edx; i++) {
|
||
|
- unsigned int a = ptrace(PTRACE_PEEKTEXT, pid, regs.ecx + i, 0);
|
||
|
+ for (i = 0; i < regs.REG_PARAM3; i++) {
|
||
|
+ unsigned int a = ptrace(PTRACE_PEEKTEXT, pid, regs.REG_PARAM2 + i, 0);
|
||
|
if (remove_duplicates)
|
||
|
lastbuf[i] = a & 0xff;
|
||
|
|
||
|
--- psmisc-22.5/src/Makefile.am.x86_64 2007-06-14 12:26:11.000000000 +0200
|
||
|
+++ psmisc-22.5/src/Makefile.am 2007-06-14 12:34:00.000000000 +0200
|
||
|
@@ -2,8 +2,13 @@
|
||
|
AM_CFLAGS = -Wall -DLOCALEDIR=\"/usr/share/locale\"
|
||
|
|
||
|
bin_PROGRAMS = fuser killall pstree oldfuser
|
||
|
-if WANT_PEEKFD
|
||
|
+if WANT_PEEKFD_I386
|
||
|
bin_PROGRAMS += peekfd
|
||
|
+ AM_CFLAGS += -DI386
|
||
|
+endif
|
||
|
+if WANT_PEEKFD_X86_64
|
||
|
+ bin_PROGRAMS += peekfd
|
||
|
+ AM_CFLAGS += -DX86_64
|
||
|
endif
|
||
|
|
||
|
oldfuser_SOURCES = oldfuser.c comm.h signals.c signals.h loop.h i18n.h
|