sockutil.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:2k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Low level socket routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <errno.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "netuser.h"
  8. #include "socket.h"
  9. #include "usock.h"
  10. /* Convert a socket (address + port) to an ascii string of the form
  11.  * aaa.aaa.aaa.aaa:ppppp
  12.  */
  13. char *
  14. psocket(p)
  15. void *p;
  16. {
  17. struct sockaddr *sp; /* Pointer to structure to decode */
  18. sp = (struct sockaddr *)p;
  19. if(sp->sa_family < AF_INET || sp->sa_family >= NAF)
  20. return NULL;
  21. return (*Psock[sp->sa_family])(sp);
  22. }
  23. /* Return ASCII string giving reason for connection closing */
  24. char *
  25. sockerr(s)
  26. int s; /* Socket index */
  27. {
  28. register struct usock *up;
  29. struct socklink *sp;
  30. if((up = itop(s)) == NULL){
  31. errno = EBADF;
  32. return Badsocket;
  33. }
  34. sp = up->sp;
  35. if(sp->error != NULL){
  36. return sp->error[up->errcodes[0]];
  37. } else {
  38. errno = EOPNOTSUPP; /* not yet, anyway */
  39. return NULL;
  40. }
  41. }
  42. /* Get state of protocol. Valid only for connection-oriented sockets. */
  43. char *
  44. sockstate(s)
  45. int s; /* Socket index */
  46. {
  47. register struct usock *up;
  48. struct socklink *sp;
  49. if((up = itop(s)) == NULL){
  50. errno = EBADF;
  51. return NULL;
  52. }
  53. if(up->cb.p == NULL){
  54. errno = ENOTCONN;
  55. return NULL;
  56. }
  57. sp = up->sp;
  58. if(sp->state != NULL)
  59. return (*sp->state)(up);
  60. /* Datagram sockets don't have state */
  61. errno = EOPNOTSUPP;
  62. return NULL;
  63. }
  64. /* Convert a socket index to an internal user socket structure pointer */
  65. struct usock *
  66. itop(s)
  67. register int s; /* Socket index */
  68. {
  69. if(s < 0 || _fd_type(s) != _FL_SOCK)
  70. return NULL; /* Valid only for sockets */
  71. s = _fd_seq(s);
  72. if(s >= Nsock)
  73. return NULL;
  74. return Usock[s];
  75. }
  76. void
  77. st_garbage(red)
  78. int red;
  79. {
  80. int i;
  81. struct usock *up;
  82. for(i=0;i<Nsock;i++){
  83. up = Usock[i];
  84. if(up != NULL && up->type == TYPE_LOCAL_STREAM)
  85. mbuf_crunch(&up->cb.local->q);
  86. }
  87. }