summaryrefslogtreecommitdiffstats
path: root/g10/packet.h
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2017-03-29 10:02:40 +0200
committerWerner Koch <wk@gnupg.org>2017-03-29 10:06:29 +0200
commit0526c99164d3531b5ec763ffc672407eb24b2296 (patch)
tree0deb94a79a1cb2b916548e5d5cbb58114402dc2e /g10/packet.h
parentgpg: Export ring trust packets in backup mode. (diff)
downloadgnupg2-0526c99164d3531b5ec763ffc672407eb24b2296.tar.xz
gnupg2-0526c99164d3531b5ec763ffc672407eb24b2296.zip
gpg: Change parse_packet to take a context.
* g10/packet.h (struct parse_packet_ctx_s): New. (parse_packet_ctx_t): New type. (init_parse_packet): New macro. * g10/parse-packet.c (parse_packet, dbg_parse_packet): Change to take a parse context. Change all callers to provide a context instead of directly supplying the input stream. (search_packet, dbg_search_packet): Ditto. (copy_all_packets, dbg_copy_all_packets): Init an use a parse context. (copy_some_packets, dbg_copy_some_packets): Ditto. (skip_some_packets, dbg_skip_some_packets): Ditto. -- We will need this change to handle ring packets inside the parser. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'g10/packet.h')
-rw-r--r--g10/packet.h96
1 files changed, 56 insertions, 40 deletions
diff --git a/g10/packet.h b/g10/packet.h
index efccc7659..ffa1fe9d3 100644
--- a/g10/packet.h
+++ b/g10/packet.h
@@ -592,12 +592,26 @@ int list_packets( iobuf_t a );
*/
int set_packet_list_mode( int mode );
+
+/* A context used with parse_packet. */
+struct parse_packet_ctx_s
+{
+ iobuf_t inp; /* The input stream with the packets. */
+};
+typedef struct parse_packet_ctx_s *parse_packet_ctx_t;
+
+#define init_parse_packet(a,i) do { (a)->inp = (i); \
+ /**/ } while (0)
+
+
+
#if DEBUG_PARSE_PACKET
/* There are debug functions and should not be used directly. */
-int dbg_search_packet( iobuf_t inp, PACKET *pkt, off_t *retpos, int with_uid,
+int dbg_search_packet (parse_packet_ctx_t ctx, PACKET *pkt,
+ off_t *retpos, int with_uid,
const char* file, int lineno );
-int dbg_parse_packet( iobuf_t inp, PACKET *ret_pkt,
- const char* file, int lineno );
+int dbg_parse_packet (parse_packet_ctx_t ctx, PACKET *ret_pkt,
+ const char *file, int lineno);
int dbg_copy_all_packets( iobuf_t inp, iobuf_t out,
const char* file, int lineno );
int dbg_copy_some_packets( iobuf_t inp, iobuf_t out, off_t stopoff,
@@ -616,51 +630,53 @@ int dbg_skip_some_packets( iobuf_t inp, unsigned n,
dbg_skip_some_packets((a),(b), __FILE__, __LINE__ )
#else
/* Return the next valid OpenPGP packet in *PKT. (This function will
- skip any packets whose type is 0.)
-
- Returns 0 on success, -1 if EOF is reached, and an error code
- otherwise. In the case of an error, the packet in *PKT may be
- partially constructed. As such, even if there is an error, it is
- necessary to free *PKT to avoid a resource leak. To detect what
- has been allocated, clear *PKT before calling this function. */
-int parse_packet( iobuf_t inp, PACKET *pkt);
+ * skip any packets whose type is 0.) CTX must have been setup prior to
+ * calling this function.
+ *
+ * Returns 0 on success, -1 if EOF is reached, and an error code
+ * otherwise. In the case of an error, the packet in *PKT may be
+ * partially constructed. As such, even if there is an error, it is
+ * necessary to free *PKT to avoid a resource leak. To detect what
+ * has been allocated, clear *PKT before calling this function. */
+int parse_packet (parse_packet_ctx_t ctx, PACKET *pkt);
/* Return the first OpenPGP packet in *PKT that contains a key (either
- a public subkey, a public key, a secret subkey or a secret key) or,
- if WITH_UID is set, a user id.
-
- Saves the position in the pipeline of the start of the returned
- packet (according to iobuf_tell) in RETPOS, if it is not NULL.
-
- The return semantics are the same as parse_packet. */
-int search_packet( iobuf_t inp, PACKET *pkt, off_t *retpos, int with_uid );
+ * a public subkey, a public key, a secret subkey or a secret key) or,
+ * if WITH_UID is set, a user id.
+ *
+ * Saves the position in the pipeline of the start of the returned
+ * packet (according to iobuf_tell) in RETPOS, if it is not NULL.
+ *
+ * The return semantics are the same as parse_packet. */
+int search_packet (parse_packet_ctx_t ctx, PACKET *pkt,
+ off_t *retpos, int with_uid);
/* Copy all packets (except invalid packets, i.e., those with a type
- of 0) from INP to OUT until either an error occurs or EOF is
- reached.
-
- Returns -1 when end of file is reached or an error code, if an
- error occurred. (Note: this function never returns 0, because it
- effectively keeps going until it gets an EOF.) */
-int copy_all_packets( iobuf_t inp, iobuf_t out );
+ * of 0) from INP to OUT until either an error occurs or EOF is
+ * reached.
+ *
+ * Returns -1 when end of file is reached or an error code, if an
+ * error occurred. (Note: this function never returns 0, because it
+ * effectively keeps going until it gets an EOF.) */
+int copy_all_packets (iobuf_t inp, iobuf_t out );
/* Like copy_all_packets, but stops at the first packet that starts at
- or after STOPOFF (as indicated by iobuf_tell).
-
- Example: if STOPOFF is 100, the first packet in INP goes from 0 to
- 110 and the next packet starts at offset 111, then the packet
- starting at offset 0 will be completely processed (even though it
- extends beyond STOPOFF) and the packet starting at offset 111 will
- not be processed at all. */
-int copy_some_packets( iobuf_t inp, iobuf_t out, off_t stopoff );
+ * or after STOPOFF (as indicated by iobuf_tell).
+ *
+ * Example: if STOPOFF is 100, the first packet in INP goes from
+ * 0 to 110 and the next packet starts at offset 111, then the packet
+ * starting at offset 0 will be completely processed (even though it
+ * extends beyond STOPOFF) and the packet starting at offset 111 will
+ * not be processed at all. */
+int copy_some_packets (iobuf_t inp, iobuf_t out, off_t stopoff);
/* Skips the next N packets from INP.
-
- If parsing a packet returns an error code, then the function stops
- immediately and returns the error code. Note: in the case of an
- error, this function does not indicate how many packets were
- successfully processed. */
-int skip_some_packets( iobuf_t inp, unsigned n );
+ *
+ * If parsing a packet returns an error code, then the function stops
+ * immediately and returns the error code. Note: in the case of an
+ * error, this function does not indicate how many packets were
+ * successfully processed. */
+int skip_some_packets (iobuf_t inp, unsigned int n);
#endif
/* Parse a signature packet and store it in *SIG.