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.
		
		
		
		
			
				
					343 lines
				
				11 KiB
			
		
		
			
		
	
	
					343 lines
				
				11 KiB
			| 
											6 years ago
										 | '\" t
 | ||
|  | .\"     Title: zconfig
 | ||
|  | .\"    Author: [see the "AUTHORS" section]
 | ||
|  | .\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
 | ||
|  | .\"      Date: 12/31/2016
 | ||
|  | .\"    Manual: CZMQ Manual
 | ||
|  | .\"    Source: CZMQ 4.0.2
 | ||
|  | .\"  Language: English
 | ||
|  | .\"
 | ||
|  | .TH "ZCONFIG" "3" "12/31/2016" "CZMQ 4\&.0\&.2" "CZMQ Manual"
 | ||
|  | .\" -----------------------------------------------------------------
 | ||
|  | .\" * Define some portability stuff
 | ||
|  | .\" -----------------------------------------------------------------
 | ||
|  | .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | ||
|  | .\" http://bugs.debian.org/507673
 | ||
|  | .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
 | ||
|  | .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | ||
|  | .ie \n(.g .ds Aq \(aq
 | ||
|  | .el       .ds Aq '
 | ||
|  | .\" -----------------------------------------------------------------
 | ||
|  | .\" * set default formatting
 | ||
|  | .\" -----------------------------------------------------------------
 | ||
|  | .\" disable hyphenation
 | ||
|  | .nh
 | ||
|  | .\" disable justification (adjust text to left margin only)
 | ||
|  | .ad l
 | ||
|  | .\" -----------------------------------------------------------------
 | ||
|  | .\" * MAIN CONTENT STARTS HERE *
 | ||
|  | .\" -----------------------------------------------------------------
 | ||
|  | .SH "NAME"
 | ||
|  | zconfig \- work with config files written in rfc\&.zeromq\&.org/spec:4/ZPL\&.
 | ||
|  | .SH "SYNOPSIS"
 | ||
|  | .sp
 | ||
|  | .nf
 | ||
|  | //  This is a stable class, and may not change except for emergencies\&. It
 | ||
|  | //  is provided in stable builds\&.
 | ||
|  | //
 | ||
|  | typedef int (zconfig_fct) (
 | ||
|  |     zconfig_t *self, void *arg, int level);
 | ||
|  | 
 | ||
|  | //  Create new config item
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_new (const char *name, zconfig_t *parent);
 | ||
|  | 
 | ||
|  | //  Load a config tree from a specified ZPL text file; returns a zconfig_t
 | ||
|  | //  reference for the root, if the file exists and is readable\&. Returns NULL
 | ||
|  | //  if the file does not exist\&.
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_load (const char *filename);
 | ||
|  | 
 | ||
|  | //  Equivalent to zconfig_load, taking a format string instead of a fixed
 | ||
|  | //  filename\&.
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_loadf (const char *format, \&.\&.\&.) CHECK_PRINTF (1);
 | ||
|  | 
 | ||
|  | //  Destroy a config item and all its children
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_destroy (zconfig_t **self_p);
 | ||
|  | 
 | ||
|  | //  Return name of config item
 | ||
|  | CZMQ_EXPORT char *
 | ||
|  |     zconfig_name (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Return value of config item
 | ||
|  | CZMQ_EXPORT char *
 | ||
|  |     zconfig_value (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Insert or update configuration key with value
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_put (zconfig_t *self, const char *path, const char *value);
 | ||
|  | 
 | ||
|  | //  Equivalent to zconfig_put, accepting a format specifier and variable
 | ||
|  | //  argument list, instead of a single string value\&.
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_putf (zconfig_t *self, const char *path, const char *format, \&.\&.\&.) CHECK_PRINTF (3);
 | ||
|  | 
 | ||
|  | //  Get value for config item into a string value; leading slash is optional
 | ||
|  | //  and ignored\&.
 | ||
|  | CZMQ_EXPORT char *
 | ||
|  |     zconfig_get (zconfig_t *self, const char *path, const char *default_value);
 | ||
|  | 
 | ||
|  | //  Set config item name, name may be NULL
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_set_name (zconfig_t *self, const char *name);
 | ||
|  | 
 | ||
|  | //  Set new value for config item\&. The new value may be a string, a printf
 | ||
|  | //  format, or NULL\&. Note that if string may possibly contain \*(Aq%\*(Aq, or if it
 | ||
|  | //  comes from an insecure source, you must use \*(Aq%s\*(Aq as the format, followed
 | ||
|  | //  by the string\&.
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_set_value (zconfig_t *self, const char *format, \&.\&.\&.) CHECK_PRINTF (2);
 | ||
|  | 
 | ||
|  | //  Find our first child, if any
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_child (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Find our first sibling, if any
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_next (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Find a config item along a path; leading slash is optional and ignored\&.
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_locate (zconfig_t *self, const char *path);
 | ||
|  | 
 | ||
|  | //  Locate the last config item at a specified depth
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_at_depth (zconfig_t *self, int level);
 | ||
|  | 
 | ||
|  | //  Execute a callback for each config item in the tree; returns zero if
 | ||
|  | //  successful, else \-1\&.
 | ||
|  | CZMQ_EXPORT int
 | ||
|  |     zconfig_execute (zconfig_t *self, zconfig_fct handler, void *arg);
 | ||
|  | 
 | ||
|  | //  Add comment to config item before saving to disk\&. You can add as many
 | ||
|  | //  comment lines as you like\&. If you use a null format, all comments are
 | ||
|  | //  deleted\&.
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_set_comment (zconfig_t *self, const char *format, \&.\&.\&.) CHECK_PRINTF (2);
 | ||
|  | 
 | ||
|  | //  Return comments of config item, as zlist\&.
 | ||
|  | CZMQ_EXPORT zlist_t *
 | ||
|  |     zconfig_comments (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Save a config tree to a specified ZPL text file, where a filename
 | ||
|  | //  "\-" means dump to standard output\&.
 | ||
|  | CZMQ_EXPORT int
 | ||
|  |     zconfig_save (zconfig_t *self, const char *filename);
 | ||
|  | 
 | ||
|  | //  Equivalent to zconfig_save, taking a format string instead of a fixed
 | ||
|  | //  filename\&.
 | ||
|  | CZMQ_EXPORT int
 | ||
|  |     zconfig_savef (zconfig_t *self, const char *format, \&.\&.\&.) CHECK_PRINTF (2);
 | ||
|  | 
 | ||
|  | //  Report filename used during zconfig_load, or NULL if none
 | ||
|  | CZMQ_EXPORT const char *
 | ||
|  |     zconfig_filename (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Reload config tree from same file that it was previously loaded from\&.
 | ||
|  | //  Returns 0 if OK, \-1 if there was an error (and then does not change
 | ||
|  | //  existing data)\&.
 | ||
|  | CZMQ_EXPORT int
 | ||
|  |     zconfig_reload (zconfig_t **self_p);
 | ||
|  | 
 | ||
|  | //  Load a config tree from a memory chunk
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_chunk_load (zchunk_t *chunk);
 | ||
|  | 
 | ||
|  | //  Save a config tree to a new memory chunk
 | ||
|  | CZMQ_EXPORT zchunk_t *
 | ||
|  |     zconfig_chunk_save (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Load a config tree from a null\-terminated string
 | ||
|  | //  Caller owns return value and must destroy it when done\&.
 | ||
|  | CZMQ_EXPORT zconfig_t *
 | ||
|  |     zconfig_str_load (const char *string);
 | ||
|  | 
 | ||
|  | //  Save a config tree to a new null terminated string
 | ||
|  | //  Caller owns return value and must destroy it when done\&.
 | ||
|  | CZMQ_EXPORT char *
 | ||
|  |     zconfig_str_save (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Return true if a configuration tree was loaded from a file and that
 | ||
|  | //  file has changed in since the tree was loaded\&.
 | ||
|  | CZMQ_EXPORT bool
 | ||
|  |     zconfig_has_changed (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Print the config file to open stream
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_fprint (zconfig_t *self, FILE *file);
 | ||
|  | 
 | ||
|  | //  Print properties of object
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_print (zconfig_t *self);
 | ||
|  | 
 | ||
|  | //  Self test of this class
 | ||
|  | CZMQ_EXPORT void
 | ||
|  |     zconfig_test (bool verbose);
 | ||
|  | 
 | ||
|  | Please add \*(Aq@interface\*(Aq section in \*(Aq\&./\&.\&./src/zconfig\&.c\*(Aq\&.
 | ||
|  | .fi
 | ||
|  | .SH "DESCRIPTION"
 | ||
|  | .sp
 | ||
|  | Lets applications load, work with, and save configuration files\&. This implements rfc\&.zeromq\&.org/spec:4/ZPL, which is a simple structured text format for configuration files\&.
 | ||
|  | .sp
 | ||
|  | Here is an example ZPL stream and corresponding config structure:
 | ||
|  | .sp
 | ||
|  | .if n \{\
 | ||
|  | .RS 4
 | ||
|  | .\}
 | ||
|  | .nf
 | ||
|  | context
 | ||
|  |     iothreads = 1
 | ||
|  |     verbose = 1      #   Ask for a trace
 | ||
|  | main
 | ||
|  |     type = zqueue    #  ZMQ_DEVICE type
 | ||
|  |     frontend
 | ||
|  |         option
 | ||
|  |             hwm = 1000
 | ||
|  |             swap = 25000000     #  25MB
 | ||
|  |         bind = \*(Aqinproc://addr1\*(Aq
 | ||
|  |         bind = \*(Aqipc://addr2\*(Aq
 | ||
|  |     backend
 | ||
|  |         bind = inproc://addr3
 | ||
|  | .fi
 | ||
|  | .if n \{\
 | ||
|  | .RE
 | ||
|  | .\}
 | ||
|  | .sp
 | ||
|  | .if n \{\
 | ||
|  | .RS 4
 | ||
|  | .\}
 | ||
|  | .nf
 | ||
|  | root                    Down = child
 | ||
|  | |                     Across = next
 | ||
|  | v
 | ||
|  | context\-\->main
 | ||
|  | |         |
 | ||
|  | |         v
 | ||
|  | |       type=queue\-\->frontend\-\->backend
 | ||
|  | |                      |          |
 | ||
|  | |                      |          v
 | ||
|  | |                      |        bind=inproc://addr3
 | ||
|  | |                      v
 | ||
|  | |                    option\-\->bind=inproc://addr1\-\->bind=ipc://addr2
 | ||
|  | |                      |
 | ||
|  | |                      v
 | ||
|  | |                    hwm=1000\-\->swap=25000000
 | ||
|  | v
 | ||
|  | iothreads=1\-\->verbose=false
 | ||
|  | .fi
 | ||
|  | .if n \{\
 | ||
|  | .RE
 | ||
|  | .\}
 | ||
|  | .SH "EXAMPLE"
 | ||
|  | .PP
 | ||
|  | \fBFrom zconfig_test method\fR. 
 | ||
|  | .sp
 | ||
|  | .if n \{\
 | ||
|  | .RS 4
 | ||
|  | .\}
 | ||
|  | .nf
 | ||
|  | //  Create temporary directory for test files
 | ||
|  | #   define TESTDIR "\&.test_zconfig"
 | ||
|  | zsys_dir_create (TESTDIR);
 | ||
|  | 
 | ||
|  | zconfig_t *root = zconfig_new ("root", NULL);
 | ||
|  | assert (root);
 | ||
|  | zconfig_t *section, *item;
 | ||
|  | 
 | ||
|  | section = zconfig_new ("headers", root);
 | ||
|  | assert (section);
 | ||
|  | item = zconfig_new ("email", section);
 | ||
|  | assert (item);
 | ||
|  | zconfig_set_value (item, "some@random\&.com");
 | ||
|  | item = zconfig_new ("name", section);
 | ||
|  | assert (item);
 | ||
|  | zconfig_set_value (item, "Justin Kayce");
 | ||
|  | zconfig_putf (root, "/curve/secret\-key", "%s", "Top Secret");
 | ||
|  | zconfig_set_comment (root, "   CURVE certificate");
 | ||
|  | zconfig_set_comment (root, "   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-");
 | ||
|  | assert (zconfig_comments (root));
 | ||
|  | zconfig_save (root, TESTDIR "/test\&.cfg");
 | ||
|  | zconfig_destroy (&root);
 | ||
|  | root = zconfig_load (TESTDIR "/test\&.cfg");
 | ||
|  | if (verbose)
 | ||
|  |     zconfig_save (root, "\-");
 | ||
|  | assert (streq (zconfig_filename (root), TESTDIR "/test\&.cfg"));
 | ||
|  | 
 | ||
|  | char *email = zconfig_get (root, "/headers/email", NULL);
 | ||
|  | assert (email);
 | ||
|  | assert (streq (email, "some@random\&.com"));
 | ||
|  | char *passwd = zconfig_get (root, "/curve/secret\-key", NULL);
 | ||
|  | assert (passwd);
 | ||
|  | assert (streq (passwd, "Top Secret"));
 | ||
|  | 
 | ||
|  | zconfig_savef (root, "%s/%s", TESTDIR, "test\&.cfg");
 | ||
|  | assert (!zconfig_has_changed (root));
 | ||
|  | int rc = zconfig_reload (&root);
 | ||
|  | assert (rc == 0);
 | ||
|  | assert (!zconfig_has_changed (root));
 | ||
|  | zconfig_destroy (&root);
 | ||
|  | 
 | ||
|  | //  Test chunk load/save
 | ||
|  | root = zconfig_new ("root", NULL);
 | ||
|  | assert (root);
 | ||
|  | section = zconfig_new ("section", root);
 | ||
|  | assert (section);
 | ||
|  | item = zconfig_new ("value", section);
 | ||
|  | assert (item);
 | ||
|  | zconfig_set_value (item, "somevalue");
 | ||
|  | zconfig_t *search = zconfig_locate (root, "section/value");
 | ||
|  | assert (search == item);
 | ||
|  | zchunk_t *chunk = zconfig_chunk_save (root);
 | ||
|  | assert (strlen ((char *) zchunk_data (chunk)) == 32);
 | ||
|  | char *string = zconfig_str_save (root);
 | ||
|  | assert (string);
 | ||
|  | assert (streq (string, (char *) zchunk_data (chunk)));
 | ||
|  | free (string);
 | ||
|  | assert (chunk);
 | ||
|  | zconfig_destroy (&root);
 | ||
|  | 
 | ||
|  | root = zconfig_chunk_load (chunk);
 | ||
|  | assert (root);
 | ||
|  | char *value = zconfig_get (root, "/section/value", NULL);
 | ||
|  | assert (value);
 | ||
|  | assert (streq (value, "somevalue"));
 | ||
|  | 
 | ||
|  | //  Test config can\*(Aqt be saved to a file in a path that doesn\*(Aqt
 | ||
|  | //  exist or isn\*(Aqt writable
 | ||
|  | rc = zconfig_savef (root, "%s/path/that/doesnt/exist/%s", TESTDIR, "test\&.cfg");
 | ||
|  | assert (rc == \-1);
 | ||
|  | 
 | ||
|  | zconfig_destroy (&root);
 | ||
|  | zchunk_destroy (&chunk);
 | ||
|  | 
 | ||
|  | //  Delete all test files
 | ||
|  | zdir_t *dir = zdir_new (TESTDIR, NULL);
 | ||
|  | assert (dir);
 | ||
|  | zdir_remove (dir, true);
 | ||
|  | zdir_destroy (&dir);
 | ||
|  | .fi
 | ||
|  | .if n \{\
 | ||
|  | .RE
 | ||
|  | .\}
 | ||
|  | .sp
 | ||
|  | .SH "AUTHORS"
 | ||
|  | .sp
 | ||
|  | The czmq manual was written by the authors in the AUTHORS file\&.
 | ||
|  | .SH "RESOURCES"
 | ||
|  | .sp
 | ||
|  | Main web site: \m[blue]\fB\%\fR\m[]
 | ||
|  | .sp
 | ||
|  | Report bugs to the email <\m[blue]\fBzeromq\-dev@lists\&.zeromq\&.org\fR\m[]\&\s-2\u[1]\d\s+2>
 | ||
|  | .SH "COPYRIGHT"
 | ||
|  | .sp
 | ||
|  | Copyright (c) the Contributors as noted in the AUTHORS file\&. This file is part of CZMQ, the high\-level C binding for 0MQ: http://czmq\&.zeromq\&.org\&. This Source Code Form is subject to the terms of the Mozilla Public License, v\&. 2\&.0\&. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla\&.org/MPL/2\&.0/\&. LICENSE included with the czmq distribution\&.
 | ||
|  | .SH "NOTES"
 | ||
|  | .IP " 1." 4
 | ||
|  | zeromq-dev@lists.zeromq.org
 | ||
|  | .RS 4
 | ||
|  | \%mailto:zeromq-dev@lists.zeromq.org
 | ||
|  | .RE
 |