GNUnet  0.10.x
fs_getopt.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
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  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19 */
20 
26 #include "platform.h"
27 #include "gnunet_fs_service.h"
28 #include "gnunet_getopt_lib.h"
29 #include "fs_api.h"
30 
31 /* ******************** command-line option parsing API ******************** */
32 
45 static int
47  void *scls,
48  const char *option,
49  const char *value)
50 {
51  struct GNUNET_FS_Uri **uri = scls;
52  struct GNUNET_FS_Uri *u = *uri;
53  char *val;
54  size_t slen;
55 
56  if (NULL == u)
57  {
58  u = GNUNET_new (struct GNUNET_FS_Uri);
59  *uri = u;
61  u->data.ksk.keywordCount = 0;
62  u->data.ksk.keywords = NULL;
63  }
64  else
65  {
67  }
68  slen = strlen (value);
69  if (0 == slen)
70  return GNUNET_SYSERR; /* cannot be empty */
71  if (value[0] == '+')
72  {
73  /* simply preserve the "mandatory" flag */
74  if (slen < 2)
75  return GNUNET_SYSERR; /* empty keywords not allowed */
76  if ((value[1] == '"') && (slen > 3) && (value[slen - 1] == '"'))
77  {
78  /* remove the quotes, keep the '+' */
79  val = GNUNET_malloc (slen - 1);
80  val[0] = '+';
81  GNUNET_memcpy (&val[1],
82  &value[2],
83  slen - 3);
84  val[slen - 2] = '\0';
85  }
86  else
87  {
88  /* no quotes, just keep the '+' */
89  val = GNUNET_strdup (value);
90  }
91  }
92  else
93  {
94  if ((value[0] == '"') && (slen > 2) && (value[slen - 1] == '"'))
95  {
96  /* remove the quotes, add a space */
97  val = GNUNET_malloc (slen);
98  val[0] = ' ';
99  GNUNET_memcpy (&val[1],
100  &value[1],
101  slen - 2);
102  val[slen - 1] = '\0';
103  }
104  else
105  {
106  /* add a space to indicate "not mandatory" */
107  val = GNUNET_malloc (slen + 2);
108  strcpy (val, " ");
109  strcat (val, value);
110  }
111  }
112  GNUNET_array_append (u->data.ksk.keywords,
113  u->data.ksk.keywordCount,
114  val);
115  return GNUNET_OK;
116 }
117 
118 
130  const char *name,
131  const char *argumentHelp,
132  const char *description,
133  struct GNUNET_FS_Uri **topKeywords)
134 {
135  struct GNUNET_GETOPT_CommandLineOption clo = {
136  .shortName = shortName,
137  .name = name,
138  .argumentHelp = argumentHelp,
139  .description = description,
140  .require_argument = 1,
141  .processor = &getopt_set_keywords,
142  .scls = (void *) topKeywords
143  };
144 
145  return clo;
146 }
147 
148 
161 static int
163  void *scls,
164  const char *option,
165  const char *value)
166 {
167  struct GNUNET_CONTAINER_MetaData **mm = scls;
168 #if HAVE_EXTRACTOR_H && HAVE_LIBEXTRACTOR
170  const char *typename;
171  const char *typename_i18n;
172 #endif
174  char *tmp;
175 
176  meta = *mm;
177  if (meta == NULL)
178  {
180  *mm = meta;
181  }
182 
183  /* Use GNUNET_STRINGS_get_utf8_args() in main() to acquire utf-8-encoded
184  * commandline arguments, so that the following line is not needed.
185  */
186  /*tmp = GNUNET_STRINGS_to_utf8 (value, strlen (value), locale_charset ());*/
187  tmp = GNUNET_strdup (value);
188 #if HAVE_EXTRACTOR_H && HAVE_LIBEXTRACTOR
189  type = EXTRACTOR_metatype_get_max ();
190  while (type > 0)
191  {
192  type--;
193  typename = EXTRACTOR_metatype_to_string (type);
194  typename_i18n = dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN, typename);
195  if ((strlen (tmp) >= strlen (typename) + 1) &&
196  (tmp[strlen (typename)] == ':') &&
197  (0 == strncmp (typename, tmp, strlen (typename))))
198  {
199  GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet>", type,
201  "text/plain",
202  &tmp[strlen (typename) + 1],
203  strlen (&tmp[strlen (typename) + 1]) +
204  1);
205  GNUNET_free (tmp);
206  tmp = NULL;
207  break;
208  }
209  if ((strlen (tmp) >= strlen (typename_i18n) + 1) &&
210  (tmp[strlen (typename_i18n)] == ':') &&
211  (0 == strncmp (typename_i18n, tmp, strlen (typename_i18n))))
212  {
213  GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet>", type,
215  "text/plain",
216  &tmp[strlen (typename_i18n) + 1],
217  strlen (&tmp
218  [strlen (typename_i18n) + 1]) +
219  1);
220  GNUNET_free (tmp);
221  tmp = NULL;
222  break;
223  }
224  }
225 #endif
226 
227  if (NULL != tmp)
228  {
229  GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet>",
231  EXTRACTOR_METAFORMAT_UTF8, "text/plain",
232  tmp, strlen (tmp) + 1);
233  GNUNET_free (tmp);
234  printf (_
235  ("Unknown metadata type in metadata option `%s'. Using metadata type `unknown' instead.\n"),
236  value);
237  }
238  return GNUNET_OK;
239 }
240 
252  const char *name,
253  const char *argumentHelp,
254  const char *description,
256 {
257  struct GNUNET_GETOPT_CommandLineOption clo = {
258  .shortName = shortName,
259  .name = name,
260  .argumentHelp = argumentHelp,
261  .description = description,
262  .require_argument = 1,
263  .processor = &getopt_set_metadata,
264  .scls = (void *) meta
265  };
266 
267  return clo;
268 }
269 
270 
271 
272 
273 /* end of fs_getopt.c */
General context for command line processors.
const char * argumentHelp
Name of the argument for the user in help text.
void * scls
Specific closure to pass to the processor.
const char * description
Help text for the option (description)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
Keyword search key (query with keywords).
Definition: fs_api.h:156
0-terminated, UTF-8 encoded string.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Definition of a command line option.
EXTRACTOR_MetaType
Enumeration defining various sources of keywords.
const char shortName
Short name of the option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_FS_GETOPT_METADATA(char shortName, const char *name, const char *argumentHelp, const char *description, struct GNUNET_CONTAINER_MetaData **meta)
Allow user to specify metadata.
Definition: fs_getopt.c:251
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
static struct GNUNET_FS_Uri * uri
Value of URI provided on command-line (when not publishing a file but just creating UBlocks to refer ...
Meta data to associate with a file, directory or namespace.
static struct GNUNET_FS_Uri * topKeywords
Keywords provided via command-line option.
#define GNUNET_memcpy(dst, src, n)
#define dgettext(Domainname, Msgid)
Definition: gettext.h:46
static char * value
Value of the record to add/remove.
struct GNUNET_FS_Uri::@16::@17 ksk
struct GNUNET_CONTAINER_MetaData * GNUNET_CONTAINER_meta_data_create(void)
Create a fresh meta data container.
union GNUNET_FS_Uri::@16 data
static char * option
Name of the option.
Definition: gnunet-config.c:38
int GNUNET_CONTAINER_meta_data_insert(struct GNUNET_CONTAINER_MetaData *md, const char *plugin_name, enum EXTRACTOR_MetaType type, enum EXTRACTOR_MetaFormat format, const char *data_mime_type, const char *data, size_t data_size)
Extend metadata.
struct GNUNET_GETOPT_CommandLineOption GNUNET_FS_GETOPT_KEYWORDS(char shortName, const char *name, const char *argumentHelp, const char *description, struct GNUNET_FS_Uri **topKeywords)
Allow user to specify keywords.
Definition: fs_getopt.c:129
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
const char * name
enum GNUNET_FS_UriType type
Type of the URI.
Definition: fs_api.h:173
#define GNUNET_array_append(arr, size, element)
Append an element to a list (growing the list by one).
shared definitions for the FS library
#define LIBEXTRACTOR_GETTEXT_DOMAIN
Definition: platform.h:209
A Universal Resource Identifier (URI), opaque.
Definition: fs_api.h:168
static struct GNUNET_CONTAINER_MetaData * meta
Meta-data provided via command-line option.
static int getopt_set_keywords(struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, void *scls, const char *option, const char *value)
Command-line option parser function that allows the user to specify one or more &#39;-k&#39; options with key...
Definition: fs_getopt.c:46
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
static int getopt_set_metadata(struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, void *scls, const char *option, const char *value)
Command-line option parser function that allows the user to specify one or more &#39;-m&#39; options with met...
Definition: fs_getopt.c:162
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.