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.

settings.c 51KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016
  1. /*
  2. * Copyright (C) 2008 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. FILE_LICENCE ( GPL2_OR_LATER );
  20. #include <stdint.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <strings.h>
  25. #include <byteswap.h>
  26. #include <errno.h>
  27. #include <assert.h>
  28. #include <ipxe/in.h>
  29. #include <ipxe/vsprintf.h>
  30. #include <ipxe/dhcp.h>
  31. #include <ipxe/uuid.h>
  32. #include <ipxe/uri.h>
  33. #include <ipxe/init.h>
  34. #include <ipxe/settings.h>
  35. /** @file
  36. *
  37. * Configuration settings
  38. *
  39. */
  40. /******************************************************************************
  41. *
  42. * Generic settings blocks
  43. *
  44. ******************************************************************************
  45. */
  46. /**
  47. * A generic setting
  48. *
  49. */
  50. struct generic_setting {
  51. /** List of generic settings */
  52. struct list_head list;
  53. /** Setting */
  54. struct setting setting;
  55. /** Size of setting name */
  56. size_t name_len;
  57. /** Size of setting data */
  58. size_t data_len;
  59. };
  60. /**
  61. * Get generic setting name
  62. *
  63. * @v generic Generic setting
  64. * @ret name Generic setting name
  65. */
  66. static inline void * generic_setting_name ( struct generic_setting *generic ) {
  67. return ( ( ( void * ) generic ) + sizeof ( *generic ) );
  68. }
  69. /**
  70. * Get generic setting data
  71. *
  72. * @v generic Generic setting
  73. * @ret data Generic setting data
  74. */
  75. static inline void * generic_setting_data ( struct generic_setting *generic ) {
  76. return ( ( ( void * ) generic ) + sizeof ( *generic ) +
  77. generic->name_len );
  78. }
  79. /**
  80. * Find generic setting
  81. *
  82. * @v generics Generic settings block
  83. * @v setting Setting to find
  84. * @ret generic Generic setting, or NULL
  85. */
  86. static struct generic_setting *
  87. find_generic_setting ( struct generic_settings *generics,
  88. struct setting *setting ) {
  89. struct generic_setting *generic;
  90. list_for_each_entry ( generic, &generics->list, list ) {
  91. if ( setting_cmp ( &generic->setting, setting ) == 0 )
  92. return generic;
  93. }
  94. return NULL;
  95. }
  96. /**
  97. * Store value of generic setting
  98. *
  99. * @v settings Settings block
  100. * @v setting Setting to store
  101. * @v data Setting data, or NULL to clear setting
  102. * @v len Length of setting data
  103. * @ret rc Return status code
  104. */
  105. int generic_settings_store ( struct settings *settings,
  106. struct setting *setting,
  107. const void *data, size_t len ) {
  108. struct generic_settings *generics =
  109. container_of ( settings, struct generic_settings, settings );
  110. struct generic_setting *old;
  111. struct generic_setting *new = NULL;
  112. size_t name_len;
  113. /* Identify existing generic setting, if any */
  114. old = find_generic_setting ( generics, setting );
  115. /* Create new generic setting, if required */
  116. if ( len ) {
  117. /* Allocate new generic setting */
  118. name_len = ( strlen ( setting->name ) + 1 );
  119. new = zalloc ( sizeof ( *new ) + name_len + len );
  120. if ( ! new )
  121. return -ENOMEM;
  122. /* Populate new generic setting */
  123. new->name_len = name_len;
  124. new->data_len = len;
  125. memcpy ( &new->setting, setting, sizeof ( new->setting ) );
  126. new->setting.name = generic_setting_name ( new );
  127. memcpy ( generic_setting_name ( new ),
  128. setting->name, name_len );
  129. memcpy ( generic_setting_data ( new ), data, len );
  130. }
  131. /* Delete existing generic setting, if any */
  132. if ( old ) {
  133. list_del ( &old->list );
  134. free ( old );
  135. }
  136. /* Add new setting to list, if any */
  137. if ( new )
  138. list_add ( &new->list, &generics->list );
  139. return 0;
  140. }
  141. /**
  142. * Fetch value of generic setting
  143. *
  144. * @v settings Settings block
  145. * @v setting Setting to fetch
  146. * @v data Buffer to fill with setting data
  147. * @v len Length of buffer
  148. * @ret len Length of setting data, or negative error
  149. */
  150. int generic_settings_fetch ( struct settings *settings,
  151. struct setting *setting,
  152. void *data, size_t len ) {
  153. struct generic_settings *generics =
  154. container_of ( settings, struct generic_settings, settings );
  155. struct generic_setting *generic;
  156. /* Find generic setting */
  157. generic = find_generic_setting ( generics, setting );
  158. if ( ! generic )
  159. return -ENOENT;
  160. /* Copy out generic setting data */
  161. if ( len > generic->data_len )
  162. len = generic->data_len;
  163. memcpy ( data, generic_setting_data ( generic ), len );
  164. return generic->data_len;
  165. }
  166. /**
  167. * Clear generic settings block
  168. *
  169. * @v settings Settings block
  170. */
  171. void generic_settings_clear ( struct settings *settings ) {
  172. struct generic_settings *generics =
  173. container_of ( settings, struct generic_settings, settings );
  174. struct generic_setting *generic;
  175. struct generic_setting *tmp;
  176. list_for_each_entry_safe ( generic, tmp, &generics->list, list ) {
  177. list_del ( &generic->list );
  178. free ( generic );
  179. }
  180. assert ( list_empty ( &generics->list ) );
  181. }
  182. /** Generic settings operations */
  183. struct settings_operations generic_settings_operations = {
  184. .store = generic_settings_store,
  185. .fetch = generic_settings_fetch,
  186. .clear = generic_settings_clear,
  187. };
  188. /******************************************************************************
  189. *
  190. * Registered settings blocks
  191. *
  192. ******************************************************************************
  193. */
  194. /** Root generic settings block */
  195. struct generic_settings generic_settings_root = {
  196. .settings = {
  197. .refcnt = NULL,
  198. .name = "",
  199. .siblings =
  200. LIST_HEAD_INIT ( generic_settings_root.settings.siblings ),
  201. .children =
  202. LIST_HEAD_INIT ( generic_settings_root.settings.children ),
  203. .op = &generic_settings_operations,
  204. },
  205. .list = LIST_HEAD_INIT ( generic_settings_root.list ),
  206. };
  207. /** Root settings block */
  208. #define settings_root generic_settings_root.settings
  209. /** Autovivified settings block */
  210. struct autovivified_settings {
  211. /** Reference count */
  212. struct refcnt refcnt;
  213. /** Generic settings block */
  214. struct generic_settings generic;
  215. };
  216. /**
  217. * Free autovivified settings block
  218. *
  219. * @v refcnt Reference count
  220. */
  221. static void autovivified_settings_free ( struct refcnt *refcnt ) {
  222. struct autovivified_settings *autovivified =
  223. container_of ( refcnt, struct autovivified_settings, refcnt );
  224. generic_settings_clear ( &autovivified->generic.settings );
  225. free ( autovivified );
  226. }
  227. /**
  228. * Find child named settings block
  229. *
  230. * @v parent Parent settings block
  231. * @v name Name within this parent
  232. * @ret settings Settings block, or NULL
  233. */
  234. static struct settings * find_child_settings ( struct settings *parent,
  235. const char *name ) {
  236. struct settings *settings;
  237. /* Treat empty name as meaning "this block" */
  238. if ( ! *name )
  239. return parent;
  240. /* Look for child with matching name */
  241. list_for_each_entry ( settings, &parent->children, siblings ) {
  242. if ( strcmp ( settings->name, name ) == 0 )
  243. return settings;
  244. }
  245. return NULL;
  246. }
  247. /**
  248. * Find or create child named settings block
  249. *
  250. * @v parent Parent settings block
  251. * @v name Name within this parent
  252. * @ret settings Settings block, or NULL
  253. */
  254. static struct settings * autovivify_child_settings ( struct settings *parent,
  255. const char *name ) {
  256. struct {
  257. struct autovivified_settings autovivified;
  258. char name[ strlen ( name ) + 1 /* NUL */ ];
  259. } *new_child;
  260. struct settings *settings;
  261. /* Return existing settings, if existent */
  262. if ( ( settings = find_child_settings ( parent, name ) ) != NULL )
  263. return settings;
  264. /* Create new generic settings block */
  265. new_child = zalloc ( sizeof ( *new_child ) );
  266. if ( ! new_child ) {
  267. DBGC ( parent, "Settings %p could not create child %s\n",
  268. parent, name );
  269. return NULL;
  270. }
  271. memcpy ( new_child->name, name, sizeof ( new_child->name ) );
  272. ref_init ( &new_child->autovivified.refcnt,
  273. autovivified_settings_free );
  274. generic_settings_init ( &new_child->autovivified.generic,
  275. &new_child->autovivified.refcnt );
  276. settings = &new_child->autovivified.generic.settings;
  277. register_settings ( settings, parent, new_child->name );
  278. return settings;
  279. }
  280. /**
  281. * Return settings block name
  282. *
  283. * @v settings Settings block
  284. * @ret name Settings block name
  285. */
  286. const char * settings_name ( struct settings *settings ) {
  287. static char buf[16];
  288. char tmp[ sizeof ( buf ) ];
  289. for ( buf[2] = buf[0] = 0 ; settings ; settings = settings->parent ) {
  290. memcpy ( tmp, buf, sizeof ( tmp ) );
  291. snprintf ( buf, sizeof ( buf ), ".%s%s", settings->name, tmp );
  292. }
  293. return ( buf + 2 );
  294. }
  295. /**
  296. * Parse settings block name
  297. *
  298. * @v name Name
  299. * @v get_child Function to find or create child settings block
  300. * @ret settings Settings block, or NULL
  301. */
  302. static struct settings *
  303. parse_settings_name ( const char *name,
  304. struct settings * ( * get_child ) ( struct settings *,
  305. const char * ) ) {
  306. struct settings *settings = &settings_root;
  307. char name_copy[ strlen ( name ) + 1 ];
  308. char *subname;
  309. char *remainder;
  310. /* Create modifiable copy of name */
  311. memcpy ( name_copy, name, sizeof ( name_copy ) );
  312. remainder = name_copy;
  313. /* Parse each name component in turn */
  314. while ( remainder ) {
  315. struct net_device *netdev;
  316. subname = remainder;
  317. remainder = strchr ( subname, '.' );
  318. if ( remainder )
  319. *(remainder++) = '\0';
  320. /* Special case "netX" root settings block */
  321. if ( ( subname == name_copy ) && ! strcmp ( subname, "netX" ) &&
  322. ( ( netdev = last_opened_netdev() ) != NULL ) )
  323. settings = get_child ( settings, netdev->name );
  324. else
  325. settings = get_child ( settings, subname );
  326. if ( ! settings )
  327. break;
  328. }
  329. return settings;
  330. }
  331. /**
  332. * Find named settings block
  333. *
  334. * @v name Name
  335. * @ret settings Settings block, or NULL
  336. */
  337. struct settings * find_settings ( const char *name ) {
  338. return parse_settings_name ( name, find_child_settings );
  339. }
  340. /**
  341. * Apply all settings
  342. *
  343. * @ret rc Return status code
  344. */
  345. static int apply_settings ( void ) {
  346. struct settings_applicator *applicator;
  347. int rc;
  348. /* Call all settings applicators */
  349. for_each_table_entry ( applicator, SETTINGS_APPLICATORS ) {
  350. if ( ( rc = applicator->apply() ) != 0 ) {
  351. DBG ( "Could not apply settings using applicator "
  352. "%p: %s\n", applicator, strerror ( rc ) );
  353. return rc;
  354. }
  355. }
  356. return 0;
  357. }
  358. /**
  359. * Reprioritise settings
  360. *
  361. * @v settings Settings block
  362. *
  363. * Reorders the settings block amongst its siblings according to its
  364. * priority.
  365. */
  366. static void reprioritise_settings ( struct settings *settings ) {
  367. struct settings *parent = settings->parent;
  368. long priority;
  369. struct settings *tmp;
  370. long tmp_priority;
  371. /* Stop when we reach the top of the tree */
  372. if ( ! parent )
  373. return;
  374. /* Read priority, if present */
  375. priority = fetch_intz_setting ( settings, &priority_setting );
  376. /* Remove from siblings list */
  377. list_del ( &settings->siblings );
  378. /* Reinsert after any existing blocks which have a higher priority */
  379. list_for_each_entry ( tmp, &parent->children, siblings ) {
  380. tmp_priority = fetch_intz_setting ( tmp, &priority_setting );
  381. if ( priority > tmp_priority )
  382. break;
  383. }
  384. list_add_tail ( &settings->siblings, &tmp->siblings );
  385. /* Recurse up the tree */
  386. reprioritise_settings ( parent );
  387. }
  388. /**
  389. * Register settings block
  390. *
  391. * @v settings Settings block
  392. * @v parent Parent settings block, or NULL
  393. * @v name Settings block name
  394. * @ret rc Return status code
  395. */
  396. int register_settings ( struct settings *settings, struct settings *parent,
  397. const char *name ) {
  398. struct settings *old_settings;
  399. /* NULL parent => add to settings root */
  400. assert ( settings != NULL );
  401. if ( parent == NULL )
  402. parent = &settings_root;
  403. /* Apply settings block name */
  404. settings->name = name;
  405. /* Remove any existing settings with the same name */
  406. if ( ( old_settings = find_child_settings ( parent, settings->name ) ))
  407. unregister_settings ( old_settings );
  408. /* Add to list of settings */
  409. ref_get ( settings->refcnt );
  410. ref_get ( parent->refcnt );
  411. settings->parent = parent;
  412. list_add_tail ( &settings->siblings, &parent->children );
  413. DBGC ( settings, "Settings %p (\"%s\") registered\n",
  414. settings, settings_name ( settings ) );
  415. /* Fix up settings priority */
  416. reprioritise_settings ( settings );
  417. /* Apply potentially-updated settings */
  418. apply_settings();
  419. return 0;
  420. }
  421. /**
  422. * Unregister settings block
  423. *
  424. * @v settings Settings block
  425. */
  426. void unregister_settings ( struct settings *settings ) {
  427. struct settings *child;
  428. struct settings *tmp;
  429. /* Unregister child settings */
  430. list_for_each_entry_safe ( child, tmp, &settings->children, siblings ) {
  431. unregister_settings ( child );
  432. }
  433. DBGC ( settings, "Settings %p (\"%s\") unregistered\n",
  434. settings, settings_name ( settings ) );
  435. /* Remove from list of settings */
  436. ref_put ( settings->parent->refcnt );
  437. settings->parent = NULL;
  438. list_del ( &settings->siblings );
  439. ref_put ( settings->refcnt );
  440. /* Apply potentially-updated settings */
  441. apply_settings();
  442. }
  443. /******************************************************************************
  444. *
  445. * Core settings routines
  446. *
  447. ******************************************************************************
  448. */
  449. /**
  450. * Check applicability of setting
  451. *
  452. * @v settings Settings block
  453. * @v setting Setting
  454. * @ret applies Setting applies within this settings block
  455. */
  456. int setting_applies ( struct settings *settings, struct setting *setting ) {
  457. return ( settings->op->applies ?
  458. settings->op->applies ( settings, setting ) : 1 );
  459. }
  460. /**
  461. * Store value of setting
  462. *
  463. * @v settings Settings block, or NULL
  464. * @v setting Setting to store
  465. * @v data Setting data, or NULL to clear setting
  466. * @v len Length of setting data
  467. * @ret rc Return status code
  468. */
  469. int store_setting ( struct settings *settings, struct setting *setting,
  470. const void *data, size_t len ) {
  471. int rc;
  472. /* NULL settings implies storing into the global settings root */
  473. if ( ! settings )
  474. settings = &settings_root;
  475. /* Fail if tag does not apply to this settings block */
  476. if ( ! setting_applies ( settings, setting ) )
  477. return -ENOTTY;
  478. /* Sanity check */
  479. if ( ! settings->op->store )
  480. return -ENOTSUP;
  481. /* Store setting */
  482. if ( ( rc = settings->op->store ( settings, setting,
  483. data, len ) ) != 0 )
  484. return rc;
  485. /* Reprioritise settings if necessary */
  486. if ( setting_cmp ( setting, &priority_setting ) == 0 )
  487. reprioritise_settings ( settings );
  488. /* If these settings are registered, apply potentially-updated
  489. * settings
  490. */
  491. for ( ; settings ; settings = settings->parent ) {
  492. if ( settings == &settings_root ) {
  493. if ( ( rc = apply_settings() ) != 0 )
  494. return rc;
  495. break;
  496. }
  497. }
  498. return 0;
  499. }
  500. /**
  501. * Fetch value and origin of setting
  502. *
  503. * @v settings Settings block, or NULL to search all blocks
  504. * @v setting Setting to fetch
  505. * @v origin Origin of setting to fill in
  506. * @v data Buffer to fill with setting data
  507. * @v len Length of buffer
  508. * @ret len Length of setting data, or negative error
  509. *
  510. * The actual length of the setting will be returned even if
  511. * the buffer was too small.
  512. */
  513. static int fetch_setting_and_origin ( struct settings *settings,
  514. struct setting *setting,
  515. struct settings **origin,
  516. void *data, size_t len ) {
  517. struct settings *child;
  518. int ret;
  519. /* Avoid returning uninitialised data on error */
  520. memset ( data, 0, len );
  521. if ( origin )
  522. *origin = NULL;
  523. /* NULL settings implies starting at the global settings root */
  524. if ( ! settings )
  525. settings = &settings_root;
  526. /* Sanity check */
  527. if ( ! settings->op->fetch )
  528. return -ENOTSUP;
  529. /* Try this block first, if applicable */
  530. if ( setting_applies ( settings, setting ) &&
  531. ( ( ret = settings->op->fetch ( settings, setting,
  532. data, len ) ) >= 0 ) ) {
  533. if ( origin )
  534. *origin = settings;
  535. return ret;
  536. }
  537. /* Recurse into each child block in turn */
  538. list_for_each_entry ( child, &settings->children, siblings ) {
  539. if ( ( ret = fetch_setting_and_origin ( child, setting, origin,
  540. data, len ) ) >= 0 )
  541. return ret;
  542. }
  543. return -ENOENT;
  544. }
  545. /**
  546. * Fetch value of setting
  547. *
  548. * @v settings Settings block, or NULL to search all blocks
  549. * @v setting Setting to fetch
  550. * @v data Buffer to fill with setting data
  551. * @v len Length of buffer
  552. * @ret len Length of setting data, or negative error
  553. *
  554. * The actual length of the setting will be returned even if
  555. * the buffer was too small.
  556. */
  557. int fetch_setting ( struct settings *settings, struct setting *setting,
  558. void *data, size_t len ) {
  559. return fetch_setting_and_origin ( settings, setting, NULL, data, len );
  560. }
  561. /**
  562. * Fetch origin of setting
  563. *
  564. * @v settings Settings block, or NULL to search all blocks
  565. * @v setting Setting to fetch
  566. * @ret origin Origin of setting, or NULL if not found
  567. *
  568. * This function can also be used as an existence check for the
  569. * setting.
  570. */
  571. struct settings * fetch_setting_origin ( struct settings *settings,
  572. struct setting *setting ) {
  573. struct settings *origin;
  574. fetch_setting_and_origin ( settings, setting, &origin, NULL, 0 );
  575. return origin;
  576. }
  577. /**
  578. * Fetch length of setting
  579. *
  580. * @v settings Settings block, or NULL to search all blocks
  581. * @v setting Setting to fetch
  582. * @ret len Length of setting data, or negative error
  583. *
  584. * This function can also be used as an existence check for the
  585. * setting.
  586. */
  587. int fetch_setting_len ( struct settings *settings, struct setting *setting ) {
  588. return fetch_setting ( settings, setting, NULL, 0 );
  589. }
  590. /**
  591. * Fetch copy of setting
  592. *
  593. * @v settings Settings block, or NULL to search all blocks
  594. * @v setting Setting to fetch
  595. * @v data Buffer to allocate and fill with setting data
  596. * @ret len Length of setting, or negative error
  597. *
  598. * The caller is responsible for eventually freeing the allocated
  599. * buffer.
  600. *
  601. * To allow the caller to distinguish between a non-existent setting
  602. * and an error in allocating memory for the copy, this function will
  603. * return success (and a NULL buffer pointer) for a non-existent
  604. * setting.
  605. */
  606. int fetch_setting_copy ( struct settings *settings, struct setting *setting,
  607. void **data ) {
  608. int len;
  609. int check_len = 0;
  610. /* Avoid returning uninitialised data on error */
  611. *data = NULL;
  612. /* Fetch setting length, and return success if non-existent */
  613. len = fetch_setting_len ( settings, setting );
  614. if ( len < 0 )
  615. return 0;
  616. /* Allocate buffer */
  617. *data = malloc ( len );
  618. if ( ! *data )
  619. return -ENOMEM;
  620. /* Fetch setting */
  621. check_len = fetch_setting ( settings, setting, *data, len );
  622. assert ( check_len == len );
  623. return len;
  624. }
  625. /**
  626. * Fetch value of string setting
  627. *
  628. * @v settings Settings block, or NULL to search all blocks
  629. * @v setting Setting to fetch
  630. * @v data Buffer to fill with setting string data
  631. * @v len Length of buffer
  632. * @ret len Length of string setting, or negative error
  633. *
  634. * The resulting string is guaranteed to be correctly NUL-terminated.
  635. * The returned length will be the length of the underlying setting
  636. * data.
  637. */
  638. int fetch_string_setting ( struct settings *settings, struct setting *setting,
  639. char *data, size_t len ) {
  640. memset ( data, 0, len );
  641. return fetch_setting ( settings, setting, data,
  642. ( ( len > 0 ) ? ( len - 1 ) : 0 ) );
  643. }
  644. /**
  645. * Fetch value of string setting
  646. *
  647. * @v settings Settings block, or NULL to search all blocks
  648. * @v setting Setting to fetch
  649. * @v data Buffer to allocate and fill with setting string data
  650. * @ret len Length of string setting, or negative error
  651. *
  652. * The resulting string is guaranteed to be correctly NUL-terminated.
  653. * The returned length will be the length of the underlying setting
  654. * data. The caller is responsible for eventually freeing the
  655. * allocated buffer.
  656. *
  657. * To allow the caller to distinguish between a non-existent setting
  658. * and an error in allocating memory for the copy, this function will
  659. * return success (and a NULL buffer pointer) for a non-existent
  660. * setting.
  661. */
  662. int fetch_string_setting_copy ( struct settings *settings,
  663. struct setting *setting,
  664. char **data ) {
  665. int len;
  666. int check_len = 0;
  667. /* Avoid returning uninitialised data on error */
  668. *data = NULL;
  669. /* Fetch setting length, and return success if non-existent */
  670. len = fetch_setting_len ( settings, setting );
  671. if ( len < 0 )
  672. return 0;
  673. /* Allocate string buffer */
  674. *data = malloc ( len + 1 );
  675. if ( ! *data )
  676. return -ENOMEM;
  677. /* Fetch setting */
  678. check_len = fetch_string_setting ( settings, setting, *data,
  679. ( len + 1 ) );
  680. assert ( check_len == len );
  681. return len;
  682. }
  683. /**
  684. * Fetch value of IPv4 address setting
  685. *
  686. * @v settings Settings block, or NULL to search all blocks
  687. * @v setting Setting to fetch
  688. * @v inp IPv4 addresses to fill in
  689. * @v count Maximum number of IPv4 addresses
  690. * @ret len Length of setting, or negative error
  691. */
  692. int fetch_ipv4_array_setting ( struct settings *settings,
  693. struct setting *setting,
  694. struct in_addr *inp, unsigned int count ) {
  695. int len;
  696. len = fetch_setting ( settings, setting, inp,
  697. ( sizeof ( *inp ) * count ) );
  698. if ( len < 0 )
  699. return len;
  700. if ( ( len % sizeof ( *inp ) ) != 0 )
  701. return -ERANGE;
  702. return len;
  703. }
  704. /**
  705. * Fetch value of IPv4 address setting
  706. *
  707. * @v settings Settings block, or NULL to search all blocks
  708. * @v setting Setting to fetch
  709. * @v inp IPv4 address to fill in
  710. * @ret len Length of setting, or negative error
  711. */
  712. int fetch_ipv4_setting ( struct settings *settings, struct setting *setting,
  713. struct in_addr *inp ) {
  714. return fetch_ipv4_array_setting ( settings, setting, inp, 1 );
  715. }
  716. /**
  717. * Extract numeric value of setting
  718. *
  719. * @v raw Raw setting data
  720. * @v len Length of raw setting data
  721. * @ret signed_value Value, when interpreted as a signed integer
  722. * @ret unsigned_value Value, when interpreted as an unsigned integer
  723. * @ret len Length of setting, or negative error
  724. */
  725. static int numeric_setting_value ( const void *raw, size_t len,
  726. signed long *signed_value,
  727. unsigned long *unsigned_value ) {
  728. const uint8_t *unsigned_bytes = raw;
  729. const int8_t *signed_bytes = raw;
  730. int is_negative;
  731. unsigned int i;
  732. uint8_t byte;
  733. /* Range check */
  734. if ( len > sizeof ( long ) )
  735. return -ERANGE;
  736. /* Convert to host-ordered longs */
  737. is_negative = ( len && ( signed_bytes[0] < 0 ) );
  738. *signed_value = ( is_negative ? -1L : 0 );
  739. *unsigned_value = 0;
  740. for ( i = 0 ; i < len ; i++ ) {
  741. byte = unsigned_bytes[i];
  742. *signed_value = ( ( *signed_value << 8 ) | byte );
  743. *unsigned_value = ( ( *unsigned_value << 8 ) | byte );
  744. }
  745. return len;
  746. }
  747. /**
  748. * Fetch value of signed integer setting
  749. *
  750. * @v settings Settings block, or NULL to search all blocks
  751. * @v setting Setting to fetch
  752. * @v value Integer value to fill in
  753. * @ret len Length of setting, or negative error
  754. */
  755. int fetch_int_setting ( struct settings *settings, struct setting *setting,
  756. long *value ) {
  757. unsigned long dummy;
  758. long tmp;
  759. int len;
  760. /* Avoid returning uninitialised data on error */
  761. *value = 0;
  762. /* Fetch raw (network-ordered, variable-length) setting */
  763. len = fetch_setting ( settings, setting, &tmp, sizeof ( tmp ) );
  764. if ( len < 0 )
  765. return len;
  766. /* Extract numeric value */
  767. return numeric_setting_value ( &tmp, len, value, &dummy );
  768. }
  769. /**
  770. * Fetch value of unsigned integer setting
  771. *
  772. * @v settings Settings block, or NULL to search all blocks
  773. * @v setting Setting to fetch
  774. * @v value Integer value to fill in
  775. * @ret len Length of setting, or negative error
  776. */
  777. int fetch_uint_setting ( struct settings *settings, struct setting *setting,
  778. unsigned long *value ) {
  779. signed long dummy;
  780. long tmp;
  781. int len;
  782. /* Avoid returning uninitialised data on error */
  783. *value = 0;
  784. /* Fetch raw (network-ordered, variable-length) setting */
  785. len = fetch_setting ( settings, setting, &tmp, sizeof ( tmp ) );
  786. if ( len < 0 )
  787. return len;
  788. /* Extract numeric value */
  789. return numeric_setting_value ( &tmp, len, &dummy, value );
  790. }
  791. /**
  792. * Fetch value of signed integer setting, or zero
  793. *
  794. * @v settings Settings block, or NULL to search all blocks
  795. * @v setting Setting to fetch
  796. * @ret value Setting value, or zero
  797. */
  798. long fetch_intz_setting ( struct settings *settings, struct setting *setting ){
  799. long value;
  800. fetch_int_setting ( settings, setting, &value );
  801. return value;
  802. }
  803. /**
  804. * Fetch value of unsigned integer setting, or zero
  805. *
  806. * @v settings Settings block, or NULL to search all blocks
  807. * @v setting Setting to fetch
  808. * @ret value Setting value, or zero
  809. */
  810. unsigned long fetch_uintz_setting ( struct settings *settings,
  811. struct setting *setting ) {
  812. unsigned long value;
  813. fetch_uint_setting ( settings, setting, &value );
  814. return value;
  815. }
  816. /**
  817. * Fetch value of UUID setting
  818. *
  819. * @v settings Settings block, or NULL to search all blocks
  820. * @v setting Setting to fetch
  821. * @v uuid UUID to fill in
  822. * @ret len Length of setting, or negative error
  823. */
  824. int fetch_uuid_setting ( struct settings *settings, struct setting *setting,
  825. union uuid *uuid ) {
  826. int len;
  827. len = fetch_setting ( settings, setting, uuid, sizeof ( *uuid ) );
  828. if ( len < 0 )
  829. return len;
  830. if ( len != sizeof ( *uuid ) )
  831. return -ERANGE;
  832. return len;
  833. }
  834. /**
  835. * Clear settings block
  836. *
  837. * @v settings Settings block
  838. */
  839. void clear_settings ( struct settings *settings ) {
  840. if ( settings->op->clear )
  841. settings->op->clear ( settings );
  842. }
  843. /**
  844. * Compare two settings
  845. *
  846. * @v a Setting to compare
  847. * @v b Setting to compare
  848. * @ret 0 Settings are the same
  849. * @ret non-zero Settings are not the same
  850. */
  851. int setting_cmp ( struct setting *a, struct setting *b ) {
  852. /* If the settings have tags, compare them */
  853. if ( a->tag && ( a->tag == b->tag ) )
  854. return 0;
  855. /* Otherwise, if the settings have names, compare them */
  856. if ( a->name && b->name && a->name[0] )
  857. return strcmp ( a->name, b->name );
  858. /* Otherwise, return a non-match */
  859. return ( ! 0 );
  860. }
  861. /******************************************************************************
  862. *
  863. * Formatted setting routines
  864. *
  865. ******************************************************************************
  866. */
  867. /**
  868. * Fetch and format value of setting
  869. *
  870. * @v settings Settings block, or NULL to search all blocks
  871. * @v setting Setting to fetch
  872. * @v type Settings type
  873. * @v buf Buffer to contain formatted value
  874. * @v len Length of buffer
  875. * @ret len Length of formatted value, or negative error
  876. */
  877. int fetchf_setting ( struct settings *settings, struct setting *setting,
  878. char *buf, size_t len ) {
  879. int raw_len;
  880. int check_len;
  881. int rc;
  882. /* Fetch raw value */
  883. raw_len = fetch_setting_len ( settings, setting );
  884. if ( raw_len < 0 ) {
  885. rc = raw_len;
  886. return rc;
  887. } else {
  888. uint8_t raw[raw_len];
  889. /* Fetch raw value */
  890. check_len = fetch_setting ( settings, setting, raw,
  891. sizeof ( raw ) );
  892. if ( check_len < 0 )
  893. return check_len;
  894. assert ( check_len == raw_len );
  895. /* Format value */
  896. return setting->type->format ( raw, sizeof ( raw ), buf, len );
  897. }
  898. }
  899. /**
  900. * Store formatted value of setting
  901. *
  902. * @v settings Settings block
  903. * @v setting Setting to store
  904. * @v value Formatted setting data, or NULL
  905. * @ret rc Return status code
  906. */
  907. int storef_setting ( struct settings *settings, struct setting *setting,
  908. const char *value ) {
  909. int raw_len;
  910. int check_len;
  911. int rc;
  912. /* NULL value implies deletion */
  913. if ( ! value )
  914. return delete_setting ( settings, setting );
  915. /* Parse formatted value */
  916. raw_len = setting->type->parse ( value, NULL, 0 );
  917. if ( raw_len < 0 ) {
  918. rc = raw_len;
  919. return rc;
  920. } else {
  921. uint8_t raw[raw_len];
  922. /* Parse formatted value */
  923. check_len = setting->type->parse ( value, raw, sizeof ( raw ) );
  924. assert ( check_len == raw_len );
  925. /* Store raw value */
  926. return store_setting ( settings, setting, raw, sizeof ( raw ) );
  927. }
  928. }
  929. /******************************************************************************
  930. *
  931. * Named settings
  932. *
  933. ******************************************************************************
  934. */
  935. /**
  936. * Find named setting
  937. *
  938. * @v name Name
  939. * @ret setting Named setting, or NULL
  940. */
  941. struct setting * find_setting ( const char *name ) {
  942. struct setting *setting;
  943. for_each_table_entry ( setting, SETTINGS ) {
  944. if ( strcmp ( name, setting->name ) == 0 )
  945. return setting;
  946. }
  947. return NULL;
  948. }
  949. /**
  950. * Parse setting name as tag number
  951. *
  952. * @v settings Settings block
  953. * @v name Name
  954. * @ret tag Tag number, or 0 if not a valid number
  955. */
  956. static unsigned int parse_setting_tag ( struct settings *settings,
  957. const char *name ) {
  958. char *tmp = ( ( char * ) name );
  959. unsigned int tag = 0;
  960. while ( 1 ) {
  961. tag = ( ( tag << 8 ) | strtoul ( tmp, &tmp, 0 ) );
  962. if ( *tmp == 0 )
  963. return ( tag | settings->tag_magic );
  964. if ( *tmp != '.' )
  965. return 0;
  966. tmp++;
  967. }
  968. }
  969. /**
  970. * Find setting type
  971. *
  972. * @v name Name
  973. * @ret type Setting type, or NULL
  974. */
  975. static struct setting_type * find_setting_type ( const char *name ) {
  976. struct setting_type *type;
  977. for_each_table_entry ( type, SETTING_TYPES ) {
  978. if ( strcmp ( name, type->name ) == 0 )
  979. return type;
  980. }
  981. return NULL;
  982. }
  983. /**
  984. * Parse setting name
  985. *
  986. * @v name Name of setting
  987. * @v get_child Function to find or create child settings block
  988. * @v settings Settings block to fill in
  989. * @v setting Setting to fill in
  990. * @v tmp_name Buffer for copy of setting name
  991. * @ret rc Return status code
  992. *
  993. * Interprets a name of the form
  994. * "[settings_name/]tag_name[:type_name]" and fills in the appropriate
  995. * fields.
  996. *
  997. * The @c tmp_name buffer must be large enough to hold a copy of the
  998. * setting name.
  999. */
  1000. static int
  1001. parse_setting_name ( const char *name,
  1002. struct settings * ( * get_child ) ( struct settings *,
  1003. const char * ),
  1004. struct settings **settings, struct setting *setting,
  1005. char *tmp_name ) {
  1006. char *settings_name;
  1007. char *setting_name;
  1008. char *type_name;
  1009. struct setting *named_setting;
  1010. /* Set defaults */
  1011. *settings = &settings_root;
  1012. memset ( setting, 0, sizeof ( *setting ) );
  1013. setting->name = "";
  1014. setting->type = &setting_type_string;
  1015. /* Split name into "[settings_name/]setting_name[:type_name]" */
  1016. strcpy ( tmp_name, name );
  1017. if ( ( setting_name = strchr ( tmp_name, '/' ) ) != NULL ) {
  1018. *(setting_name++) = 0;
  1019. settings_name = tmp_name;
  1020. } else {
  1021. setting_name = tmp_name;
  1022. settings_name = NULL;
  1023. }
  1024. if ( ( type_name = strchr ( setting_name, ':' ) ) != NULL )
  1025. *(type_name++) = 0;
  1026. /* Identify settings block, if specified */
  1027. if ( settings_name ) {
  1028. *settings = parse_settings_name ( settings_name, get_child );
  1029. if ( *settings == NULL ) {
  1030. DBG ( "Unrecognised settings block \"%s\" in \"%s\"\n",
  1031. settings_name, name );
  1032. return -ENODEV;
  1033. }
  1034. }
  1035. /* Identify setting */
  1036. setting->tag = parse_setting_tag ( *settings, setting_name );
  1037. setting->name = setting_name;
  1038. for_each_table_entry ( named_setting, SETTINGS ) {
  1039. /* Matches a defined named setting; use that setting */
  1040. if ( setting_cmp ( named_setting, setting ) == 0 ) {
  1041. memcpy ( setting, named_setting, sizeof ( *setting ) );
  1042. break;
  1043. }
  1044. }
  1045. /* Identify setting type, if specified */
  1046. if ( type_name ) {
  1047. setting->type = find_setting_type ( type_name );
  1048. if ( setting->type == NULL ) {
  1049. DBG ( "Invalid setting type \"%s\" in \"%s\"\n",
  1050. type_name, name );
  1051. return -ENOTSUP;
  1052. }
  1053. }
  1054. return 0;
  1055. }
  1056. /**
  1057. * Return full setting name
  1058. *
  1059. * @v settings Settings block, or NULL
  1060. * @v setting Setting
  1061. * @v buf Buffer
  1062. * @v len Length of buffer
  1063. * @ret len Length of setting name, or negative error
  1064. */
  1065. int setting_name ( struct settings *settings, struct setting *setting,
  1066. char *buf, size_t len ) {
  1067. const char *name;
  1068. if ( ! settings )
  1069. settings = &settings_root;
  1070. name = settings_name ( settings );
  1071. return snprintf ( buf, len, "%s%s%s:%s", name, ( name[0] ? "/" : "" ),
  1072. setting->name, setting->type->name );
  1073. }
  1074. /**
  1075. * Parse and store value of named setting
  1076. *
  1077. * @v name Name of setting
  1078. * @v value Formatted setting data, or NULL
  1079. * @ret rc Return status code
  1080. */
  1081. int storef_named_setting ( const char *name, const char *value ) {
  1082. struct settings *settings;
  1083. struct setting setting;
  1084. char tmp_name[ strlen ( name ) + 1 ];
  1085. int rc;
  1086. /* Parse setting name */
  1087. if ( ( rc = parse_setting_name ( name, autovivify_child_settings,
  1088. &settings, &setting, tmp_name )) != 0)
  1089. return rc;
  1090. /* Store setting */
  1091. if ( ( rc = storef_setting ( settings, &setting, value ) ) != 0 )
  1092. return rc;
  1093. return 0;
  1094. }
  1095. /**
  1096. * Fetch and format value of named setting
  1097. *
  1098. * @v name Name of setting
  1099. * @v name_buf Buffer to contain canonicalised name
  1100. * @v name_len Length of canonicalised name buffer
  1101. * @v value_buf Buffer to contain formatted value
  1102. * @v value_len Length of formatted value buffer
  1103. * @ret len Length of formatted value, or negative error
  1104. */
  1105. int fetchf_named_setting ( const char *name,
  1106. char *name_buf, size_t name_len,
  1107. char *value_buf, size_t value_len ) {
  1108. struct settings *settings;
  1109. struct setting setting;
  1110. struct settings *origin;
  1111. char tmp_name[ strlen ( name ) + 1 ];
  1112. int len;
  1113. int rc;
  1114. /* Parse setting name */
  1115. if ( ( rc = parse_setting_name ( name, find_child_settings,
  1116. &settings, &setting, tmp_name )) != 0)
  1117. return rc;
  1118. /* Fetch setting */
  1119. if ( ( len = fetchf_setting ( settings, &setting, value_buf,
  1120. value_len ) ) < 0 )
  1121. return len;
  1122. /* Construct setting name */
  1123. origin = fetch_setting_origin ( settings, &setting );
  1124. assert ( origin != NULL );
  1125. setting_name ( origin, &setting, name_buf, name_len );
  1126. return len;
  1127. }
  1128. /******************************************************************************
  1129. *
  1130. * Setting types
  1131. *
  1132. ******************************************************************************
  1133. */
  1134. /**
  1135. * Parse string setting value
  1136. *
  1137. * @v value Formatted setting value
  1138. * @v buf Buffer to contain raw value
  1139. * @v len Length of buffer
  1140. * @ret len Length of raw value, or negative error
  1141. */
  1142. static int parse_string_setting ( const char *value, void *buf, size_t len ) {
  1143. size_t raw_len = strlen ( value ); /* Exclude terminating NUL */
  1144. /* Copy string to buffer */
  1145. if ( len > raw_len )
  1146. len = raw_len;
  1147. memcpy ( buf, value, len );
  1148. return raw_len;
  1149. }
  1150. /**
  1151. * Format string setting value
  1152. *
  1153. * @v raw Raw setting value
  1154. * @v raw_len Length of raw setting value
  1155. * @v buf Buffer to contain formatted value
  1156. * @v len Length of buffer
  1157. * @ret len Length of formatted value, or negative error
  1158. */
  1159. static int format_string_setting ( const void *raw, size_t raw_len, char *buf,
  1160. size_t len ) {
  1161. /* Copy string to buffer, and terminate */
  1162. memset ( buf, 0, len );
  1163. if ( len > raw_len )
  1164. len = raw_len;
  1165. memcpy ( buf, raw, len );
  1166. return raw_len;
  1167. }
  1168. /** A string setting type */
  1169. struct setting_type setting_type_string __setting_type = {
  1170. .name = "string",
  1171. .parse = parse_string_setting,
  1172. .format = format_string_setting,
  1173. };
  1174. /**
  1175. * Parse URI-encoded string setting value
  1176. *
  1177. * @v value Formatted setting value
  1178. * @v buf Buffer to contain raw value
  1179. * @v len Length of buffer
  1180. * @ret len Length of raw value, or negative error
  1181. */
  1182. static int parse_uristring_setting ( const char *value, void *buf,
  1183. size_t len ) {
  1184. char tmp[ len + 1 /* NUL */ ];
  1185. size_t raw_len;
  1186. /* Decode to temporary buffer (including NUL) */
  1187. raw_len = uri_decode ( value, tmp, sizeof ( tmp ) );
  1188. /* Copy to output buffer (excluding NUL) */
  1189. if ( len > raw_len )
  1190. len = raw_len;
  1191. memcpy ( buf, tmp, len );
  1192. return raw_len;
  1193. }
  1194. /**
  1195. * Format URI-encoded string setting value
  1196. *
  1197. * @v raw Raw setting value
  1198. * @v raw_len Length of raw setting value
  1199. * @v buf Buffer to contain formatted value
  1200. * @v len Length of buffer
  1201. * @ret len Length of formatted value, or negative error
  1202. */
  1203. static int format_uristring_setting ( const void *raw, size_t raw_len,
  1204. char *buf, size_t len ) {
  1205. char tmp[ raw_len + 1 /* NUL */ ];
  1206. /* Copy to temporary buffer and terminate */
  1207. memcpy ( tmp, raw, raw_len );
  1208. tmp[raw_len] = '\0';
  1209. /* Encode directly into output buffer */
  1210. return uri_encode ( tmp, buf, len, URI_FRAGMENT );
  1211. }
  1212. /** A URI-encoded string setting type */
  1213. struct setting_type setting_type_uristring __setting_type = {
  1214. .name = "uristring",
  1215. .parse = parse_uristring_setting,
  1216. .format = format_uristring_setting,
  1217. };
  1218. /**
  1219. * Parse IPv4 address setting value
  1220. *
  1221. * @v value Formatted setting value
  1222. * @v buf Buffer to contain raw value
  1223. * @v len Length of buffer
  1224. * @ret len Length of raw value, or negative error
  1225. */
  1226. static int parse_ipv4_setting ( const char *value, void *buf, size_t len ) {
  1227. struct in_addr ipv4;
  1228. /* Parse IPv4 address */
  1229. if ( inet_aton ( value, &ipv4 ) == 0 )
  1230. return -EINVAL;
  1231. /* Copy to buffer */
  1232. if ( len > sizeof ( ipv4 ) )
  1233. len = sizeof ( ipv4 );
  1234. memcpy ( buf, &ipv4, len );
  1235. return ( sizeof ( ipv4 ) );
  1236. }
  1237. /**
  1238. * Format IPv4 address setting value
  1239. *
  1240. * @v raw Raw setting value
  1241. * @v raw_len Length of raw setting value
  1242. * @v buf Buffer to contain formatted value
  1243. * @v len Length of buffer
  1244. * @ret len Length of formatted value, or negative error
  1245. */
  1246. static int format_ipv4_setting ( const void *raw, size_t raw_len, char *buf,
  1247. size_t len ) {
  1248. const struct in_addr *ipv4 = raw;
  1249. if ( raw_len < sizeof ( *ipv4 ) )
  1250. return -EINVAL;
  1251. return snprintf ( buf, len, "%s", inet_ntoa ( *ipv4 ) );
  1252. }
  1253. /** An IPv4 address setting type */
  1254. struct setting_type setting_type_ipv4 __setting_type = {
  1255. .name = "ipv4",
  1256. .parse = parse_ipv4_setting,
  1257. .format = format_ipv4_setting,
  1258. };
  1259. /**
  1260. * Parse integer setting value
  1261. *
  1262. * @v value Formatted setting value
  1263. * @v buf Buffer to contain raw value
  1264. * @v len Length of buffer
  1265. * @v size Integer size, in bytes
  1266. * @ret len Length of raw value, or negative error
  1267. */
  1268. static int parse_int_setting ( const char *value, void *buf, size_t len,
  1269. unsigned int size ) {
  1270. union {
  1271. uint32_t num;
  1272. uint8_t bytes[4];
  1273. } u;
  1274. char *endp;
  1275. /* Parse value */
  1276. u.num = htonl ( strtoul ( value, &endp, 0 ) );
  1277. if ( *endp )
  1278. return -EINVAL;
  1279. /* Copy to buffer */
  1280. if ( len > size )
  1281. len = size;
  1282. memcpy ( buf, &u.bytes[ sizeof ( u ) - size ], len );
  1283. return size;
  1284. }
  1285. /**
  1286. * Parse 8-bit integer setting value
  1287. *
  1288. * @v value Formatted setting value
  1289. * @v buf Buffer to contain raw value
  1290. * @v len Length of buffer
  1291. * @v size Integer size, in bytes
  1292. * @ret len Length of raw value, or negative error
  1293. */
  1294. static int parse_int8_setting ( const char *value, void *buf, size_t len ) {
  1295. return parse_int_setting ( value, buf, len, sizeof ( uint8_t ) );
  1296. }
  1297. /**
  1298. * Parse 16-bit integer setting value
  1299. *
  1300. * @v value Formatted setting value
  1301. * @v buf Buffer to contain raw value
  1302. * @v len Length of buffer
  1303. * @v size Integer size, in bytes
  1304. * @ret len Length of raw value, or negative error
  1305. */
  1306. static int parse_int16_setting ( const char *value, void *buf, size_t len ) {
  1307. return parse_int_setting ( value, buf, len, sizeof ( uint16_t ) );
  1308. }
  1309. /**
  1310. * Parse 32-bit integer setting value
  1311. *
  1312. * @v value Formatted setting value
  1313. * @v buf Buffer to contain raw value
  1314. * @v len Length of buffer
  1315. * @v size Integer size, in bytes
  1316. * @ret len Length of raw value, or negative error
  1317. */
  1318. static int parse_int32_setting ( const char *value, void *buf, size_t len ) {
  1319. return parse_int_setting ( value, buf, len, sizeof ( uint32_t ) );
  1320. }
  1321. /**
  1322. * Format signed integer setting value
  1323. *
  1324. * @v raw Raw setting value
  1325. * @v raw_len Length of raw setting value
  1326. * @v buf Buffer to contain formatted value
  1327. * @v len Length of buffer
  1328. * @ret len Length of formatted value, or negative error
  1329. */
  1330. static int format_int_setting ( const void *raw, size_t raw_len, char *buf,
  1331. size_t len ) {
  1332. signed long value;
  1333. unsigned long dummy;
  1334. int check_len;
  1335. /* Extract numeric value */
  1336. check_len = numeric_setting_value ( raw, raw_len, &value, &dummy );
  1337. if ( check_len < 0 )
  1338. return check_len;
  1339. assert ( check_len == ( int ) raw_len );
  1340. /* Format value */
  1341. return snprintf ( buf, len, "%ld", value );
  1342. }
  1343. /**
  1344. * Format unsigned integer setting value
  1345. *
  1346. * @v raw Raw setting value
  1347. * @v raw_len Length of raw setting value
  1348. * @v buf Buffer to contain formatted value
  1349. * @v len Length of buffer
  1350. * @ret len Length of formatted value, or negative error
  1351. */
  1352. static int format_uint_setting ( const void *raw, size_t raw_len, char *buf,
  1353. size_t len ) {
  1354. signed long dummy;
  1355. unsigned long value;
  1356. int check_len;
  1357. /* Extract numeric value */
  1358. check_len = numeric_setting_value ( raw, raw_len, &dummy, &value );
  1359. if ( check_len < 0 )
  1360. return check_len;
  1361. assert ( check_len == ( int ) raw_len );
  1362. /* Format value */
  1363. return snprintf ( buf, len, "%#lx", value );
  1364. }
  1365. /** A signed 8-bit integer setting type */
  1366. struct setting_type setting_type_int8 __setting_type = {
  1367. .name = "int8",
  1368. .parse = parse_int8_setting,
  1369. .format = format_int_setting,
  1370. };
  1371. /** A signed 16-bit integer setting type */
  1372. struct setting_type setting_type_int16 __setting_type = {
  1373. .name = "int16",
  1374. .parse = parse_int16_setting,
  1375. .format = format_int_setting,
  1376. };
  1377. /** A signed 32-bit integer setting type */
  1378. struct setting_type setting_type_int32 __setting_type = {
  1379. .name = "int32",
  1380. .parse = parse_int32_setting,
  1381. .format = format_int_setting,
  1382. };
  1383. /** An unsigned 8-bit integer setting type */
  1384. struct setting_type setting_type_uint8 __setting_type = {
  1385. .name = "uint8",
  1386. .parse = parse_int8_setting,
  1387. .format = format_uint_setting,
  1388. };
  1389. /** An unsigned 16-bit integer setting type */
  1390. struct setting_type setting_type_uint16 __setting_type = {
  1391. .name = "uint16",
  1392. .parse = parse_int16_setting,
  1393. .format = format_uint_setting,
  1394. };
  1395. /** An unsigned 32-bit integer setting type */
  1396. struct setting_type setting_type_uint32 __setting_type = {
  1397. .name = "uint32",
  1398. .parse = parse_int32_setting,
  1399. .format = format_uint_setting,
  1400. };
  1401. /**
  1402. * Parse hex string setting value
  1403. *
  1404. * @v value Formatted setting value
  1405. * @v buf Buffer to contain raw value
  1406. * @v len Length of buffer
  1407. * @ret len Length of raw value, or negative error
  1408. */
  1409. static int parse_hex_setting ( const char *value, void *buf, size_t len ) {
  1410. char *ptr = ( char * ) value;
  1411. uint8_t *bytes = buf;
  1412. unsigned int count = 0;
  1413. uint8_t byte;
  1414. while ( 1 ) {
  1415. byte = strtoul ( ptr, &ptr, 16 );
  1416. if ( count++ < len )
  1417. *bytes++ = byte;
  1418. switch ( *ptr ) {
  1419. case '\0' :
  1420. return count;
  1421. case ':' :
  1422. case '-' :
  1423. ptr++;
  1424. break;
  1425. default :
  1426. return -EINVAL;
  1427. }
  1428. }
  1429. }
  1430. /**
  1431. * Format hex string setting value
  1432. *
  1433. * @v raw Raw setting value
  1434. * @v raw_len Length of raw setting value
  1435. * @v buf Buffer to contain formatted value
  1436. * @v len Length of buffer
  1437. * @v delimiter Byte delimiter
  1438. * @ret len Length of formatted value, or negative error
  1439. */
  1440. static int format_hex_setting ( const void *raw, size_t raw_len, char *buf,
  1441. size_t len, const char *delimiter ) {
  1442. const uint8_t *bytes = raw;
  1443. int used = 0;
  1444. unsigned int i;
  1445. if ( len )
  1446. buf[0] = 0; /* Ensure that a terminating NUL exists */
  1447. for ( i = 0 ; i < raw_len ; i++ ) {
  1448. used += ssnprintf ( ( buf + used ), ( len - used ),
  1449. "%s%02x", ( used ? delimiter : "" ),
  1450. bytes[i] );
  1451. }
  1452. return used;
  1453. }
  1454. /**
  1455. * Format hex string setting value (using colon delimiter)
  1456. *
  1457. * @v raw Raw setting value
  1458. * @v raw_len Length of raw setting value
  1459. * @v buf Buffer to contain formatted value
  1460. * @v len Length of buffer
  1461. * @ret len Length of formatted value, or negative error
  1462. */
  1463. static int format_hex_colon_setting ( const void *raw, size_t raw_len,
  1464. char *buf, size_t len ) {
  1465. return format_hex_setting ( raw, raw_len, buf, len, ":" );
  1466. }
  1467. /**
  1468. * Format hex string setting value (using hyphen delimiter)
  1469. *
  1470. * @v raw Raw setting value
  1471. * @v raw_len Length of raw setting value
  1472. * @v buf Buffer to contain formatted value
  1473. * @v len Length of buffer
  1474. * @ret len Length of formatted value, or negative error
  1475. */
  1476. static int format_hex_hyphen_setting ( const void *raw, size_t raw_len,
  1477. char *buf, size_t len ) {
  1478. return format_hex_setting ( raw, raw_len, buf, len, "-" );
  1479. }
  1480. /** A hex-string setting (colon-delimited) */
  1481. struct setting_type setting_type_hex __setting_type = {
  1482. .name = "hex",
  1483. .parse = parse_hex_setting,
  1484. .format = format_hex_colon_setting,
  1485. };
  1486. /** A hex-string setting (hyphen-delimited) */
  1487. struct setting_type setting_type_hexhyp __setting_type = {
  1488. .name = "hexhyp",
  1489. .parse = parse_hex_setting,
  1490. .format = format_hex_hyphen_setting,
  1491. };
  1492. /**
  1493. * Parse UUID setting value
  1494. *
  1495. * @v value Formatted setting value
  1496. * @v buf Buffer to contain raw value
  1497. * @v len Length of buffer
  1498. * @ret len Length of raw value, or negative error
  1499. */
  1500. static int parse_uuid_setting ( const char *value __unused,
  1501. void *buf __unused, size_t len __unused ) {
  1502. return -ENOTSUP;
  1503. }
  1504. /**
  1505. * Format UUID setting value
  1506. *
  1507. * @v raw Raw setting value
  1508. * @v raw_len Length of raw setting value
  1509. * @v buf Buffer to contain formatted value
  1510. * @v len Length of buffer
  1511. * @ret len Length of formatted value, or negative error
  1512. */
  1513. static int format_uuid_setting ( const void *raw, size_t raw_len, char *buf,
  1514. size_t len ) {
  1515. const union uuid *uuid = raw;
  1516. /* Range check */
  1517. if ( raw_len != sizeof ( *uuid ) )
  1518. return -ERANGE;
  1519. /* Format value */
  1520. return snprintf ( buf, len, "%s", uuid_ntoa ( uuid ) );
  1521. }
  1522. /** UUID setting type */
  1523. struct setting_type setting_type_uuid __setting_type = {
  1524. .name = "uuid",
  1525. .parse = parse_uuid_setting,
  1526. .format = format_uuid_setting,
  1527. };
  1528. /******************************************************************************
  1529. *
  1530. * Setting expansion
  1531. *
  1532. ******************************************************************************
  1533. */
  1534. /**
  1535. * Expand variables within string
  1536. *
  1537. * @v string String
  1538. * @ret expstr Expanded string
  1539. *
  1540. * The expanded string is allocated with malloc() and the caller must
  1541. * eventually free() it.
  1542. */
  1543. char * expand_settings ( const char *string ) {
  1544. char *expstr;
  1545. char *start;
  1546. char *end;
  1547. char *head;
  1548. char *name;
  1549. char *tail;
  1550. int setting_len;
  1551. int new_len;
  1552. char *tmp;
  1553. /* Obtain temporary modifiable copy of string */
  1554. expstr = strdup ( string );
  1555. if ( ! expstr )
  1556. return NULL;
  1557. /* Expand while expansions remain */
  1558. while ( 1 ) {
  1559. head = expstr;
  1560. /* Locate setting to be expanded */
  1561. start = NULL;
  1562. end = NULL;
  1563. for ( tmp = expstr ; *tmp ; tmp++ ) {
  1564. if ( ( tmp[0] == '$' ) && ( tmp[1] == '{' ) )
  1565. start = tmp;
  1566. if ( start && ( tmp[0] == '}' ) ) {
  1567. end = tmp;
  1568. break;
  1569. }
  1570. }
  1571. if ( ! end )
  1572. break;
  1573. *start = '\0';
  1574. name = ( start + 2 );
  1575. *end = '\0';
  1576. tail = ( end + 1 );
  1577. /* Determine setting length */
  1578. setting_len = fetchf_named_setting ( name, NULL, 0, NULL, 0 );
  1579. if ( setting_len < 0 )
  1580. setting_len = 0; /* Treat error as empty setting */
  1581. /* Read setting into temporary buffer */
  1582. {
  1583. char setting_buf[ setting_len + 1 ];
  1584. setting_buf[0] = '\0';
  1585. fetchf_named_setting ( name, NULL, 0, setting_buf,
  1586. sizeof ( setting_buf ) );
  1587. /* Construct expanded string and discard old string */
  1588. tmp = expstr;
  1589. new_len = asprintf ( &expstr, "%s%s%s",
  1590. head, setting_buf, tail );
  1591. free ( tmp );
  1592. if ( new_len < 0 )
  1593. return NULL;
  1594. }
  1595. }
  1596. return expstr;
  1597. }
  1598. /******************************************************************************
  1599. *
  1600. * Settings
  1601. *
  1602. ******************************************************************************
  1603. */
  1604. /** Hostname setting */
  1605. struct setting hostname_setting __setting ( SETTING_HOST ) = {
  1606. .name = "hostname",
  1607. .description = "Host name",
  1608. .tag = DHCP_HOST_NAME,
  1609. .type = &setting_type_string,
  1610. };
  1611. /** Domain name setting */
  1612. struct setting domain_setting __setting ( SETTING_IPv4_EXTRA ) = {
  1613. .name = "domain",
  1614. .description = "DNS domain",
  1615. .tag = DHCP_DOMAIN_NAME,
  1616. .type = &setting_type_string,
  1617. };
  1618. /** TFTP server setting */
  1619. struct setting next_server_setting __setting ( SETTING_BOOT ) = {
  1620. .name = "next-server",
  1621. .description = "TFTP server",
  1622. .tag = DHCP_EB_SIADDR,
  1623. .type = &setting_type_ipv4,
  1624. };
  1625. /** Filename setting */
  1626. struct setting filename_setting __setting ( SETTING_BOOT ) = {
  1627. .name = "filename",
  1628. .description = "Boot filename",
  1629. .tag = DHCP_BOOTFILE_NAME,
  1630. .type = &setting_type_string,
  1631. };
  1632. /** Root path setting */
  1633. struct setting root_path_setting __setting ( SETTING_SANBOOT ) = {
  1634. .name = "root-path",
  1635. .description = "SAN root path",
  1636. .tag = DHCP_ROOT_PATH,
  1637. .type = &setting_type_string,
  1638. };
  1639. /** Username setting */
  1640. struct setting username_setting __setting ( SETTING_AUTH ) = {
  1641. .name = "username",
  1642. .description = "User name",
  1643. .tag = DHCP_EB_USERNAME,
  1644. .type = &setting_type_string,
  1645. };
  1646. /** Password setting */
  1647. struct setting password_setting __setting ( SETTING_AUTH ) = {
  1648. .name = "password",
  1649. .description = "Password",
  1650. .tag = DHCP_EB_PASSWORD,
  1651. .type = &setting_type_string,
  1652. };
  1653. /** Priority setting */
  1654. struct setting priority_setting __setting ( SETTING_MISC ) = {
  1655. .name = "priority",
  1656. .description = "Settings priority",
  1657. .tag = DHCP_EB_PRIORITY,
  1658. .type = &setting_type_int8,
  1659. };
  1660. /******************************************************************************
  1661. *
  1662. * Built-in settings block
  1663. *
  1664. ******************************************************************************
  1665. */
  1666. /** Built-in setting tag magic */
  1667. #define BUILTIN_SETTING_TAG_MAGIC 0xb1
  1668. /**
  1669. * Construct built-in setting tag
  1670. *
  1671. * @v id Unique identifier
  1672. * @ret tag Setting tag
  1673. */
  1674. #define BUILTIN_SETTING_TAG( id ) ( ( BUILTIN_SETTING_TAG_MAGIC << 24 ) | (id) )
  1675. /** "errno" setting tag */
  1676. #define BUILTIN_SETTING_TAG_ERRNO BUILTIN_SETTING_TAG ( 0x01 )
  1677. /** Error number setting */
  1678. struct setting errno_setting __setting ( SETTING_MISC ) = {
  1679. .name = "errno",
  1680. .description = "Last error",
  1681. .tag = BUILTIN_SETTING_TAG_ERRNO,
  1682. .type = &setting_type_uint32,
  1683. };
  1684. /**
  1685. * Fetch error number setting
  1686. *
  1687. * @v settings Settings block
  1688. * @v setting Setting to fetch
  1689. * @v data Setting data, or NULL to clear setting
  1690. * @v len Length of setting data
  1691. * @ret rc Return status code
  1692. */
  1693. static int errno_fetch ( struct settings *settings __unused,
  1694. struct setting *setting __unused,
  1695. void *data, size_t len ) {
  1696. uint32_t content;
  1697. /* Return current error */
  1698. content = htonl ( errno );
  1699. if ( len > sizeof ( content ) )
  1700. len = sizeof ( content );
  1701. memcpy ( data, &content, len );
  1702. return sizeof ( content );
  1703. }
  1704. /**
  1705. * Fetch built-in setting
  1706. *
  1707. * @v settings Settings block
  1708. * @v setting Setting to fetch
  1709. * @v data Setting data, or NULL to clear setting
  1710. * @v len Length of setting data
  1711. * @ret rc Return status code
  1712. */
  1713. static int builtin_fetch ( struct settings *settings __unused,
  1714. struct setting *setting,
  1715. void *data, size_t len ) {
  1716. if ( setting_cmp ( setting, &errno_setting ) == 0 ) {
  1717. return errno_fetch ( settings, setting, data, len );
  1718. } else {
  1719. return -ENOENT;
  1720. }
  1721. }
  1722. /**
  1723. * Check applicability of built-in setting
  1724. *
  1725. * @v settings Settings block
  1726. * @v setting Setting
  1727. * @ret applies Setting applies within this settings block
  1728. */
  1729. static int builtin_applies ( struct settings *settings __unused,
  1730. struct setting *setting ) {
  1731. unsigned int tag_magic;
  1732. /* Check tag magic */
  1733. tag_magic = ( setting->tag >> 24 );
  1734. return ( tag_magic == BUILTIN_SETTING_TAG_MAGIC );
  1735. }
  1736. /** Built-in settings operations */
  1737. static struct settings_operations builtin_settings_operations = {
  1738. .applies = builtin_applies,
  1739. .fetch = builtin_fetch,
  1740. };
  1741. /** Built-in settings */
  1742. static struct settings builtin_settings = {
  1743. .refcnt = NULL,
  1744. .tag_magic = BUILTIN_SETTING_TAG ( 0 ),
  1745. .siblings = LIST_HEAD_INIT ( builtin_settings.siblings ),
  1746. .children = LIST_HEAD_INIT ( builtin_settings.children ),
  1747. .op = &builtin_settings_operations,
  1748. };
  1749. /** Initialise built-in settings */
  1750. static void builtin_init ( void ) {
  1751. int rc;
  1752. if ( ( rc = register_settings ( &builtin_settings, NULL,
  1753. "builtin" ) ) != 0 ) {
  1754. DBG ( "Could not register built-in settings: %s\n",
  1755. strerror ( rc ) );
  1756. return;
  1757. }
  1758. }
  1759. /** Built-in settings initialiser */
  1760. struct init_fn builtin_init_fn __init_fn ( INIT_NORMAL ) = {
  1761. .initialise = builtin_init,
  1762. };