home *** CD-ROM | disk | FTP | other *** search
/ vsiftp.vmssoftware.com / VSIPUBLIC@vsiftp.vmssoftware.com.tar / FREEWARE / FREEWARE40.ZIP / dbs-odsm / interrupt.for < prev    next >
Text File  |  1993-11-03  |  5KB  |  182 lines

  1.     program interrupt
  2.  
  3. C+
  4. C Version:    X1-005
  5. C
  6. C Facility:    General Utilities
  7. C
  8. C Abstract:    This program will write a message to a mailbox.
  9. C        Designed for locally written detached processors that use
  10. C        a standard communication interface.
  11. C
  12. C Environment:    VMS V5.0 and later.
  13. C
  14. C    module interrupt_cld
  15. C
  16. C    define verb interrupt
  17. C        qualifier vanilla, nonnegatable
  18. C        qualifier nodefault, nonnegatable
  19. C        qualifier noprefix, nonnegatable
  20. C        parameter p1, label=utility, prompt="whom"
  21. C                ,value (required)
  22. C        parameter p2, label=message, prompt="message"
  23. C                ,value (required, type=$rest_of_line)
  24. C
  25. C History:
  26. C
  27. C    14-Dec-1989, DBS; Version X1-001
  28. C 001 -    Original version.
  29. C    07-Feb-1990, DBS; Version X1-002
  30. C 002 -    Catch a ^Z on the get_foreign prompt and don't let cli ask again.
  31. C    26-Feb-1990, DBS; Version X1-003
  32. C 003 -    Fix missing argument to lib$signal() call.
  33. C    12-Jul-1990, DBS; Version X1-004
  34. C 004 -    Prefixed the message with a char(130) to make it more difficult to
  35. C    send bogus messages.
  36. C    03-Nov-1993, DBS; Version X1-005
  37. C 005 -    Added a /noprefix qualifier for use with other detached processes
  38. C    and added /vanilla to imply /nodefault and /noprefix (saves typing).
  39. C-
  40.  
  41.      implicit none
  42.  
  43.     include '($CLIDEF)/nolist'
  44.     include '($IODEF)/nolist'
  45.     include '($RMSDEF)/nolist'
  46.  
  47. C External references
  48.  
  49.     integer*4    cli$dcl_parse
  50.     external    cli$dcl_parse
  51.     integer*4    cli$get_value
  52.     external    cli$get_value
  53.     integer*4    cli$present
  54.     external    cli$present
  55.     external    interrupt_cld
  56.     external    intrupt__nomailbox
  57.     external    intrupt__notdeliv
  58.     external    intrupt__success
  59.     integer*4    lib$get_foreign
  60.     external    lib$get_foreign
  61.     external    lib$get_input
  62.     external    lib$put_output
  63.     external    lib$signal
  64.     external    str_collapse
  65.     integer*4    str_len
  66.     external    str_len
  67.     external    str_uppercase
  68.     integer*4    sys$assign
  69.     external    sys$assign
  70.     integer*4    sys$qiow
  71.     external    sys$qiow
  72.  
  73. C Type declarations for variables
  74.  
  75.     integer*4    do, nothing
  76.     integer*4    istatus
  77.     integer*2    mbx_channel
  78.     character    mbx_name*256
  79.     integer*4    mbx_name_len
  80.     integer*4    mbx_status
  81.     character    mbx_suffix*(*)
  82.     parameter    (mbx_suffix = '_MAILBOX')
  83.     integer*2    qio_iosb(4)
  84.  
  85.     integer*4    cli_status
  86.     character    cli_c_verb*9        /'INTERRUPT'/
  87.     character    cli_c_prompt*7        /'_whom: '/
  88.     character    cli_t_command*256
  89.     integer*4    cli_s_command
  90.     integer*4    cli_nodefault
  91.     character    cli_c_nodefault*9    /'NODEFAULT'/
  92.     integer*4    cli_noprefix
  93.     character    cli_c_noprefix*8    /'NOPREFIX'/
  94.     integer*4    cli_vanilla
  95.     character    cli_c_vanilla*7        /'VANILLA'/
  96.     character    cli_c_utility*7        /'UTILITY'/
  97.     integer*2    cli_s_utility
  98.     character    cli_t_utility*80
  99.     character    cli_c_message*7        /'MESSAGE'/
  100.     integer*2    cli_s_message
  101.     character    cli_t_message*256
  102.  
  103. C+
  104. C Mainline
  105. C-
  106.  
  107.     istatus = lib$get_foreign (cli_t_command, cli_c_prompt, cli_s_command)
  108.  
  109.     if (istatus .eq. rms$_eof) then
  110.         do = nothing
  111.     else
  112.     cli_t_command = cli_c_verb//' '//cli_t_command
  113.     cli_s_command = cli_s_command + len(cli_c_verb) + 1
  114.  
  115.     call cli$dcl_parse (cli_t_command, interrupt_cld
  116.     1            ,lib$get_input, lib$get_input
  117.     1            ,cli_c_prompt)
  118.  
  119.     cli_nodefault = cli$present (cli_c_nodefault)
  120.     cli_noprefix  = cli$present (cli_c_noprefix)
  121.     cli_vanilla   = cli$present (cli_c_vanilla)
  122.  
  123.     if (cli_vanilla) then
  124.         cli_nodefault = cli_vanilla
  125.         cli_noprefix  = cli_vanilla
  126.     endif !(cli_vanilla) then
  127.  
  128.     call cli$get_value (cli_c_utility, cli_t_utility, cli_s_utility)
  129.  
  130.     if (cli_s_utility .eq. 0) then
  131.         do = nothing
  132.     else
  133.     call cli$get_value (cli_c_message, cli_t_message, cli_s_message)
  134.  
  135.     if (cli_s_message .eq. 0) then
  136.         do = nothing
  137.     else
  138.     if (cli_nodefault) then
  139.         mbx_name = cli_t_utility(1:cli_s_utility)
  140.     else
  141.     mbx_name = cli_t_utility(1:cli_s_utility)//mbx_suffix
  142.     endif !(cli_nodefault) then
  143.  
  144.     call str_collapse (mbx_name, mbx_name)
  145.     call str_uppercase (mbx_name)
  146.  
  147.     mbx_name_len = str_len (mbx_name)
  148.  
  149.     mbx_status = sys$assign (%descr(mbx_name(1:mbx_name_len))
  150.     1            ,%ref(mbx_channel),,)
  151.  
  152.     if (.not. mbx_status) then
  153.         call lib$signal (intrupt__nomailbox
  154.     1            ,%val(1), %descr(mbx_name(1:mbx_name_len))
  155.     1            ,%val(mbx_status))
  156.     else
  157.     if (cli_s_message .ne. 0) then
  158.         if (.not. cli_noprefix) then
  159.           cli_t_message = char(130)//cli_t_message(1:cli_s_message)
  160.           cli_s_message = cli_s_message + 1
  161.         endif !(.not. cli_noprefix) then
  162.         mbx_status = sys$qiow (,%val(mbx_channel)
  163.     1                ,%val(io$_writevblk .or. io$m_now)
  164.     1                ,%ref(qio_iosb(1)),,
  165.     1                ,%ref(cli_t_message)
  166.     1                ,%val(cli_s_message),,,,)
  167.         if (.not. mbx_status) then
  168.             call lib$signal (intrupt__notdeliv
  169.     1                ,%val(0)
  170.     1                ,%val(mbx_status))
  171.         else
  172.         call lib$signal (intrupt__success
  173.     1            ,%val(1), %descr(mbx_name(1:mbx_name_len)))
  174.         endif !(.not. mbx_status) then
  175.     endif !(cli_s_message .ne. 0) then
  176.     endif !(.not. mbx_status) then
  177.     endif !(cli_s_message .eq. 0) then
  178.     endif !(cli_s_utility .eq. 0) then
  179.     endif !(istatus .eq. rms$_eof) then
  180.  
  181.     end
  182.