iPXE
Data Structures | Functions | Variables
nslookup.c File Reference

Standalone name resolution. More...

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ipxe/resolv.h>
#include <ipxe/tcpip.h>
#include <ipxe/monojob.h>
#include <ipxe/settings.h>
#include <usr/nslookup.h>

Go to the source code of this file.

Data Structures

struct  nslookup
 A name resolution request. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER)
 
static void nslookup_close (struct nslookup *nslookup, int rc)
 Terminate name resolution. More...
 
static void nslookup_resolv_done (struct nslookup *nslookup, struct sockaddr *sa)
 Handle resolved name. More...
 
static int resolv_setting (struct interface *job, const char *name, const char *setting_name)
 Initiate standalone name resolution. More...
 
int nslookup (const char *name, const char *setting_name)
 Perform (blocking) standalone name resolution. More...
 

Variables

static struct interface_operation nslookup_resolver_operations []
 Name resolution resolver interface operations. More...
 
static struct interface_descriptor nslookup_resolver_desc
 Name resolution resolver interface descriptor. More...
 
static struct interface_operation nslookup_job_operations []
 Name resolution job control interface operations. More...
 
static struct interface_descriptor nslookup_job_desc
 Name resolution job control interface descriptor. More...
 

Detailed Description

Standalone name resolution.

Definition in file nslookup.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER  )

◆ nslookup_close()

static void nslookup_close ( struct nslookup nslookup,
int  rc 
)
static

Terminate name resolution.

Parameters
nslookupName resolution request
rcReason for termination

Definition at line 58 of file nslookup.c.

58  {
59 
60  /* Shut down interfaces */
63 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_shutdown(struct interface *intf, int rc)
Shut down an object interface.
Definition: interface.c:273
struct interface job
Job control interface.
Definition: nslookup.c:44
struct interface resolver
Data transfer interface.
Definition: nslookup.c:46
A name resolution request.
Definition: nslookup.c:39

References intf_shutdown(), nslookup::job, rc, and nslookup::resolver.

Referenced by nslookup_resolv_done().

◆ nslookup_resolv_done()

static void nslookup_resolv_done ( struct nslookup nslookup,
struct sockaddr sa 
)
static

Handle resolved name.

Parameters
nslookupName resolution request
saCompleted socket address

Definition at line 71 of file nslookup.c.

72  {
73  struct sockaddr_in *sin;
74  struct sockaddr_in6 *sin6;
75  const struct setting_type *default_type;
76  struct settings *settings;
77  struct setting setting;
78  void *data;
79  size_t len;
80  int rc;
81 
82  /* Extract address */
83  switch ( sa->sa_family ) {
84  case AF_INET:
85  sin = ( ( struct sockaddr_in * ) sa );
86  data = &sin->sin_addr;
87  len = sizeof ( sin->sin_addr );
88  default_type = &setting_type_ipv4;
89  break;
90  case AF_INET6:
91  sin6 = ( ( struct sockaddr_in6 * ) sa );
92  data = &sin6->sin6_addr;
93  len = sizeof ( sin6->sin6_addr );
94  default_type = &setting_type_ipv6;
95  break;
96  default:
97  rc = -ENOTSUP;
98  goto err;
99  }
100 
101  /* Parse specified setting name */
104  &setting ) ) != 0 )
105  goto err;
106 
107  /* Apply default type if necessary */
108  if ( ! setting.type )
109  setting.type = default_type;
110 
111  /* Store in specified setting */
112  if ( ( rc = store_setting ( settings, &setting, data, len ) ) != 0 )
113  goto err;
114 
115  err:
116  /* Terminate name resolution */
118 }
static void nslookup_close(struct nslookup *nslookup, int rc)
Terminate name resolution.
Definition: nslookup.c:58
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define AF_INET6
IPv6 Internet addresses.
Definition: socket.h:64
struct sockaddr sa
Definition: dns.c:68
sa_family_t sa_family
Socket address family.
Definition: socket.h:101
int store_setting(struct settings *settings, const struct setting *setting, const void *data, size_t len)
Store value of setting.
Definition: settings.c:618
IPv4 socket address.
Definition: in.h:82
char * setting_name
Setting name.
Definition: nslookup.c:49
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
struct sockaddr_in sin
Definition: dns.c:70
const struct setting_type * type
Setting type.
Definition: settings.h:36
struct settings * autovivify_child_settings(struct settings *parent, const char *name)
Find or create child settings block.
Definition: settings.c:306
A settings block.
Definition: settings.h:132
A setting.
Definition: settings.h:23
struct in_addr sin_addr
IPv4 address.
Definition: in.h:98
uint32_t len
Length.
Definition: ena.h:14
struct sockaddr_in6 sin6
Definition: dns.c:71
IPv6 socket address.
Definition: in.h:115
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
#define AF_INET
IPv4 Internet addresses.
Definition: socket.h:63
A setting type.
Definition: settings.h:191
int parse_setting_name(char *name, get_child_settings_t get_child, struct settings **settings, struct setting *setting)
Parse setting name.
Definition: settings.c:1532
struct in6_addr sin6_addr
IPv6 address.
Definition: in.h:132
A name resolution request.
Definition: nslookup.c:39

References AF_INET, AF_INET6, autovivify_child_settings(), data, ENOTSUP, len, nslookup_close(), parse_setting_name(), rc, sa, sockaddr::sa_family, nslookup::setting_name, sin, sin6, sockaddr_in6::sin6_addr, sockaddr_in::sin_addr, store_setting(), and setting::type.

◆ resolv_setting()

static int resolv_setting ( struct interface job,
const char *  name,
const char *  setting_name 
)
static

Initiate standalone name resolution.

Parameters
jobParent interface
nameName to resolve
setting_nameSetting name
Return values
rcReturn status code

Definition at line 149 of file nslookup.c.

150  {
151  struct nslookup *nslookup;
152  struct sockaddr sa;
153  char *setting_name_copy;
154  int rc;
155 
156  /* Allocate and initialise structure */
157  nslookup = zalloc ( sizeof ( *nslookup ) + strlen ( setting_name )
158  + 1 /* NUL */ );
159  if ( ! nslookup )
160  return -ENOMEM;
161  ref_init ( &nslookup->refcnt, NULL );
164  &nslookup->refcnt );
165  setting_name_copy = ( ( void * ) ( nslookup + 1 ) );
166  strcpy ( setting_name_copy, setting_name );
167  nslookup->setting_name = setting_name_copy;
168 
169  /* Start name resolution */
170  memset ( &sa, 0, sizeof ( sa ) );
171  if ( ( rc = resolv ( &nslookup->resolver, name, &sa ) ) != 0 )
172  goto err_resolv;
173 
174  /* Attach parent interface, mortalise self, and return */
175  intf_plug_plug ( &nslookup->job, job );
176  ref_put ( &nslookup->refcnt );
177  return 0;
178 
179  err_resolv:
180  ref_put ( &nslookup->refcnt );
181  return rc;
182 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
struct sockaddr sa
Definition: dns.c:68
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
static struct interface_descriptor nslookup_resolver_desc
Name resolution resolver interface descriptor.
Definition: nslookup.c:127
struct refcnt refcnt
Reference count for this object.
Definition: nslookup.c:41
struct interface job
Job control interface.
Definition: nslookup.c:44
void intf_plug_plug(struct interface *a, struct interface *b)
Plug two object interfaces together.
Definition: interface.c:102
char * setting_name
Setting name.
Definition: nslookup.c:49
#define ENOMEM
Not enough space.
Definition: errno.h:534
struct interface resolver
Data transfer interface.
Definition: nslookup.c:46
char * strcpy(char *dest, const char *src)
Copy string.
Definition: string.c:296
Generalized socket address structure.
Definition: socket.h:96
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
static struct interface_descriptor nslookup_job_desc
Name resolution job control interface descriptor.
Definition: nslookup.c:137
size_t strlen(const char *src)
Get length of string.
Definition: string.c:213
int nslookup(const char *name, const char *setting_name)
Perform (blocking) standalone name resolution.
Definition: nslookup.c:191
int resolv(struct interface *resolv, const char *name, struct sockaddr *sa)
Start name resolution.
Definition: resolv.c:257
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:173
int setting_name(struct settings *settings, const struct setting *setting, char *buf, size_t len)
Return full setting name.
Definition: settings.c:1610
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A name resolution request.
Definition: nslookup.c:39
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
void * memset(void *dest, int character, size_t len) __nonnull

References ENOMEM, intf_init(), intf_plug_plug(), nslookup::job, memset(), name, nslookup(), nslookup_job_desc, nslookup_resolver_desc, NULL, rc, ref_init, ref_put, nslookup::refcnt, resolv(), nslookup::resolver, sa, nslookup::setting_name, setting_name(), strcpy(), strlen(), and zalloc().

Referenced by nslookup().

◆ nslookup()

int nslookup ( const char *  name,
const char *  setting_name 
)

Perform (blocking) standalone name resolution.

Parameters
nameName to resolve
setting_nameSetting name
Return values
rcReturn status code

Definition at line 191 of file nslookup.c.

191  {
192  int rc;
193 
194  /* Perform name resolution */
195  if ( ( rc = resolv_setting ( &monojob, name, setting_name ) ) == 0 )
196  rc = monojob_wait ( NULL, 0 );
197  if ( rc != 0 ) {
198  printf ( "Could not resolve %s: %s\n", name, strerror ( rc ) );
199  return rc;
200  }
201 
202  return 0;
203 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
int monojob_wait(const char *string, unsigned long timeout)
Wait for single foreground job to complete.
Definition: monojob.c:81
static int resolv_setting(struct interface *job, const char *name, const char *setting_name)
Initiate standalone name resolution.
Definition: nslookup.c:149
struct interface monojob
Definition: monojob.c:56
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
int setting_name(struct settings *settings, const struct setting *setting, char *buf, size_t len)
Return full setting name.
Definition: settings.c:1610
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References monojob, monojob_wait(), name, NULL, printf(), rc, resolv_setting(), setting_name(), and strerror().

Referenced by resolv_setting().

Variable Documentation

◆ nslookup_resolver_operations

struct interface_operation nslookup_resolver_operations[]
static
Initial value:
= {
}
static void nslookup_close(struct nslookup *nslookup, int rc)
Terminate name resolution.
Definition: nslookup.c:58
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:244
void resolv_done(struct interface *intf, struct sockaddr *sa)
Name resolved.
Definition: resolv.c:55
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
static void nslookup_resolv_done(struct nslookup *nslookup, struct sockaddr *sa)
Handle resolved name.
Definition: nslookup.c:71
A name resolution request.
Definition: nslookup.c:39

Name resolution resolver interface operations.

Definition at line 121 of file nslookup.c.

◆ nslookup_resolver_desc

struct interface_descriptor nslookup_resolver_desc
static
Initial value:
=
static struct interface_operation nslookup_resolver_operations[]
Name resolution resolver interface operations.
Definition: nslookup.c:121
A name resolver.
Definition: resolv.h:18
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:82
A name resolution request.
Definition: nslookup.c:39

Name resolution resolver interface descriptor.

Definition at line 127 of file nslookup.c.

Referenced by resolv_setting().

◆ nslookup_job_operations

struct interface_operation nslookup_job_operations[]
static
Initial value:
= {
}
static void nslookup_close(struct nslookup *nslookup, int rc)
Terminate name resolution.
Definition: nslookup.c:58
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:244
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
A name resolution request.
Definition: nslookup.c:39

Name resolution job control interface operations.

Definition at line 132 of file nslookup.c.

◆ nslookup_job_desc

struct interface_descriptor nslookup_job_desc
static
Initial value:
=
static struct interface_operation nslookup_job_operations[]
Name resolution job control interface operations.
Definition: nslookup.c:132
A name resolver.
Definition: resolv.h:18
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:82
A name resolution request.
Definition: nslookup.c:39

Name resolution job control interface descriptor.

Definition at line 137 of file nslookup.c.

Referenced by resolv_setting().