iPXE
params.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  *
19  * You can also choose to distribute this program under the terms of
20  * the Unmodified Binary Distribution Licence (as given in the file
21  * COPYING.UBDL), provided that you have satisfied its requirements.
22  */
23 
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25 FILE_SECBOOT ( PERMITTED );
26 
27 /** @file
28  *
29  * Request parameters
30  *
31  */
32 
33 #include <stdlib.h>
34 #include <string.h>
35 #include <ipxe/params.h>
36 
37 /** List of all parameter lists */
38 static LIST_HEAD ( parameters );
39 
40 /**
41  * Free request parameter list
42  *
43  * @v refcnt Reference count
44  */
45 static void free_parameters ( struct refcnt *refcnt ) {
46  struct parameters *params =
47  container_of ( refcnt, struct parameters, refcnt );
48  struct parameter *param;
49  struct parameter *tmp;
50 
51  DBGC ( params, "PARAMS \"%s\" destroyed\n", params->name );
52 
53  /* Free all parameters */
55  list_del ( &param->list );
56  free ( param );
57  }
58 
59  /* Free parameter list */
60  free ( params );
61 }
62 
63 /**
64  * Find request parameter list by name
65  *
66  * @v name Parameter list name (may be NULL)
67  * @ret params Parameter list, or NULL if not found
68  */
69 struct parameters * find_parameters ( const char *name ) {
70  struct parameters *params;
71 
72  list_for_each_entry ( params, &parameters, list ) {
73  if ( ( params->name == name ) ||
74  ( strcmp ( params->name, name ) == 0 ) ) {
75  return params;
76  }
77  }
78  return NULL;
79 }
80 
81 /**
82  * Create request parameter list
83  *
84  * @v name Parameter list name (may be NULL)
85  * @ret params Parameter list, or NULL on failure
86  */
87 struct parameters * create_parameters ( const char *name ) {
88  struct parameters *params;
89  size_t name_len;
90  char *name_copy;
91 
92  /* Destroy any existing parameter list of this name */
93  params = find_parameters ( name );
94  if ( params ) {
95  claim_parameters ( params );
96  params_put ( params );
97  }
98 
99  /* Allocate parameter list */
100  name_len = ( name ? ( strlen ( name ) + 1 /* NUL */ ) : 0 );
101  params = zalloc ( sizeof ( *params ) + name_len );
102  if ( ! params )
103  return NULL;
104  ref_init ( &params->refcnt, free_parameters );
105  name_copy = ( ( void * ) ( params + 1 ) );
106 
107  /* Populate parameter list */
108  if ( name ) {
109  strcpy ( name_copy, name );
110  params->name = name_copy;
111  }
112  INIT_LIST_HEAD ( &params->entries );
113 
114  /* Add to list of parameter lists */
115  list_add_tail ( &params->list, &parameters );
116 
117  DBGC ( params, "PARAMS \"%s\" created\n", params->name );
118  return params;
119 }
120 
121 /**
122  * Add request parameter
123  *
124  * @v params Parameter list
125  * @v key Parameter key
126  * @v value Parameter value
127  * @v flags Parameter flags
128  * @ret param Parameter, or NULL on failure
129  */
130 struct parameter * add_parameter ( struct parameters *params,
131  const char *key, const char *value,
132  unsigned int flags ) {
133  struct parameter *param;
134  size_t key_len;
135  size_t value_len;
136  char *key_copy;
137  char *value_copy;
138 
139  /* Allocate parameter */
140  key_len = ( strlen ( key ) + 1 /* NUL */ );
141  value_len = ( strlen ( value ) + 1 /* NUL */ );
142  param = zalloc ( sizeof ( *param ) + key_len + value_len );
143  if ( ! param )
144  return NULL;
145  key_copy = ( ( void * ) ( param + 1 ) );
146  value_copy = ( key_copy + key_len );
147 
148  /* Populate parameter */
149  strcpy ( key_copy, key );
150  param->key = key_copy;
151  strcpy ( value_copy, value );
152  param->value = value_copy;
153  param->flags = flags;
154 
155  /* Add to list of parameters */
156  list_add_tail ( &param->list, &params->entries );
157 
158  DBGC ( params, "PARAMS \"%s\" added \"%s\"=\"%s\"%s%s\n",
159  params->name, param->key, param->value,
160  ( ( param->flags & PARAMETER_FORM ) ? " (form)" : "" ),
161  ( ( param->flags & PARAMETER_HEADER ) ? " (header)" : "" ) );
162  return param;
163 }
const char * name
Definition: ath9k_hw.c:1986
static void free_parameters(struct refcnt *refcnt)
Free request parameter list.
Definition: params.c:45
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:65
A request parameter list.
Definition: params.h:17
#define DBGC(...)
Definition: compiler.h:505
struct parameters * find_parameters(const char *name)
Find request parameter list by name.
Definition: params.c:69
A reference counter.
Definition: refcnt.h:27
unsigned long tmp
Definition: linux_pci.h:65
#define list_del(list)
Delete an entry from a list.
Definition: list.h:120
struct refcnt refcnt
Reference count.
Definition: params.h:19
Request parameters.
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:432
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:94
char * strcpy(char *dest, const char *src)
Copy string.
Definition: string.c:347
struct parameters * create_parameters(const char *name)
Create request parameter list.
Definition: params.c:87
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:459
uint8_t flags
Flags.
Definition: ena.h:18
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
struct hv_monitor_parameter param[4][32]
Parameters.
Definition: hyperv.h:24
FILE_SECBOOT(PERMITTED)
size_t strlen(const char *src)
Get length of string.
Definition: string.c:244
struct list_head entries
Parameters.
Definition: params.h:25
struct list_head list
List of request parameters.
Definition: params.h:31
const char * name
Name.
Definition: params.h:23
struct list_head list
List of all parameter lists.
Definition: params.h:21
#define PARAMETER_FORM
Request parameter is a form parameter.
Definition: params.h:41
static LIST_HEAD(parameters)
List of all parameter lists.
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:46
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:174
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
A request parameter.
Definition: params.h:29
struct parameter * add_parameter(struct parameters *params, const char *key, const char *value, unsigned int flags)
Add request parameter.
Definition: params.c:130
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#define PARAMETER_HEADER
Request parameter is a header parameter.
Definition: params.h:44
String functions.
union @391 key
Sense key.
Definition: scsi.h:18