about summary refs log tree commit diff
path: root/Completion/User/_nslookup
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/User/_nslookup')
-rw-r--r--Completion/User/_nslookup159
1 files changed, 159 insertions, 0 deletions
diff --git a/Completion/User/_nslookup b/Completion/User/_nslookup
new file mode 100644
index 000000000..7d2a12142
--- /dev/null
+++ b/Completion/User/_nslookup
@@ -0,0 +1,159 @@
+#compdef nslookup
+
+# This may also be called from the `nslookup' wrapper function during
+# `vared'iting a line.
+# In this case this function tries to call other user-defined functions
+# for certain contexts before adding completion. If these functions are
+# defined, they are called and the default completions from this function
+# are not added. The functions called are named `_nslookup_<state>', with
+# `<state>' being any of:
+#
+#  command
+#    When completing the first word on the line.
+#  redirect
+#    When completing after a redirection operator.
+#
+# Also, when completing after the first word, if the first word contains
+# only lower case letters, we try to call the function `_nslookup_<word>',
+# where `<word>' is the first word from the line. If the first word contains
+# other characters than lower case letters, we try to call the function
+# `_nslookup_host'.
+
+setopt localoptions extendedglob
+
+local state expl ret=1 setopts
+
+setopts=(
+  'all[print current values]' \
+  '(nodebug)debug[simple debugging information]' \
+  '(debug)nodebug[no simple debugging information]' \
+  '(nod2)d2[extra debugging information]' \
+  '(d2)nod2[no extra debugging information]' \
+  '(nodefname)defname[append default domain name]' \
+  '(defname)nodefname[don'"'"'t append default domain name]' \
+  '(nosearch)search[append search list]' \
+  '(search)nosearch[don'"'"'t append search list]' \
+  '(norecurse)recurse[name server may query other servers]' \
+  '(recurse)norecurse[name server may not query other servers]' \
+  '(novc)vc[use virtual circuit]' \
+  '(vc)novc[don'"'"'t use virtual circuit]' \
+  '(noignoretc)ignoretc[ignore packet truncation errors]' \
+  '(ignoretc)noignoretc[don'"'"'t ignore packet truncation errors]' \
+  'class[change query class]:query class:((in\:Internet\ class chaos\:CHAOS\ class hesiod\:MIT\ Athena\ Hesiod\ class any\:wildcard\ \(any\ of\ the\ above\)))'
+  'domain[change default domain]:default domain:_hosts'
+  'srchlist[change default domain and search list]: :->srchlist'
+  'port[change name server port]:name server port:'
+  {query,}type'[change type of information query]:query information type:((a\:internet\ address cname\:canonical\ name\ for\ alias hinfo\:CPU\ and\ operating\ system\ type minfo\:mailbox\ or\ mail\ list\ information mx\:mail\ exchanger ns\:name\ server\ for\ zone ptr\:host\ name\ or\ other\ information soa\:domain\'"'"'s\ \`start-of-authority\'"'"'\ information txt\:text\ information uinfo\:user\ information wks\:supported\ well-known\ services))'
+  'retry[change number of retries]:number of retries:'
+  'root[change name of root server]:root server:_hosts'
+  'timeout[change initial timeout interval]:timeout (seconds):'
+)
+
+if [[ -n "$compcontext" ]]; then
+  if [[ CURRENT -eq 1 ]]; then
+
+    funcall ret _nslookup_command && return ret
+
+    _description expl 'command'
+    compadd "$expl[@]" - server lserver root finger ls view help set && ret=0
+    _hosts && ret=0
+    return ret
+  elif [[ "$compstate[context]" = redirect ]]; then
+
+    funcall ret _nslookup_redirect && return ret
+
+    if [[ "$words[1]" != (finger|ls) ]]; then
+      _message "redirection not allowed for command \`$words[1]'"
+      return 1
+    elif [[ "$compstate[redirect]" = '>' ]]; then
+      _description expl 'write to file'
+    elif [[ "$compstate[redirect]" = '>>' ]]; then
+      _description expl 'append to file'
+    else
+      _message "unknown redirection operator \`$compstate[redirect]'"
+      return 1
+    fi
+
+    _files "$expl[@]"
+    return
+  fi
+
+  if [[ "$words[1]" = [a-z]## ]]; then
+    funcall ret _nslookup_$words[1] && return ret
+  else
+    funcall ret _nslookup_host && return ret
+  fi
+
+  case "$words[1]" in
+  (|l)server)
+    _description expl 'new default server'
+    _hosts "$expl[@]"
+    return
+    ;;
+  root|exit|help|\?)
+    return 1
+    ;;
+  finger)
+    _message 'finger name'
+    return 1
+    ;;
+  ls)
+    _arguments -s \
+      '-t[records of given type]:query information type:((a\:internet\ address cname\:canonical\ name\ for\ alias hinfo\:CPU\ and\ operating\ system\ type minfo\:mailbox\ or\ mail\ list\ information mx\:mail\ exchanger ns\:name\ server\ for\ zone ptr\:host\ name\ or\ other\ information soa\:domain\'"'"'s\ \`start-of-authority\'"'"'\ information txt\:text\ information uinfo\:user\ information wks\:supported\ well-known\ services))' \
+     '-a[aliases of hosts in domain]' \
+     '-d[all records]' \
+     '-h[CPU and operating system information]' \
+     '-s[well-known services]' \
+     ':domain:_hosts'
+    return
+    ;;
+  view)
+    _description expl 'view file'
+    _files "$expl[@]"
+    return
+    ;;
+  set)
+    typeset -A values
+
+    _values 'state information' "$setopts[@]" && ret=0
+
+    [[ -z "$state" ]] && return ret
+    ;;
+  *)
+    _description expl 'server'
+    _hosts "$expl[@]"
+    return
+  esac
+fi
+
+# Now comes the command line option completion part.
+
+if [[ -z "$state" ]]; then
+  local line
+  typeset -A options
+
+  _arguments \
+    "-${(@)^${(@M)setopts:#*\]:*}/\[/=[}" \
+    "-${(@)^setopts:#(\(|*\]:)*}" \
+    "${(@)^${(@)${(@M)setopts:#\(*}/\)/)-}/\(/(-}" \
+    ':host to find:_hosts' \
+    ':server:_hosts' && ret=0
+fi
+
+# This is completion after `srchlist' for both types.
+
+if [[ -n "$state" ]]; then
+  if compset -P '*/'; then
+    _description expl 'search list entry'
+  else
+    _description expl 'default domain name and first search list entry'
+  fi
+  if [[ -n "$_vals_cache_multi" ]]; then
+    _hosts "$expl[@]" -qS/ -r "/\\- \\t\\n$_vals_cache_multi"
+  else
+    _hosts "$expl[@]" -qS/
+  fi
+  return
+fi
+
+return ret