2 This file is part of GNUnet.
3 (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @file fs/fs_getopt.c
23 * @brief helper functions for command-line argument processing
24 * @author Igor Wronsky, Christian Grothoff
27 #include "gnunet_fs_service.h"
30 /* ******************** command-line option parsing API ******************** */
33 * Command-line option parser function that allows the user
34 * to specify one or more '-k' options with keywords. Each
35 * specified keyword will be added to the URI. A pointer to
36 * the URI must be passed as the "scls" argument.
38 * @param ctx command line processor context
39 * @param scls must be of type "struct GNUNET_FS_Uri **"
40 * @param option name of the option (typically 'k')
41 * @param value command line argument given
42 * @return GNUNET_OK on success
45 GNUNET_FS_getopt_set_keywords (struct GNUNET_GETOPT_CommandLineProcessorContext
46 *ctx, void *scls, const char *option,
49 struct GNUNET_FS_Uri **uri = scls;
50 struct GNUNET_FS_Uri *u = *uri;
56 u = GNUNET_malloc (sizeof (struct GNUNET_FS_Uri));
59 u->data.ksk.keywordCount = 0;
60 u->data.ksk.keywords = NULL;
64 GNUNET_assert (u->type == ksk);
66 slen = strlen (value);
68 return GNUNET_SYSERR; /* cannot be empty */
71 /* simply preserve the "mandatory" flag */
73 return GNUNET_SYSERR; /* empty keywords not allowed */
74 if ((value[1] == '"') && (slen > 3) && (value[slen - 1] == '"'))
76 /* remove the quotes, keep the '+' */
77 val = GNUNET_malloc (slen - 1);
79 memcpy (&val[1], &value[2], slen - 3);
84 /* no quotes, just keep the '+' */
85 val = GNUNET_strdup (value);
90 if ((value[0] == '"') && (slen > 2) && (value[slen - 1] == '"'))
92 /* remove the quotes, add a space */
93 val = GNUNET_malloc (slen);
95 memcpy (&val[1], &value[1], slen - 2);
100 /* add a space to indicate "not mandatory" */
101 val = GNUNET_malloc (slen + 2);
106 GNUNET_array_append (u->data.ksk.keywords, u->data.ksk.keywordCount, val);
112 * Command-line option parser function that allows the user to specify
113 * one or more '-m' options with metadata. Each specified entry of
114 * the form "type=value" will be added to the metadata. A pointer to
115 * the metadata must be passed as the "scls" argument.
117 * @param ctx command line processor context
118 * @param scls must be of type "struct GNUNET_MetaData **"
119 * @param option name of the option (typically 'k')
120 * @param value command line argument given
121 * @return GNUNET_OK on success
124 GNUNET_FS_getopt_set_metadata (struct GNUNET_GETOPT_CommandLineProcessorContext
125 *ctx, void *scls, const char *option,
128 struct GNUNET_CONTAINER_MetaData **mm = scls;
129 enum EXTRACTOR_MetaType type;
130 const char *typename;
131 const char *typename_i18n;
132 struct GNUNET_CONTAINER_MetaData *meta;
138 meta = GNUNET_CONTAINER_meta_data_create ();
143 tmp = GNUNET_STRINGS_to_utf8 (value, strlen (value), nl_langinfo (CODESET));
145 tmp = GNUNET_STRINGS_to_utf8 (value, strlen (value), "utf-8");
147 type = EXTRACTOR_metatype_get_max ();
151 typename = EXTRACTOR_metatype_to_string (type);
152 typename_i18n = dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN, typename);
153 if ((strlen (tmp) >= strlen (typename) + 1) &&
154 (tmp[strlen (typename)] == ':') &&
155 (0 == strncmp (typename, tmp, strlen (typename))))
157 GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet>", type,
158 EXTRACTOR_METAFORMAT_UTF8,
160 &tmp[strlen (typename) + 1],
161 strlen (&tmp[strlen (typename) + 1]) +
167 if ((strlen (tmp) >= strlen (typename_i18n) + 1) &&
168 (tmp[strlen (typename_i18n)] == ':') &&
169 (0 == strncmp (typename_i18n, tmp, strlen (typename_i18n))))
171 GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet>", type,
172 EXTRACTOR_METAFORMAT_UTF8,
174 &tmp[strlen (typename_i18n) + 1],
176 [strlen (typename_i18n) + 1]) +
185 GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet>",
186 EXTRACTOR_METATYPE_UNKNOWN,
187 EXTRACTOR_METAFORMAT_UTF8, "text/plain",
188 tmp, strlen (tmp) + 1);
191 ("Unknown metadata type in metadata option `%s'. Using metadata type `unknown' instead.\n"),
197 /* end of fs_getopt.c */