X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=fetchmail.h;h=d759d391e6bbd7d4de651e67d2669b2a08e81922;hb=d31db10231e9ed89f64fdf6e0fb7cae182aa377e;hp=a786caf2bb75eb1bc8d6a01f1b060695aaeda0d0;hpb=8e4bfa7520c919ec2a7b00067c3348f0d1c73c8d;p=~andy%2Ffetchmail diff --git a/fetchmail.h b/fetchmail.h index a786caf2..d759d391 100644 --- a/fetchmail.h +++ b/fetchmail.h @@ -44,6 +44,8 @@ struct addrinfo; char *strstr(const char *, const char *); #endif +#include "fm_strl.h" + /* constants designating the various supported protocols */ #define P_AUTO 1 #define P_POP2 2 @@ -187,25 +189,34 @@ struct runctl flag showdots; }; +/** \name idlist */ +/** Dual-use entry of singly-linked list for storing id/status or id/id2 + * pairs. */ struct idlist { - char *id; + char *id; /**< key */ union { struct { int num; - flag mark; /* UID-index information */ -#define UID_UNSEEN 0 /* hasn't been seen */ -#define UID_SEEN 1 /* seen, but not deleted */ -#define UID_DELETED 2 /* this message has been marked deleted */ -#define UID_EXPUNGED 3 /* this message has been expunged */ + flag mark; /**< UID-index information */ } - status; - char *id2; - } val; - struct idlist *next; + status; /**< value for id/status pairs */ + char *id2; /**< value for id/id2 pairs */ + } val; /**< union to store value for key \a id */ + struct idlist *next; /**< pointer to next list element */ +}; + +/** List of possible values for idlist::mark */ +enum { +UID_UNSEEN= 0, /**< id hasn't been seen */ +UID_SEEN= 1, /**< id was seen, but not deleted */ +UID_DELETED= 2, /**< this message has been marked deleted */ +UID_EXPUNGED= 3 /**< this message has been expunged */ }; +/*@}*/ + struct query; @@ -358,6 +369,7 @@ struct query char *sslcert; /* optional SSL certificate file */ char *sslproto; /** force transport protocol (ssl2|ssl3|ssl23|tls1) - if NULL, use ssl23 for SSL and opportunistic tls1 for non-SSL connections. */ + char *sslcertfile; /* Trusted certificate file for checking the server cert */ char *sslcertpath; /* Trusted certificate directory for checking the server cert */ flag sslcertck; /* Strictly check the server cert. */ char *sslcommonname; /* CommonName to expect from server */ @@ -390,11 +402,11 @@ struct query struct query *next; /* next query control block in chain */ }; -struct msgblk /* message header parsed for open_sink() */ +struct msgblk /** message header parsed for open_sink() */ { - char *headers; /* raw message headers */ - struct idlist *recipients; /* addressees */ - char return_path[HOSTLEN + USERNAMELEN + 4]; + char *headers; /**< raw message headers */ + struct idlist *recipients; /**< addressees */ + char return_path[HOSTLEN + USERNAMELEN + 4]; /**< envelope sender */ int msglen; int reallen; }; @@ -412,8 +424,8 @@ struct msgblk /* message header parsed for open_sink() */ #define NUM_ZERO(n) ((n) < 0) #define NUM_SPECIFIED(n) ((n) != 0) -#define MULTIDROP(ctl) (ctl->wildcard || \ - ((ctl)->localnames && (ctl)->localnames->next)) +#define MULTIDROP(ctl) ((ctl)->wildcard || \ + ((ctl)->localnames && (ctl)->localnames->next)) /* * Note: tags are generated with an a%04d format from a 1-origin @@ -464,8 +476,8 @@ extern char *sdps_envto; extern const char *iana_charset; /* IANA assigned charset name */ -/* from ucs/norm_charmap.c */ -const char *norm_charmap(const char *name); +/* from/for ucs/norm_charmap.c */ +#include "ucs/norm_charmap.h" /* prototypes for globally callable functions */ @@ -505,6 +517,16 @@ void resetidletimeout(void); int do_protocol(struct query *, const struct method *); /* transact.c: transaction support */ +/** \ingroup gen_recv_split + * Data structure to cache data between \func gen_recv_split calls, + * must be initialized before use by calling \func gen_recv_split_init. */ +struct RecvSplit +{ + char prefix[100]; /**< prefix to match/repeat when splitting lines */ + int cached; /**< flag to record if we have data cached in \a buf */ + char buf[MSGBUFSIZE]; /**< buffer for cached data */ +}; + void init_transact(const struct method *); int readheaders(int sock, long fetchlen, @@ -518,12 +540,16 @@ void gen_send(int sock, const char *, ... ) __attribute__ ((format (printf, 2, 3))) ; int gen_recv(int sock, char *buf, int size); +void gen_recv_split_init(const char *prefix, struct RecvSplit *rs); +int gen_recv_split(int sock, char *buf, int size, struct RecvSplit *rs); int gen_transact(int sock, const char *, ... ) __attribute__ ((format (printf, 2, 3))) ; #else void gen_send(); int gen_recv(); +void gen_recv_split_init(); +int gen_recv_split(); int gen_transact(); #endif extern struct msgblk msgblk; @@ -581,29 +607,29 @@ char *nxtaddr(const char *); /* uid.c: UID support */ extern int dofastuidl; - -void initialize_saved_lists(struct query *, const char *); -struct idlist *save_str(struct idlist **, const char *, flag); -void free_str_list(struct idlist **); -struct idlist *copy_str_list(struct idlist *idl); -void save_str_pair(struct idlist **, const char *, const char *); -void free_str_pair_list(struct idlist **); -int delete_str(struct idlist **, long); -struct idlist *str_in_list(struct idlist **, const char *, const flag); -int str_nr_in_list(struct idlist **, const char *); -int str_nr_last_in_list(struct idlist **, const char *); -void str_set_mark( struct idlist **, const char *, const flag); -int count_list( struct idlist **idl ); -char *str_from_nr_list( struct idlist **idl, long number ); -char *str_find(struct idlist **, long); -struct idlist *id_find(struct idlist **idl, long); -char *idpair_find(struct idlist **, const char *); -void append_str_list(struct idlist **, struct idlist **); -void expunge_uids(struct query *); -void uid_swap_lists(struct query *); +void initialize_saved_lists(struct query *hostlist, const char *idfile); +void expunge_uids(struct query *ctl); +void uid_swap_lists(struct query *ctl); void uid_discard_new_list(struct query *ctl); void uid_reset_num(struct query *ctl); -void write_saved_lists(struct query *, const char *); +void write_saved_lists(struct query *hostlist, const char *idfile); + +/* idlist.c */ +struct idlist *save_str(struct idlist **idl, const char *str, flag status); +void free_str_list(struct idlist **idl); +void save_str_pair(struct idlist **idl, const char *str1, const char *str2); +struct idlist *str_in_list(struct idlist **idl, const char *str, const flag caseblind); +int str_nr_in_list(struct idlist **idl, const char *str); +int str_nr_last_in_list(struct idlist **idl, const char *str); +void str_set_mark(struct idlist **idl, const char *str, const flag val); +int count_list(struct idlist **idl); +char *str_from_nr_list(struct idlist **idl, long number); +char *str_find(struct idlist **idl, long number); +struct idlist *id_find(struct idlist **idl, long number); +char *idpair_find(struct idlist **idl, const char *id); +int delete_str(struct idlist **idl, long num); +struct idlist *copy_str_list(struct idlist *idl); +void append_str_list(struct idlist **idl, struct idlist **nidl); /* rcfile_y.y */ int prc_parse_file(const char *, const flag); @@ -640,6 +666,7 @@ int doODMR (struct query *); /* authentication functions */ int do_cram_md5(int sock, const char *command, struct query *ctl, const char *strip); int do_rfc1731(int sock, const char *command, const char *truename); +int check_gss_creds(const char *service, const char *hostname); int do_gssauth(int sock, const char *command, const char *service, const char *hostname, const char *username); int do_otp(int sock, const char *command, struct query *ctl); @@ -651,8 +678,8 @@ extern char currentwd[1024], rcfiledir[1024]; struct query *hostalloc(struct query *); int parsecmdline (int, char **, struct runctl *, struct query *); char *prependdir (const char *, const char *); -unsigned char *MD5Digest (unsigned const char *); -void hmac_md5 (const unsigned char *, size_t, const char *, size_t, unsigned char *, size_t); +char *MD5Digest (unsigned const char *); +void hmac_md5 (const unsigned char *, size_t, const unsigned char *, size_t, unsigned char *, size_t); int POP3_auth_rpa(char *, char *, int socket); typedef RETSIGTYPE (*SIGHANDLERTYPE) (int); void deal_with_sigchld(void); @@ -729,16 +756,6 @@ extern const char *program_name; * ;;;;; */ #define POSIX_space "\t\n\v\f\r " -/* strlcpy/strlcat prototypes */ -#ifndef HAVE_STRLCAT -size_t -strlcat(char *dst, const char *src, size_t siz); -#endif -#ifndef HAVE_STRLCPY -size_t -strlcpy(char *dst, const char *src, size_t siz); -#endif - /** Resolve the a TCP service name or a string containing only a decimal * positive integer to a port number. Returns -1 for error. */ int servport(const char *service); @@ -761,6 +778,14 @@ int must_tls(struct query *ctl); /* prototype from rfc822valid.c */ int rfc822_valid_msgid(const unsigned char *); +/* prototype from x509_name_match.c */ +int name_match(const char *p1, const char *p2); + +/* prototype from ntlmsubr.c */ +#ifdef NTLM_ENABLE +int ntlm_helper(int sock, struct query *ctl, const char *protocol); +#endif + /* macro to determine if we want to spam progress to stdout */ #define want_progress() \ ((outlevel >= O_VERBOSE || (outlevel > O_SILENT && run.showdots)) \