static const char * imap_id_reply_generate_from_imap_args(const struct imap_arg *args) { string_t *str; const char *key, *value; if (IMAP_ARG_IS_EOL(args)) return "NIL"; str = t_str_new(256); str_append_c(str, '('); for (; !IMAP_ARG_IS_EOL(args); args++) { if (!imap_arg_get_astring(args, &key)) { /* broken input */ if (IMAP_ARG_IS_EOL(&args[1])) break; args++; } else { /* key */ if (str_len(str) > 1) str_append_c(str, ' '); imap_append_quoted(str, key); str_append_c(str, ' '); /* value */ if (IMAP_ARG_IS_EOL(&args[1])) { str_append(str, "NIL"); break; } args++; if (!imap_arg_get_astring(args, &value)) value = NULL; else { if (strcmp(value, "*") == 0) value = imap_id_get_default(key); } imap_append_nstring(str, value); } } if (str_len(str) == 1) { /* broken */ return "NIL"; } str_append_c(str, ')'); return str_c(str); }
static void proxy_write_id(struct imap_client *client, string_t *str) { i_assert(client->common.proxy_ttl > 1); str_append(str, "I ID ("); if (client->common.client_id != NULL && str_len(client->common.client_id) > 0) { str_append_str(str, client->common.client_id); str_append_c(str, ' '); } str_printfa(str, "\"x-session-id\" \"%s\" " "\"x-originating-ip\" \"%s\" " "\"x-originating-port\" \"%u\" " "\"x-connected-ip\" \"%s\" " "\"x-connected-port\" \"%u\" " "\"x-proxy-ttl\" \"%u\"", client_get_session_id(&client->common), net_ip2addr(&client->common.ip), client->common.remote_port, net_ip2addr(&client->common.local_ip), client->common.local_port, client->common.proxy_ttl - 1); /* append any forward_ variables to request */ for(const char *const *ptr = client->common.auth_passdb_args; *ptr != NULL; ptr++) { if (strncasecmp(*ptr, "forward_", 8) == 0) { const char *key = t_strconcat("x-forward-", t_strcut((*ptr)+8, '='), NULL); const char *val = i_strchr_to_next(*ptr, '='); str_append_c(str, ' '); imap_append_string(str, key); str_append_c(str, ' '); imap_append_nstring(str, val); } } str_append(str, ")\r\n"); }
void imap_append_string(string_t *dest, const char *src) { i_assert(src != NULL); imap_append_nstring(dest, src); }