GNUnet  0.20.0
curl_reschedule.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2015, 2016 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  */
25 #include "platform.h"
26 #include <jansson.h>
27 #include "gnunet_curl_lib.h"
28 #include "gnunet_util_lib.h"
29 
30 extern void *
32  CURL *eh,
33  long *response_code);
34 
39 {
44 
49 
54 
59 };
60 
61 
66 {
67  struct GNUNET_CURL_RescheduleContext *rctx;
68 
70  rctx->ctx = ctx;
71  rctx->parser = rp;
72  rctx->cleaner = rc;
73 
74  return rctx;
75 }
76 
77 
83 static void
85 {
86  json_decref (response);
87 }
88 
89 
92 {
94 
96  rc->ctx = ctx;
98  rc->cleaner = &clean_result;
99  return rc;
100 }
101 
102 
103 void
105 {
106  if (NULL != rc->task)
108  GNUNET_free (rc);
109 }
110 
111 
117 static void
118 context_task (void *cls)
119 {
120  struct GNUNET_CURL_RescheduleContext *rc = cls;
121  long timeout;
122  int max_fd;
123  fd_set read_fd_set;
124  fd_set write_fd_set;
125  fd_set except_fd_set;
126  struct GNUNET_NETWORK_FDSet *rs;
127  struct GNUNET_NETWORK_FDSet *ws;
129 
130  rc->task = NULL;
131  GNUNET_CURL_perform2 (rc->ctx, rc->parser, rc->cleaner);
132  max_fd = -1;
133  timeout = -1;
134  FD_ZERO (&read_fd_set);
135  FD_ZERO (&write_fd_set);
136  FD_ZERO (&except_fd_set);
138  &read_fd_set,
139  &write_fd_set,
140  &except_fd_set,
141  &max_fd,
142  &timeout);
143  if (timeout >= 0)
144  delay =
146  timeout);
147  else
151  &read_fd_set,
152  max_fd + 1);
155  &write_fd_set,
156  max_fd + 1);
157  if (NULL == rc->task)
159  delay,
160  rs,
161  ws,
162  &context_task,
163  rc);
166 }
167 
168 
169 void
171 {
172  struct GNUNET_CURL_RescheduleContext *rc = *(void **) cls;
173 
174  if (NULL != rc->task)
177  rc);
178 }
179 
180 
181 /* end of curl_reschedule.c */
void * GNUNET_CURL_download_get_result_(struct GNUNET_CURL_DownloadBuffer *db, CURL *eh, long *response_code)
Definition: curl.c:649
static void clean_result(void *response)
Just a wrapper to avoid casting of function pointers.
static void context_task(void *cls)
Task that runs the context's event loop with the GNUnet scheduler.
static struct GNUNET_TIME_Relative timeout
Desired timeout for the lookup (default is no timeout).
Definition: gnunet-abd.c:61
static struct MHD_Response * response
Our canonical response.
static char * rp
Relying party.
static struct GNUNET_FS_DirectoryBuilder * db
Definition: gnunet-search.c:97
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
library to make it easy to download JSON replies over HTTP
void GNUNET_CURL_gnunet_scheduler_reschedule(void *cls)
Implementation of the GNUNET_CURL_RescheduleCallback for GNUnet's scheduler.
void GNUNET_CURL_get_select_info(struct GNUNET_CURL_Context *ctx, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *except_fd_set, int *max_fd, long *timeout)
Obtain the information for a select() call to wait until GNUNET_CURL_perform() is ready again.
Definition: curl.c:828
void(* GNUNET_CURL_ResponseCleaner)(void *response)
Deallocate the response.
void GNUNET_CURL_perform2(struct GNUNET_CURL_Context *ctx, GNUNET_CURL_RawParser rp, GNUNET_CURL_ResponseCleaner rc)
Run the main event loop for the HTTP interaction.
Definition: curl.c:747
struct GNUNET_CURL_RescheduleContext * GNUNET_CURL_gnunet_rc_create(struct GNUNET_CURL_Context *ctx)
Initialize reschedule context.
struct GNUNET_CURL_RescheduleContext * GNUNET_CURL_gnunet_rc_create_with_parser(struct GNUNET_CURL_Context *ctx, GNUNET_CURL_RawParser rp, GNUNET_CURL_ResponseCleaner rc)
Initialize reschedule context; with custom response parser.
void *(* GNUNET_CURL_RawParser)(struct GNUNET_CURL_DownloadBuffer *db, CURL *eh, long *response_code)
Parses the raw response we got from the Web server.
void GNUNET_CURL_gnunet_rc_destroy(struct GNUNET_CURL_RescheduleContext *rc)
Destroy reschedule context.
@ GNUNET_SCHEDULER_PRIORITY_DEFAULT
Run with the default priority (normal P2P operations).
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_NETWORK_FDSet * GNUNET_NETWORK_fdset_create(void)
Creates an fd set.
Definition: network.c:1171
void GNUNET_NETWORK_fdset_destroy(struct GNUNET_NETWORK_FDSet *fds)
Releases the associated memory of an fd set.
Definition: network.c:1187
void GNUNET_NETWORK_fdset_copy_native(struct GNUNET_NETWORK_FDSet *to, const fd_set *from, int nfds)
Copy a native fd set into the GNUnet representation.
Definition: network.c:1041
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1299
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_select(enum GNUNET_SCHEDULER_Priority prio, struct GNUNET_TIME_Relative delay, const struct GNUNET_NETWORK_FDSet *rs, const struct GNUNET_NETWORK_FDSet *ws, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when any of the specified file descriptor set...
Definition: scheduler.c:1830
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:975
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_TIME_UNIT_MILLISECONDS
One millisecond.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:484
Context.
Definition: curl.c:140
Buffer data structure we use to buffer the HTTP download before giving it to the JSON parser.
Closure for GNUNET_CURL_gnunet_scheduler_reschedule().
struct GNUNET_SCHEDULER_Task * task
Just the task.
GNUNET_CURL_RawParser parser
Parser of the raw response.
struct GNUNET_CURL_Context * ctx
Context we manage.
GNUNET_CURL_ResponseCleaner cleaner
Deallocate the response object.
collection of IO descriptors
Entry in list of pending tasks.
Definition: scheduler.c:136
Time for relative time used by GNUnet, in microseconds.