iksdpy
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:7k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. #!/usr/local/bin/kermit +
  2. #
  3. # i k s d p y  --  IKSD display
  4. #
  5. # Active display of IKSD database.
  6. # Main screen lists all sessions, with option to switch to
  7. # a per-session detail screen.
  8. #
  9. # Illustrates:
  10. # . File record i/o
  11. # . WAIT FILE and v(kbchar)
  12. # . Arithmetic
  13. # . Hexadecimal decoding
  14. # . Single-keystroke program control
  15. # . Compact substring notation
  16. # . Rudimentary screen formatting
  17. #
  18. # Requires: C-Kermit 7.0 Beta.11 or later.
  19. #
  20. #   Last update: Tue Dec  7 19:19:03 1999
  21. #   Documentation: iksdb.txt
  22. #
  23. # Author: F. da Cruz, Columbia University, November 1999.
  24. local %c %n %p block dbfile rate dir user info
  25. ; Configuration (change as needed)...
  26. .rate = 4                               ; Screen refresh rate (sec)
  27. if def %1 .dbfile := %1               ; Database file
  28. if not def dbfile {
  29.     if eq "v(platform)" "32-bit_Windows" {
  30. if not equal "$(winbootdir)" "" .dbfile := $(winbootdir)/iksd.db
  31. else if not equal "$(windir)" "" .dbfile := $(windir)/iksd.db
  32. else if not equal "$(SystemRoot)" "" .dbfile := $(SystemRoot)/iksd.db
  33. else .dbfile = c:/iksd.db
  34.     } else {
  35.         .dbfile = /var/log/iksd.db
  36.     }
  37. }
  38. ; Operating variables and settings...
  39. set case off                            ; Case matters not
  40. set quiet on                            ; No noisy messages
  41. set sleep cancel on                     ; Allow interrupt WAIT from keyboard
  42. ; Macros
  43. define SHOWHELP {                       ; Main help screen
  44.     cls
  45.     echo {IKSD Display...}
  46.     echo
  47.     echo {Press:}
  48.     echo {  The Space Bar to switch between summary and detail screens.}
  49.     echo {  A digit to view a particular session, 0 through 9, or:}
  50.     echo {    X to enter a session number with two or more digits.}
  51.     echo {    M to return to the Main screen.}
  52.     echo {    N to see the Next session (cycle through sessions).}
  53.     echo {    H to see this Help message.}
  54.     echo {    Q to Quit.}
  55.     set ask-timer 0
  56.     echo
  57.     getc %9 {Press any key to continue: }
  58.     set ask-timer m(rate)
  59. }
  60. define SHOWRECORD {                     ; Interpret a record
  61.     .pid := fltrim(s(block[17:16]),0)
  62.     .flags := fhex2n(s(block[1:4]))
  63.     if ( (m(flags)&1) ) { .%v = (IN_USE) } else { .%v = (FREE) }
  64.     if ( (m(flags)&2) ) { .%v := %v(REAL_USER) }
  65.     if ( (m(flags)&4) ) { .%v := %v(LOGGED_IN) }
  66.     cls                                 ; Clear screen and print detail
  67.     echo [m(dbfile)] Session %1: v(time)...
  68.     echo
  69.     echo { Flags: s(block[1:4]) %v}
  70.     echo { AuthT: s(block[5:4])}
  71.     echo { AuthM: s(block[9:4])}
  72.     echo { State: s(block[13:4])}
  73.     echo { Lhost: fhex2ip(s(block[41:8]))} ; 32+8+1
  74.     echo { Rhost: fhex2ip(s(block[57:8]))} ; 48+8+1
  75.     echo { PID:   m(pid) (fhex2n(m(pid)))}
  76.     echo { Start: s(block[66:17])}
  77.     echo { Last:  s(block[84:17])}
  78.     echo { User:  s(block[1025:fhex2n(s(block[101:4]))])}
  79.     echo { Dir:   s(block[2049:fhex2n(s(block[105:4]))])}
  80.     echo { Info:  s(block[3073:fhex2n(s(block[109:4]))])}
  81.     echo
  82. }
  83. define SHOWDETAIL {                     ; Show details for a session
  84.     local %k %v %x
  85.     if not def %1 return
  86.     if ( < fcode({%1}) 32 ) return
  87.     if eq {%1} { } .%1 = 0
  88.     if eq {%1} {N} .%1 = 0
  89.     .%x = %1
  90.     while true {                        ; Loop in detail screen
  91.         if def %x switch %x {         ; What did they type?
  92.   :[0-9]                        ; A digit
  93.               .%1 := %x
  94.       break                     ; So that's the session number.
  95.   :H, showhelp,                 ; An 'H' so show help text.
  96.               if not num %1 return
  97.               break
  98.   :Q, echo Q, exit 0                     ; 'Q' for quit.
  99.           :N, .%n ::= (fsize(m(dbfile))/4096) ; Check for new records
  100.               .%1 ::= fmod(%1+1,%n)          ; Go to next session
  101.               break
  102.   :X, xecho 13                          ; Long session number
  103.       screen cleol                       ; Clear this line
  104.       set ask-timer 0
  105.       ask %1 { Enter session number: }  ; Prompt and wait for text
  106.       set ask-timer m(rate)             ; up to CR with no timeout.
  107.       if not def %1 .%1 = 0            ; If CR only, use 0.
  108.               if not numeric %1 {               ; Check for n-ness.
  109.                   echo Number required
  110.                   return
  111.               }
  112.       break
  113.           :M, return                             ; Return to main screen.
  114.   :default
  115.               echo Not a choice: "%1"
  116.               pause 1
  117.               return
  118.         }
  119.         if ( > %1 (%n-1) || < %1 0 ) { echo Out of range, pause 1, return }
  120.         .%k ::= %1*4096               ; Seek position for desired record
  121.         fclose %c                      ; Close/Open to force data refresh
  122.         fopen /read /binary %c m(dbfile)
  123.         if fail end 1 CLOSE OPEN FAILURE
  124. fseek %c %k                   ; Seek to record
  125. if fail end 1 Seek failed.
  126. .%p := f_pos(%c)
  127. fread /size:4096 %c block      ; Read it
  128. if fail end 1 Read failed.
  129. if ( ! = f_pos(%c) %p+4096 ) exit 1 FATAL - Database corrupt
  130.         showrecord %1                  ; Show it
  131. xecho {[0-9] (session digit), H[elp], or Q[uit]: }
  132. wait 60 file modification m(dbfile)
  133. if success continue
  134. undef %x
  135. if ( def v(kbchar) ) { .%x := v(kbchar) } else { getc %x }
  136.         if not def %x continue
  137.         if eq { } {%x} .%x = M
  138.     }
  139. }
  140. ; Main display...
  141. undef %c                               ; Database not yet open
  142. set ask-timer m(rate)                  ; Refresh rate control
  143. while true {                            ; Main loop
  144.     cls
  145.     if ( not def %c ) {         ; If database not open
  146. if exist m(dbfile) {           ; If it exists
  147.     fopen /read /binary %c m(dbfile) ; Open it
  148.     if fail {
  149. echo m(dbfile) - Open failed: f_errmsg()
  150. sleep m(rate)
  151. continue
  152.     }
  153. } else {                        ; It doesn't exist
  154.     echo [m(dbfile)] - Does not exist: v(time)...
  155.             sleep m(rate)
  156.     continue
  157. }
  158.     }
  159.     echo [m(dbfile)] v(time)...       ; Top line - filename & time
  160.     echo
  161.     echo {    Flgs Host........... Start... Last.... (PID)(user)(dir)(what)}
  162.     .%n = 0
  163.     frewind %c                         ; Rewind database
  164.     if fail { undef %c, continue }     ; On failure go gack and reopen it
  165.     while ( ! f_eof(%c) ) {           ; Loop to read each record
  166.         fread /size:4096 %c block
  167.         if fail break
  168.         if ( != fmod(f_pos(%c),4096) 0 ) exit 1 FATAL - Database corrupt
  169.         incr %p 4096
  170.         .user := ftrim(s(block[1025:1024]))
  171.         .dir  := ftrim(s(block[2049:1024]))
  172.         .info := ftrim(s(block[3073:1024]))
  173.         .%a := flpad(%n,2). s(block[1:4]) -
  174. frpad(fhex2ip(s(block[57:8])),15)s(block[74:9])s(block[92:9]) -
  175. (fhex2n(s(block[17:16])))(m(user))(m(dir))(m(info))
  176. echo fleft(%a,v(cols))
  177.         incr %n
  178.     }
  179.     echo
  180.     xecho {[0-9] (session digit), H[elp], or Q[uit]: }
  181.     wait 60 file modification m(dbfile)
  182.     if success continue
  183.     undef %x
  184.     if ( def v(kbchar) ) { .%x := v(kbchar) } else { getc %x }
  185.     if ( defined %x ) showdetail {%x}
  186.     if ( == %n 1 ) { fclose %c, undef %c } ; Force refresh if only one
  187. }