You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #ifndef _IPXE_OPEN_H
  2. #define _IPXE_OPEN_H
  3. /** @file
  4. *
  5. * Data transfer interface opening
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <stdarg.h>
  10. #include <ipxe/tables.h>
  11. #include <ipxe/socket.h>
  12. struct uri;
  13. struct interface;
  14. /** Location types */
  15. enum {
  16. /** Location is a URI
  17. *
  18. * Parameter list for open() is:
  19. *
  20. * struct uri *uri;
  21. */
  22. LOCATION_URI = 1,
  23. /** Location is a URI string
  24. *
  25. * Parameter list for open() is:
  26. *
  27. * const char *uri_string;
  28. */
  29. LOCATION_URI_STRING,
  30. /** Location is a socket
  31. *
  32. * Parameter list for open() is:
  33. *
  34. * int semantics;
  35. * struct sockaddr *peer;
  36. * struct sockaddr *local;
  37. */
  38. LOCATION_SOCKET,
  39. };
  40. /** A URI opener */
  41. struct uri_opener {
  42. /** URI protocol name
  43. *
  44. * This is the "scheme" portion of the URI, e.g. "http" or
  45. * "file".
  46. */
  47. const char *scheme;
  48. /** Open URI
  49. *
  50. * @v intf Object interface
  51. * @v uri URI
  52. * @ret rc Return status code
  53. */
  54. int ( * open ) ( struct interface *intf, struct uri *uri );
  55. };
  56. /** URI opener table */
  57. #define URI_OPENERS __table ( struct uri_opener, "uri_openers" )
  58. /** Register a URI opener */
  59. #define __uri_opener __table_entry ( URI_OPENERS, 01 )
  60. /** A socket opener */
  61. struct socket_opener {
  62. /** Communication semantics (e.g. SOCK_STREAM) */
  63. int semantics;
  64. /** Address family (e.g. AF_INET) */
  65. int family;
  66. /** Open socket
  67. *
  68. * @v intf Object interface
  69. * @v peer Peer socket address
  70. * @v local Local socket address, or NULL
  71. * @ret rc Return status code
  72. */
  73. int ( * open ) ( struct interface *intf, struct sockaddr *peer,
  74. struct sockaddr *local );
  75. };
  76. /** Socket opener table */
  77. #define SOCKET_OPENERS __table ( struct socket_opener, "socket_openers" )
  78. /** Register a socket opener */
  79. #define __socket_opener __table_entry ( SOCKET_OPENERS, 01 )
  80. extern struct uri_opener * xfer_uri_opener ( const char *scheme );
  81. extern int xfer_open_uri ( struct interface *intf, struct uri *uri );
  82. extern int xfer_open_uri_string ( struct interface *intf,
  83. const char *uri_string );
  84. extern int xfer_open_named_socket ( struct interface *intf, int semantics,
  85. struct sockaddr *peer, const char *name,
  86. struct sockaddr *local );
  87. extern int xfer_open_socket ( struct interface *intf, int semantics,
  88. struct sockaddr *peer, struct sockaddr *local );
  89. extern int xfer_vopen ( struct interface *intf, int type, va_list args );
  90. extern int xfer_open ( struct interface *intf, int type, ... );
  91. extern int xfer_vreopen ( struct interface *intf, int type,
  92. va_list args );
  93. #endif /* _IPXE_OPEN_H */