david/ipxe
Archived
1
0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/gpxe/resolv.h

167 lines
4.4 KiB
C
Raw Normal View History

2007-01-18 23:38:13 +01:00
#ifndef _GPXE_RESOLV_H
#define _GPXE_RESOLV_H
/** @file
*
* Name resolution
*
*/
#include <gpxe/refcnt.h>
#include <gpxe/interface.h>
#include <gpxe/tables.h>
2007-01-18 23:38:13 +01:00
struct sockaddr;
struct resolv_interface;
2007-01-18 23:38:13 +01:00
/** Name resolution interface operations */
struct resolv_interface_operations {
/** Name resolution completed
*
* @v resolv Name resolution interface
* @v sa Completed socket address (if successful)
* @v rc Final status code
*/
void ( * done ) ( struct resolv_interface *resolv,
struct sockaddr *sa, int rc );
};
/** A name resolution interface */
struct resolv_interface {
/** Generic object communication interface */
struct interface intf;
/** Operations for received messages */
struct resolv_interface_operations *op;
};
extern struct resolv_interface null_resolv;
extern struct resolv_interface_operations null_resolv_ops;
/**
* Initialise a name resolution interface
*
* @v resolv Name resolution interface
* @v op Name resolution interface operations
* @v refcnt Containing object reference counter, or NULL
*/
static inline void resolv_init ( struct resolv_interface *resolv,
struct resolv_interface_operations *op,
struct refcnt *refcnt ) {
resolv->intf.dest = &null_resolv.intf;
resolv->intf.refcnt = refcnt;
resolv->op = op;
}
/**
* Get name resolution interface from generic object communication interface
*
* @v intf Generic object communication interface
* @ret resolv Name resolution interface
*/
static inline __attribute__ (( always_inline )) struct resolv_interface *
intf_to_resolv ( struct interface *intf ) {
return container_of ( intf, struct resolv_interface, intf );
}
/**
* Get reference to destination name resolution interface
*
* @v resolv Name resolution interface
* @ret dest Destination interface
*/
static inline __attribute__ (( always_inline )) struct resolv_interface *
resolv_get_dest ( struct resolv_interface *resolv ) {
return intf_to_resolv ( intf_get ( resolv->intf.dest ) );
}
/**
* Drop reference to name resolution interface
*
* @v resolv name resolution interface
*/
static inline __attribute__ (( always_inline )) void
resolv_put ( struct resolv_interface *resolv ) {
intf_put ( &resolv->intf );
}
/**
* Plug a name resolution interface into a new destination interface
*
* @v resolv Name resolution interface
* @v dest New destination interface
*/
static inline __attribute__ (( always_inline )) void
resolv_plug ( struct resolv_interface *resolv, struct resolv_interface *dest ) {
plug ( &resolv->intf, &dest->intf );
}
/**
* Plug two name resolution interfaces together
*
* @v a Name resolution interface A
* @v b Name resolution interface B
*/
static inline __attribute__ (( always_inline )) void
resolv_plug_plug ( struct resolv_interface *a, struct resolv_interface *b ) {
plug_plug ( &a->intf, &b->intf );
}
/**
* Unplug a name resolution interface
*
* @v resolv Name resolution interface
*/
static inline __attribute__ (( always_inline )) void
resolv_unplug ( struct resolv_interface *resolv ) {
plug ( &resolv->intf, &null_resolv.intf );
}
/**
* Stop using a name resolution interface
*
* @v resolv Name resolution interface
*
* After calling this method, no further messages will be received via
* the interface.
*/
static inline void resolv_nullify ( struct resolv_interface *resolv ) {
resolv->op = &null_resolv_ops;
};
2007-01-18 23:38:13 +01:00
/** A name resolver */
struct resolver {
/** Name of this resolver (e.g. "DNS") */
const char *name;
/** Start name resolution
*
* @v resolv Name resolution interface
* @v name Name to resolve
* @v sa Socket address to complete
2007-01-18 23:38:13 +01:00
* @ret rc Return status code
*/
int ( * resolv ) ( struct resolv_interface *resolv, const char *name,
struct sockaddr *sa );
2007-01-18 23:38:13 +01:00
};
/** Numeric resolver priority */
#define RESOLV_NUMERIC 01
/** Normal resolver priority */
#define RESOLV_NORMAL 02
2007-01-18 23:38:13 +01:00
/** Register as a name resolver */
#define __resolver( resolv_order ) \
__table ( struct resolver, resolvers, resolv_order )
2007-01-18 23:38:13 +01:00
extern void resolv_done ( struct resolv_interface *resolv,
struct sockaddr *sa, int rc );
extern void ignore_resolv_done ( struct resolv_interface *resolv,
struct sockaddr *sa, int rc );
extern struct resolv_interface_operations null_resolv_ops;
2007-07-17 02:16:24 +02:00
extern struct resolv_interface null_resolv;
extern int resolv ( struct resolv_interface *resolv, const char *name,
struct sockaddr *sa );
2007-01-18 23:38:13 +01:00
#endif /* _GPXE_RESOLV_H */