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

Telnet服务器

开发平台:

Unix_Linux

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