rfc931.pl.in
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:2k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. #!@PERL@
  2. #
  3. # rfc931.pl
  4. # Usage
  5. # require "rfc931.pl";
  6. # &rfc931_name(there[,here]);
  7. # where there is a sockaddr.
  8. # for example
  9. # &rfc931_name(getpeername(STDIN),getsockname(STDIN));
  10. # &rfc931_name(getpeername(SOCK),getsockname(SOCK));
  11. #
  12. # require "sys/socket.ph";
  13. # $Id: rfc931.pl.in,v 1.1 2000/01/15 01:45:39 edwardc Exp $
  14. package rfc931;
  15. sub timeout {
  16. ($sig) = @_;
  17. $time_out =1;
  18. goto longjmp;
  19. }
  20. $RFC931_TIMEOUT=20;
  21. $DEFAULT_RFC931_PORT=113;
  22. sub main'rfc931_name {
  23.         $sockaddr = 'S n a4 x8';
  24. ($there,$here)=@_;
  25. # print "here rn";
  26. $here=getsockname(STDOUT) if (-S STDOUT && !$here) ;
  27. ($family,$thisport,$thisaddr)=unpack($sockaddr,$here);
  28. ($localaddr)=unpack('C4',$thisaddr);
  29. # print "$localaddr $remoteaddrn";
  30. # return "" if !there;
  31. $there=getpeername(STDOUT) if  (-S STDOUT && !$there) ;
  32. # return "" if !$here;
  33. ($family,$thatport,$thataddr)=unpack($sockaddr,$there);
  34. ($remoteaddr)=unpack('C4',$thataddr);
  35. # print "$localaddr $remoteaddrn";
  36. ($name,$alias,$proto)=getprotobyname('tcp');
  37. ($name,$alias,$RFC931_PORT)=getservbyname('ident','tcp');
  38. $RFC931_PORT = $DEFAULT_RFC931_PORT unless $RFC931_PORT;
  39. # socket(IDENT,&main'PF_INET,&main'SOCK_STREAM,$proto) || return "";
  40. socket(IDENT,2,1,$proto) || return "";
  41. # $this=pack($sockaddr,&main'AF_INET,0,$thisaddr);
  42. $this=pack($sockaddr,2,0,$thisaddr);
  43. bind(IDENT,$this) || return ""; 
  44. $SIG{'ALRM'} = 'timeout';
  45. $time_out = 0;
  46. longjump: if ($time_timout){
  47. close(IDENT);
  48. return $result;
  49. }
  50. alarm($RFC931_TIMEOUT);
  51. # connect to the RFC931 daeomon
  52. $that=pack($sockaddr, 2 ,$RFC931_PORT,$thataddr);
  53. if (!connect(IDENT,$that)) {
  54. close(IDENT);
  55. alarm(0);
  56. return "";
  57. }
  58. select(IDENT); $| = 1; select(STDOUT);
  59. printf IDENT "%u,%urn", $thatport,$thisport;
  60. # printf "%u,%urn", $thatport,$thisport;
  61. $_=<IDENT>;
  62. # print $_;
  63. # sscanf($_,'%u , %u : USERID :%*[^:]:%255s',$remote,$local,$user);
  64. ($remote,$local,$user) = /^(d+) , (d+) : USERID : wwww : (w+)/;
  65. # print $user;
  66. alarm(0);
  67. close(IDENT);
  68. return $user;
  69. }
  70. # &main'rfc931_name;
  71. 1;