summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2008-06-13 11:29:36 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2008-06-13 11:29:36 +0000
commited60d48d6c98a84688cf5bf778291c423bd0ecc0 (patch)
tree322af151c2fcdb1786d235c15bd2bd221f10c9d5
parent8a4af211c346fd00ded0bb1b1384ca1514ed84e0 (diff)
downloadzsh-ed60d48d6c98a84688cf5bf778291c423bd0ecc0.tar.gz
zsh-ed60d48d6c98a84688cf5bf778291c423bd0ecc0.tar.xz
zsh-ed60d48d6c98a84688cf5bf778291c423bd0ecc0.zip
users/12911: Tomasz Pala: completion for strace
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Unix/Command/.distfiles1
-rw-r--r--Completion/Unix/Command/_strace113
3 files changed, 120 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 698f6b2d1..871fb58d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-06-13  Peter Stephenson  <pws@csr.com>
+
+	* users/12911: Tomasz Pala <gotar@polanet.pl>:
+	Completion/Unix/Command/_strace,
+	Completion/Unix/Command/.distfiles: new completion
+
 2008-06-12  Peter Stephenson  <pws@csr.com>
 
 	* 25149: Doc/Zsh/arith.yo, Doc/Zsh/options.yo, Src/math.c,
diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles
index 727443a13..3feb4ef6d 100644
--- a/Completion/Unix/Command/.distfiles
+++ b/Completion/Unix/Command/.distfiles
@@ -178,6 +178,7 @@ _spamassassin
 _sqsh
 _ssh
 _stgit
+_strace
 _strip
 _stty
 _su
diff --git a/Completion/Unix/Command/_strace b/Completion/Unix/Command/_strace
new file mode 100644
index 000000000..ba777d68a
--- /dev/null
+++ b/Completion/Unix/Command/_strace
@@ -0,0 +1,113 @@
+#compdef strace
+
+# TODO:
+#	- make _sys_calls system-dependent
+#	- allow negated calls (e.g. -e!write)
+_sys_calls () {
+	local expl
+
+	sys_calls=(_llseek _newselect _sysctl accept access acct
+		adjtimex afs_syscall alarm bdflush bind break brk cacheflush
+		capget capset chdir chmod chown chown32 chroot clone close connect
+		creat create_module delete_module dup dup2 execve exit fchdir
+		fchmod fchown fchown32 fcntl fcntl64 fdatasync flock fork fstat
+		fstat64 fstatfs fsync ftime ftruncate ftruncate64 get_kernel_syms
+		getcwd getdents getdents64 getegid getegid32 geteuid geteuid32
+		getgid getgid32 getgroups getgroups32 getitimer getpagesize getpeername
+		getpmsg getpgid getpgrp getpid getppid getpriority getresgid getresgid32
+		getresuid getresuid32 getrlimit getrusage getsid getsockname getsockopt
+		gettid gettimeofday getuid getuid32 gtty idle init_module ioctl ioperm
+		iopl ipc kill lchown lchown32 link listen lock lseek lstat lstat64
+		madvise mincore mkdir mknod mlock mlockall mmap modify_ldt mount mprotect
+		mpx mremap msync munlock munlockall munmap nanosleep nfsservctl nice
+		oldfstat oldlstat oldolduname oldstat oldumount olduname open pause
+		personality phys pipe pivot_root poll prctl pread prof profil ptrace
+		putpmsg pwrite query_module quotactl read readahead readdir readlink
+		readv reboot recv recvfrom recvmsg rename rmdir rt_sigaction
+		rt_sigpending rt_sigprocmask rt_sigqueueinfo rt_sigreturn rt_sigsuspend
+		rt_sigtimedwait sched_get_priority_max sched_get_priority_min
+		sched_getparam sched_getscheduler sched_rr_get_interval sched_setparam
+		sched_setscheduler sched_yield security select sendfile send sendmsg sendto
+		setdomainname setfsgid setfsgid32 setfsuid setfsuid32 setgid setgid32
+		setgroups setgroups32 sethostname setitimer setpgid setpriority setregid
+		setregid32 setresgid setresgid32 setresuid setresuid32 setreuid setreuid32
+		setrlimit setsid setsockopt settimeofday setuid setuid32 setup sgetmask
+		shutdown sigaction sigaltstack signal sigpending sigprocmask sigreturn
+		sigsuspend socket socketcall socketpair ssetmask stat stat64 statfs stime
+		stty swapoff swapon symlink sync sysfs sysinfo syslog time times truncate
+		truncate64 ulimit umask umount uname unlink uselib ustat utime vfork vhangup
+		vm86 vm86old wait4 waitpid write writev)
+
+	for t in ${(s:,:)${PREFIX}}; do
+		sys_calls=( ${sys_calls:#$t} )
+	done
+	compset -P '*,'
+	_wanted sys_calls expl 'System calls' compadd -qS , -a sys_calls
+}
+
+_sets () {
+	_alternative \
+		'special:Special values:(all none)' \
+		'calls::_sys_calls'
+}
+
+_traces () {
+	local expl
+	traces=('file:Trace all system calls which take a file name as an argument'
+		'process:Trace all system calls which involve process management'
+		'network:Trace all the network related system calls'
+		'signal:Trace all signal related system calls'
+		'ipc:Trace all IPC related system calls'
+		'desc:Trace all file descriptor related system calls')
+	compset -P '*,'
+	_describe -t traces 'Related system calls' traces -qS ,
+}
+
+_traces_sets () {
+	_alternative \
+		'traces::_traces' \
+		'sets::_sets'
+}
+
+_expression () {
+	_values -S = "Qualifying expression" \
+		'trace[Trace specified set of system calls only]:system calls:_traces_sets' \
+		'abbrev[Abbreviate the output from printing each member of large structures]:system calls:_sets' \
+		'verbose[Dereference structures for the specified set of system calls]:system calls:_sets' \
+		'raw[Print raw, undecoded arguments for the specified set of system calls]:system calls:_sets' \
+		'signal[Trace only the specified subset of signals]:signal:{compset -P "*,"; _signals -s -qS ,}' \
+		'read[Perform a full hex and ASCII dump of all the data read from listed file descriptors]:file descriptors:{compset -P "*,"; _file_descriptors -qS ,}' \
+		'write[Perform a full hex and ASCII dump of all the data written to listed file descriptors]:file descriptors:{compset -P "*,"; _file_descriptors -qS ,}'
+	if [[ -z "$words[CURRENT]" || -n "${words[CURRENT]:#*=*}" ]]; then
+		_traces_sets
+	fi
+}
+
+_arguments \
+	'()-c[Count time, calls, and errors for each system call and report a summary]' \
+	-d'[Show some debugging output of strace itself on the standard error]' \
+	-f'[Trace child processes as they are created by currently traced processes]' \
+	-ff'[Write each process trace to <filename>.<pid> (when using -o <filename>]' \
+	'(-c -d -f -ff -i -q -r -t -tt -ttt -T -v -V -x -xx -a -e -o -O -p -s -S -u -E)-h[Print help]' \
+	-i'[Print the instruction pointer at the time of the system call]' \
+	-q'[Suppress messages about attaching, detaching etc.]' \
+	-r'[Print a relative timestamp upon entry to each system call]' \
+	'(-ttt)-t[Prefix each line of the trace with the time of day]' \
+	'(-ttt -tt)-tt[Prefix each line of the trace with the time of day including the microseconds]' \
+	'(-tt -t)-ttt[Prefix each line of the trace with the number of seconds and microseconds since the epoch]' \
+	-T'[Show the time spent in system calls]' \
+	-v'[Print unabbreviated versions of environment, stat, termios, etc. calls]' \
+	'(-c -d -f -ff -h -i -q -r -t -tt -ttt -T -v -x -xx -a -e -o -O -p -s -S -u -E)-V[Print the version number of strace]' \
+	'(-xx)-x[Print all non-ASCII strings in hexadecimal string format]' \
+	'(-x)-xx[Print all strings in hexadecimal string format]' \
+	-a'[Align return values in a specific column (default 40)]:column number' \
+	'*-e[Select events to trace or how to trace]:system call:_expression' \
+	'-o[Write the trace output to the file]:output file:_files' \
+	'-O[Overhead for tracing system calls]:overhead microseconds' \
+	'(:)-p[Attach to the process with specified process ID and begin tracing]:Process ID:_pids' \
+	'-s[Specify the maximum string size to print (default 32)]:maximum string size' \
+	'-S[Sort the output of the histogram (-c option) by the specified criterion]:sort by:(time calls name nothing)' \
+	'-u[Run as specified user]:user:_users' \
+	'*-E[Remove variable from the inherited list of environment or define a value]:variable:_printenv' \
+	'(-):command name: _command_names -e' \
+	'*::arguments:_normal'