GNUnet  0.11.x
Macros | Functions | Variables
gnunet-qr.c File Reference
#include <stdio.h>
#include <zbar.h>
#include <stdbool.h>
#include "platform.h"
#include "gnunet_util_lib.h"
Include dependency graph for gnunet-qr.c:

Go to the source code of this file.

Macros

#define LOG(fmt, ...)
 

Functions

static void maint_child_death (void *cls)
 Task triggered whenever we receive a SIGCHLD (child process died) or when user presses CTRL-C. More...
 
static void gnunet_uri (void *cls, const char *uri, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Dispatch URIs to the appropriate GNUnet helper process. More...
 
static const zbar_symbol_t * get_symbol (zbar_processor_t *proc)
 Obtain QR code 'symbol' from proc. More...
 
static char * run_zbar ()
 Run zbar QR code parser. More...
 
static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Main function that will be run by the scheduler. More...
 
int main (int argc, char *const *argv)
 

Variables

static char * device = "/dev/video0"
 Video device to capture from. More...
 
static int verbose = false
 –verbose option More...
 
static int silent = false
 –silent option More...
 
static long unsigned int exit_code = 1
 Handler exit code. More...
 
static struct GNUNET_OS_Processp
 Helper process we started. More...
 
static struct GNUNET_DISK_PipeHandlesigpipe
 Pipe used to communicate child death via signal. More...
 

Detailed Description

Author
Hartmut Goebel (original implementation)
Martin Schanzenbach (integrate gnunet-uri)
Christian Grothoff (error handling)

Definition in file gnunet-qr.c.

Macro Definition Documentation

◆ LOG

#define LOG (   fmt,
  ... 
)
Value:
if (verbose == true) \
printf (fmt, ## __VA_ARGS__)
static int verbose
–verbose option
Definition: gnunet-qr.c:44

Definition at line 32 of file gnunet-qr.c.

Referenced by get_symbol(), and run_zbar().

Function Documentation

◆ maint_child_death()

static void maint_child_death ( void *  cls)
static

Task triggered whenever we receive a SIGCHLD (child process died) or when user presses CTRL-C.

Parameters
clsclosure, NULL

Definition at line 75 of file gnunet-qr.c.

References exit_code, GNUNET_break, GNUNET_OK, GNUNET_OS_process_destroy(), GNUNET_OS_PROCESS_EXITED, GNUNET_OS_process_kill(), GNUNET_OS_process_status(), GNUNET_TERM_SIG, and type.

Referenced by gnunet_uri().

76 {
78 
79  if ((GNUNET_OK != GNUNET_OS_process_status (p, &type, &exit_code)) ||
80  (type != GNUNET_OS_PROCESS_EXITED))
83 }
void GNUNET_OS_process_destroy(struct GNUNET_OS_Process *proc)
Cleans up process structure contents (OS-dependent) and deallocates it.
Definition: os_priority.c:287
int GNUNET_OS_process_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
Retrieve the status of a process, waiting on it if dead.
Definition: os_priority.c:963
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
GNUNET_OS_ProcessStatusType
Process status types.
The process exited with a return code.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
#define GNUNET_TERM_SIG
The termination signal.
Definition: platform.h:242
int GNUNET_OS_process_kill(struct GNUNET_OS_Process *proc, int sig)
Sends a signal to the process.
Definition: os_priority.c:225
static long unsigned int exit_code
Handler exit code.
Definition: gnunet-qr.c:54
Here is the call graph for this function:
Here is the caller graph for this function:

◆ gnunet_uri()

static void gnunet_uri ( void *  cls,
const char *  uri,
const char *  cfgfile,
const struct GNUNET_CONFIGURATION_Handle cfg 
)
static

Dispatch URIs to the appropriate GNUnet helper process.

Parameters
clsclosure
uriuri to dispatch
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgconfiguration

Definition at line 95 of file gnunet-qr.c.

References _, GNUNET_CONFIGURATION_get_value_string(), GNUNET_DISK_PIPE_END_READ, GNUNET_DISK_pipe_handle(), GNUNET_free, GNUNET_NO, GNUNET_OK, GNUNET_OS_start_process(), GNUNET_SCHEDULER_add_read_file(), GNUNET_SCHEDULER_cancel(), GNUNET_strndup, GNUNET_TIME_UNIT_FOREVER_REL, maint_child_death(), subsystem, and uri.

Referenced by run().

99 {
100  const char *orig_uri;
101  const char *slash;
102  char *subsystem;
103  char *program;
104  struct GNUNET_SCHEDULER_Task *rt;
105 
106  orig_uri = uri;
107  if (0 != strncasecmp ("gnunet://", uri, strlen ("gnunet://")))
108  {
109  fprintf (stderr,
110  _ ("Invalid URI: does not start with `%s'\n"),
111  "gnunet://");
112  return;
113  }
114  uri += strlen ("gnunet://");
115  if (NULL == (slash = strchr (uri, '/')))
116  {
117  fprintf (stderr, _ ("Invalid URI: fails to specify subsystem\n"));
118  return;
119  }
120  subsystem = GNUNET_strndup (uri, slash - uri);
121  if (GNUNET_OK !=
122  GNUNET_CONFIGURATION_get_value_string (cfg, "uri", subsystem, &program))
123  {
124  fprintf (stderr, _ ("No handler known for subsystem `%s'\n"), subsystem);
125  GNUNET_free (subsystem);
126  return;
127  }
128  GNUNET_free (subsystem);
133  NULL);
135  0,
136  NULL,
137  NULL,
138  NULL,
139  program,
140  program,
141  orig_uri,
142  NULL);
143  GNUNET_free (program);
144  if (NULL == p)
146 }
static char * subsystem
Set to subsystem that we&#39;re going to get stats for (or NULL for all).
static struct GNUNET_DISK_PipeHandle * sigpipe
Pipe used to communicate child death via signal.
Definition: gnunet-qr.c:65
struct GNUNET_OS_Process * GNUNET_OS_start_process(int pipe_control, enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename,...)
Start a process.
Definition: os_priority.c:687
#define GNUNET_NO
Definition: gnunet_common.h:78
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_read_file(struct GNUNET_TIME_Relative delay, const struct GNUNET_DISK_FileHandle *rfd, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when the specified file descriptor is ready f...
Definition: scheduler.c:1636
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
const struct GNUNET_DISK_FileHandle * GNUNET_DISK_pipe_handle(const struct GNUNET_DISK_PipeHandle *p, enum GNUNET_DISK_PipeEnd n)
Get the handle to a particular pipe end.
Definition: disk.c:1753
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static struct GNUNET_FS_Uri * uri
Value of URI provided on command-line (when not publishing a file but just creating UBlocks to refer ...
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
The reading-end of a pipe.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.
Entry in list of pending tasks.
Definition: scheduler.c:134
#define GNUNET_free(ptr)
Wrapper around free.
static void maint_child_death(void *cls)
Task triggered whenever we receive a SIGCHLD (child process died) or when user presses CTRL-C...
Definition: gnunet-qr.c:75
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_symbol()

static const zbar_symbol_t* get_symbol ( zbar_processor_t *  proc)
static

Obtain QR code 'symbol' from proc.

Parameters
proczbar processor to use
Returns
NULL on error

Definition at line 156 of file gnunet-qr.c.

References device, GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, and LOG.

Referenced by run_zbar().

157 {
158  const zbar_symbol_set_t *symbols;
159  int rc;
160  int n;
161 
162  if (0 != zbar_processor_parse_config (proc, "enable"))
163  {
164  GNUNET_break (0);
165  return NULL;
166  }
167 
168  /* initialize the Processor */
169  if (0 != (rc = zbar_processor_init (proc, device, 1)))
170  {
172  "Failed to open device `%s': %d\n",
173  device,
174  rc);
175  return NULL;
176  }
177 
178  /* enable the preview window */
179  if ((0 != (rc = zbar_processor_set_visible (proc, 1))) ||
180  (0 != (rc = zbar_processor_set_active (proc, 1))))
181  {
182  GNUNET_break (0);
183  return NULL;
184  }
185 
186  /* read at least one barcode (or until window closed) */
187  LOG ("Capturing\n");
188  n = zbar_process_one (proc, -1);
189 
190  /* hide the preview window */
191  (void) zbar_processor_set_active (proc, 0);
192  (void) zbar_processor_set_visible (proc, 0);
193  if (-1 == n)
194  return NULL; /* likely user closed the window */
195  LOG ("Got %i images\n", n);
196  /* extract results */
197  symbols = zbar_processor_get_results (proc);
198  if (NULL == symbols)
199  {
200  GNUNET_break (0);
201  return NULL;
202  }
203  return zbar_symbol_set_first_symbol (symbols);
204 }
static char * device
Video device to capture from.
Definition: gnunet-qr.c:39
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define LOG(fmt,...)
Definition: gnunet-qr.c:32
#define GNUNET_log(kind,...)
Here is the caller graph for this function:

◆ run_zbar()

static char* run_zbar ( )
static

Run zbar QR code parser.

Returns
NULL on error, otherwise the URI that we found

Definition at line 213 of file gnunet-qr.c.

References data, get_symbol(), GNUNET_break, GNUNET_strdup, LOG, and ret.

Referenced by run().

214 {
215  zbar_processor_t *proc;
216  const char *data;
217  char *ret;
218  const zbar_symbol_t *symbol;
219 
220  /* configure the Processor */
221  proc = zbar_processor_create (1);
222  if (NULL == proc)
223  {
224  GNUNET_break (0);
225  return NULL;
226  }
227 
228  symbol = get_symbol (proc);
229  if (NULL == symbol)
230  {
231  zbar_processor_destroy (proc);
232  return NULL;
233  }
234  data = zbar_symbol_get_data (symbol);
235  if (NULL == data)
236  {
237  GNUNET_break (0);
238  zbar_processor_destroy (proc);
239  return NULL;
240  }
241  LOG ("Found %s \"%s\"\n",
242  zbar_get_symbol_name (zbar_symbol_get_type (symbol)),
243  data);
244  ret = GNUNET_strdup (data);
245  /* clean up */
246  zbar_processor_destroy (proc);
247  return ret;
248 }
static const zbar_symbol_t * get_symbol(zbar_processor_t *proc)
Obtain QR code &#39;symbol&#39; from proc.
Definition: gnunet-qr.c:156
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define LOG(fmt,...)
Definition: gnunet-qr.c:32
uint32_t data
The data value.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
char *const *  args,
const char *  cfgfile,
const struct GNUNET_CONFIGURATION_Handle cfg 
)
static

Main function that will be run by the scheduler.

Parameters
clsclosure
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgconfiguration

Definition at line 260 of file gnunet-qr.c.

References data, exit_code, GNUNET_free, gnunet_uri(), and run_zbar().

Referenced by main().

264 {
265  char *data;
266 
267  data = run_zbar ();
268  if (NULL == data)
269  return;
270  gnunet_uri (cls, data, cfgfile, cfg);
271  if (exit_code != 0)
272  {
273  printf ("Failed to add URI %s\n", data);
274  }
275  else
276  {
277  printf ("Added URI %s\n", data);
278  }
279  GNUNET_free (data);
280 };
static void gnunet_uri(void *cls, const char *uri, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
Dispatch URIs to the appropriate GNUnet helper process.
Definition: gnunet-qr.c:95
static char * run_zbar()
Run zbar QR code parser.
Definition: gnunet-qr.c:213
uint32_t data
The data value.
#define GNUNET_free(ptr)
Wrapper around free.
static long unsigned int exit_code
Handler exit code.
Definition: gnunet-qr.c:54
Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *const *  argv 
)

Definition at line 284 of file gnunet-qr.c.

References device, exit_code, gettext_noop, GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_flag(), GNUNET_GETOPT_option_string(), GNUNET_OK, GNUNET_PROGRAM_run(), ret, run(), silent, and verbose.

285 {
286  int ret;
289  'd',
290  "device",
291  "DEVICE",
292  gettext_noop ("use video-device DEVICE (default: /dev/video0"),
293  &device),
295  "verbose",
296  gettext_noop ("be verbose"),
297  &verbose),
299  "silent",
300  gettext_noop ("do not show preview windows"),
301  &silent),
303 
304  ret = GNUNET_PROGRAM_run (
305  argc,
306  argv,
307  "gnunet-qr",
308  gettext_noop (
309  "Scan a QR code using a video device and import the uri read"),
310  options,
311  &run,
312  NULL);
313  return ((GNUNET_OK == ret) && (0 == exit_code)) ? 0 : 1;
314 }
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
static char * device
Video device to capture from.
Definition: gnunet-qr.c:39
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Definition of a command line option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
static int silent
–silent option
Definition: gnunet-qr.c:49
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
int GNUNET_PROGRAM_run(int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options).
Definition: program.c:367
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
Main function that will be run by the scheduler.
Definition: gnunet-qr.c:260
static int verbose
–verbose option
Definition: gnunet-qr.c:44
#define gettext_noop(String)
Definition: gettext.h:69
static long unsigned int exit_code
Handler exit code.
Definition: gnunet-qr.c:54
Here is the call graph for this function:

Variable Documentation

◆ device

char* device = "/dev/video0"
static

Video device to capture from.

Sane default for GNU/Linux systems.

Definition at line 39 of file gnunet-qr.c.

Referenced by get_symbol(), and main().

◆ verbose

int verbose = false
static

–verbose option

Definition at line 44 of file gnunet-qr.c.

Referenced by main().

◆ silent

int silent = false
static

–silent option

Definition at line 49 of file gnunet-qr.c.

Referenced by main().

◆ exit_code

long unsigned int exit_code = 1
static

Handler exit code.

Definition at line 54 of file gnunet-qr.c.

Referenced by main(), maint_child_death(), and run().

◆ p

struct GNUNET_OS_Process* p
static

Helper process we started.

Definition at line 59 of file gnunet-qr.c.

Referenced by _make_continuous_arg_copy(), access_handler_callback(), adjust(), age_values(), ats_performance_info_cb(), block_proc(), block_reader(), check_priority(), comm_connect_cb(), comm_disconnect_cb(), comm_schedule_send(), compute_scalar_product(), compute_service_response(), context_state_callback(), create_loc_uri(), CustomPeerMap_put(), CustomPeerMap_remove_peer(), display_bar(), display_request(), dns_result_parser(), do_connect_peers(), do_shutdown(), do_stop_task(), download_stop_task(), dump_buffer(), encode_cont(), enforce_add_address(), enforce_del_address(), enforce_start_property(), enforce_start_request(), enforce_stop_preference(), enforce_stop_request(), enforce_stop_send(), evaluate(), find_timed_out(), format_help(), free_link_properties(), free_preference(), get_all_peers_iterator(), get_all_tunnels_iterator(), get_hello(), get_keywords_from_tokens(), get_longest_prefix(), get_path_from_GNUNET_PREFIX(), get_path_from_PATH(), get_pipeline(), get_preferences_cb(), getPRK(), GN_getopt_internal(), gns_resolve_name(), GNUNET_ATS_solver_generate_preferences_start(), GNUNET_ATS_TEST_logging_now(), GNUNET_CADET_open_port(), GNUNET_CONTAINER_meta_data_insert(), GNUNET_CONTAINER_multihashmap32_remove(), GNUNET_CONTAINER_multihashmap32_remove_all(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_CONTAINER_multihashmap_remove_all(), GNUNET_CONTAINER_multipeermap_remove(), GNUNET_CONTAINER_multipeermap_remove_all(), GNUNET_CONTAINER_multishortmap_remove(), GNUNET_CONTAINER_multishortmap_remove_all(), GNUNET_CONTAINER_multiuuidmap_remove(), GNUNET_CONTAINER_multiuuidmap_remove_all(), GNUNET_CRYPTO_mpi_print_unsigned(), GNUNET_CRYPTO_paillier_create(), GNUNET_CRYPTO_zero_keys(), GNUNET_DISK_pipe_from_fd(), GNUNET_DNSPARSER_parse(), GNUNET_FS_publish_main_(), GNUNET_FS_publish_make_status_(), GNUNET_MY_exec_prepared(), GNUNET_OS_check_helper_binary(), GNUNET_OS_init(), GNUNET_SCHEDULER_cancel(), GNUNET_SCHEDULER_do_work(), GNUNET_SECRETSHARING_share_read(), GNUNET_SECRETSHARING_share_write(), GNUNET_SERVER_add_handlers(), GNUNET_TRANSPORT_TESTING_connect_check(), GNUNET_TRANSPORT_TESTING_done(), GNUNET_TRANSPORT_TESTING_start_peer(), GSF_cadet_query_cancel(), handle_dns_request(), handle_index_start_failed(), handle_index_start_ok(), handle_ping(), handle_pong(), handle_show_path(), handle_signature_response(), hash_for_index_cb(), ibf_hashcode_from_key(), index_mq_error_handler(), libgnunet_plugin_transport_udp_init(), main(), modify_request(), notify_connect(), notify_disconnect(), oprelease_overlay_configure_topology(), opstart_overlay_configure_topology(), parse_definitions(), parse_pattern(), peer_info_cb(), peerinformation_cb(), process_result(), progress_cb(), progress_proc(), publish_content(), publish_kblocks(), publish_kblocks_cont(), publish_stop_task(), queue_ready_task(), recursive_dns_resolution(), regex_add(), regex_combine(), REGEX_INTERNAL_construct_nfa(), run(), run_process_and_wait(), search_stop_task(), set_feedback_task(), set_pref_task(), set_prop_task(), shutdown_task(), solver_bandwidth_changed_cb(), start_cb(), start_download(), start_publish(), stop_broadcast(), update_ping_data(), and update_pong_data().

◆ sigpipe

struct GNUNET_DISK_PipeHandle* sigpipe
static

Pipe used to communicate child death via signal.

Definition at line 65 of file gnunet-qr.c.