outfilter.pl
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # ====================================================================
  3. # The Vovida Software License, Version 1.0 
  4. # Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in
  12. #    the documentation and/or other materials provided with the
  13. #    distribution.
  14. # 3. The names "VOCAL", "Vovida Open Communication Application Library",
  15. #    and "Vovida Open Communication Application Library (VOCAL)" must
  16. #    not be used to endorse or promote products derived from this
  17. #    software without prior written permission. For written
  18. #    permission, please contact vocal@vovida.org.
  19. # 4. Products derived from this software may not be called "VOCAL", nor
  20. #    may "VOCAL" appear in their name, without prior written
  21. #    permission of Vovida Networks, Inc.
  22. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  23. # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  25. # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  26. # NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  27. # IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  28. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  29. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  30. # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  31. # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  33. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  34. # DAMAGE.
  35. # ====================================================================
  36. # This software consists of voluntary contributions made by Vovida
  37. # Networks, Inc. and many individuals on behalf of Vovida Networks,
  38. # Inc.  For more information on Vovida Networks, Inc., please see
  39. # <http://www.vovida.org/>.
  40. use Fcntl;
  41. #chdir; # go home
  42. $pipeName = "sip-outpipe";
  43. $IN_FIFO = "$pipeName.out";
  44. $IN_CTL_FIFO = "$pipeName.out.ctl";
  45. $OUT_FIFO = "$pipeName.in";
  46. $OUT_CTL_FIFO = "$pipeName.in.ctl";
  47. unless (-p $IN_FIFO) {
  48.     unlink $IN_FIFO;
  49.     system('mknod', $IN_FIFO, 'p')
  50.       && die "can't mknod $IN_FIFO: $!";
  51. }
  52. unless (-p $IN_CTL_FIFO) {
  53.     unlink $IN_CTL_FIFO;
  54.     system('mknod', $IN_CTL_FIFO, 'p')
  55.       && die "can't mknod $IN_FIFO: $!";
  56. }
  57. unless (-p $OUT_FIFO) {
  58.     unlink $OUT_FIFO;
  59.     system('mknod', $OUT_FIFO, 'p')
  60.       && die "can't mknod $OUT_FIFO: $!";
  61. }
  62. unless (-p $OUT_CTL_FIFO) {
  63.     unlink $OUT_CTL_FIFO;
  64.     system('mknod', $OUT_CTL_FIFO, 'p')
  65.       && die "can't mknod $OUT_FIFO: $!";
  66. }
  67. sysopen (IN_FIFO, $IN_FIFO, O_RDWR) || die "can't read $IN_FIFO: $!";
  68. sysopen (OUT_FIFO, $OUT_FIFO, O_RDWR) || die "can't write $OUT_FIFO: $!";
  69. sysopen (IN_CTL_FIFO, $IN_CTL_FIFO, O_RDWR) || die "can't read $IN_CTL_FIFO: $!";
  70. sysopen (OUT_CTL_FIFO, $OUT_CTL_FIFO, O_RDWR) || die "can't write $OUT_CTL_FIFO: $!";
  71. sub readOk {
  72.     $rin = $win = $ein = '';
  73.     vec($rin,fileno(IN_FIFO),1) = 1;
  74.     vec($rin,fileno(IN_CTL_FIFO),1) = 1;
  75.     ($nfound,$timeleft) =
  76.       select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
  77.     @bits = split(//, unpack("b*", $rout));
  78.     if($bits[fileno(IN_CTL_FIFO)]) {
  79. # this is a reset of some sort, so trash everything and punt
  80.     }
  81.     
  82. }
  83. sub recMsg {
  84.     local($msg);
  85.     # use select?
  86.     # next line blocks until there's a reader
  87.     print "reading headern";
  88.     # check for reset messages in case something gets restarted
  89.     $total_bytes_read = 0;
  90.     $msg = "";
  91.     while($total_bytes_read < 15) {
  92. $total_bytes_read += sysread(IN_FIFO, $b, 15 - $total_bytes_read);
  93. if($total_bytes_read == 0) {
  94.     # do something here 
  95. #     print "nothing!n";
  96. }
  97. $msg .= $b;
  98.     }
  99.     if ($total_bytes_read < 15) {
  100. # print "foo!n";
  101.     }
  102.     # parse for number of bytes to read
  103.     chomp($msg);
  104.     ($cmd, $bytes_to_read) = split(/ /, $msg, 2);
  105. #    print "done reading headern";
  106. #    print "reading ($bytes_to_read bytes)n";
  107.     $total_bytes_read = 0;
  108.     $msg = "";
  109.     while($total_bytes_read  < $bytes_to_read) {
  110. $bytes = sysread(IN_FIFO, $b, 
  111.  $bytes_to_read - $total_bytes_read);
  112. if($bytes == 0) {
  113.     # do something here 
  114. #     print "nothing!n";
  115. }
  116. $msg .= $b;
  117. $total_bytes_read += $bytes;
  118.     }
  119.     if ($total_bytes_read < $bytes_to_read) {
  120. # print "foo!n";
  121.     }
  122. #    print "done reading ($total_bytes_read bytes)n";
  123. #    print "got: $msgn";
  124.     return $msg;
  125. }
  126. sub sendMsg {
  127.     local($msg) = $_[0];
  128.     local($encodedMsg);
  129.     local($total_bytes_written) = 0;
  130.     local($header);
  131.     local($bytes_to_write);
  132.     local($bytes);
  133. #    print "write buf: $headern";
  134.     $header = sprintf("msg %10.10dn", length($msg));
  135.     $encodedMsg = $header . $msg;
  136.     $bytes_to_write = length($encodedMsg);
  137.     while($total_bytes_written < $bytes_to_write) {
  138. $bytes  = syswrite(OUT_FIFO, $encodedMsg, 
  139.    length($encodedMsg) - $total_bytes_written, 
  140.    $total_bytes_written);
  141. if(!$bytes) {
  142.     die "error writing $OUT_FIFO: $!";
  143. }
  144. $total_bytes_written += $bytes;
  145.     }
  146. }
  147. ######################################################################
  148. #  everything above this line should not need to be changed
  149. ######################################################################
  150. # doing this resets the filter software and stops any waiting by the
  151. # other side
  152. $msg = "a";
  153. syswrite(OUT_CTL_FIFO, $msg, length($msg));
  154. # here is the infinite loop in question
  155. while (1) {
  156.     print "waiting for messagen";
  157.     $buf = recMsg();
  158.     print "got msg... parsing and retransmittingn";
  159.     print "buf:n$bufn----";  # uncomment this to print out buffers before they
  160.                             # are modified
  161.     $buf = &filter($buf);
  162.     print "newbuf:n$bufn!!!!";  # uncomment this to print out buffers before they
  163.                             # are modified
  164.     sendMsg($buf);
  165. }
  166. # below this is the filter
  167. sub filter {
  168.     local($_) = $_[0];
  169.     # put filter commands here
  170.     # for more information about perl regular expressions, do 
  171.     #
  172.     #     man perlre
  173.     # here are some examples
  174.     # s/hello/goodbye/; # replace hello with goodbye at most once per message
  175.     # s/true/false/g; # replace true with false as many times as possible
  176.     # s/upper/lower/i; # replace upper with lower without checking case
  177.     # s/^From/To/; # replace a with b at the start of the line only
  178.     # y/r//d; # this should kill carriage returns  (y means use tr syntax)
  179.     #s/aaln_([0-1])@galileo.private.vovida.com/aaln_1@192.168.5.1/g;
  180.     #s/aaln_0@galileo.private.vovida.com/6396@192.168.5.1/g;
  181.     s/aaln_0@galileo.private.vovida.com/6249@192.168.5.1/g;
  182.     s/([0-9])([0-9])([0-9])([0-9])@galileo.private.vovida.com/1234@192.168.5.1/g;
  183.     s/UDP galileo.private.vovida.com/UDP 192.168.5.1/g;
  184.     #s/([0-9])([0-9])([0-9])([0-9])@yoyo.private.vovida.com/1234@192.168.5.1/g;
  185.     #s/UDP yoyo.private.vovida.com/UDP 192.168.5.1/g;
  186.     #s/([0-9])([0-9])([0-9])([0-9])@frisbee.private.vovida.com/1234@192.168.5.1/g;
  187.     #s/UDP frisbee.private.vovida.com/UDP 192.168.5.1/g;
  188.     # Since our gateway puts dns name into the IN IP4 address field,
  189.     # convert it to an IP addresses for now until our gateway is fixed.
  190.     # Order is IMPORTANT !!! 
  191.     s/IN IP4 galileo.private.vovida.com/IN IP4 192.168.5.1/g;
  192.     #s/IN IP4 yoyo.private.vovida.com/IN IP4 192.168.20.15/g;
  193.     #s/IN IP4 frisbee.private.vovida.com/IN IP4 192.168.20.16/g;
  194.     {   
  195.         if (/^ACK /)
  196.         {
  197.             # We changed this line's IP address when the previous msg came in,
  198.             # since our stack incorrectly used this line instead of the c= line.
  199.             # Changed this back for the next message for consistency.
  200.             s/o=Pingtel 5 5 IN IP4 192.168.5.11[0-3]/o=Pingtel 5 5 IN IP4 127.0.0.1/;
  201.         }
  202.         else
  203.         {
  204.             # If this is any 1xx response, add a Content-Length: 0 line.
  205.             # This may no longer be needed
  206.             if (/^SIP/2.0 1/)
  207.             {
  208.                 s/CSeq: 1 INVITErnrn/CSeq: 1 INVITErnContent-Length: 0rnrn/;
  209.             }
  210.         }
  211.     }
  212.     if(/v=0/)
  213.     {
  214.         # this is an SDP
  215.         s/rrn/rn/g;        
  216. # print "this message has an SDP component!n";
  217.     }
  218.     # recalculate the content length
  219.     if(/(v=0(.|n)*)/)
  220.     {
  221.         print "xxx gotcha!n";
  222.         $len = length($1);
  223.         s/Content-Length: [0-9]*/Content-Length: $len/;
  224.     }
  225.     # don't change this line
  226.     return $_;
  227. }