From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id 0EcZAeSDBGAwaQAA0tVLHw (envelope-from ) for ; Sun, 17 Jan 2021 18:37:24 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id cOOCOOODBGDASQAA1q6Kng (envelope-from ) for ; Sun, 17 Jan 2021 18:37:23 +0000 Received: from mail.notmuchmail.org (nmbug.tethera.net [144.217.243.247]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (2048 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 20CA59402C8 for ; Sun, 17 Jan 2021 18:37:23 +0000 (UTC) Received: from nmbug.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id 7030929D1B; Sun, 17 Jan 2021 13:37:16 -0500 (EST) Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by mail.notmuchmail.org (Postfix) with ESMTPS id C1E4D1FF9D for ; Sun, 17 Jan 2021 13:37:13 -0500 (EST) Received: by mail-wm1-x334.google.com with SMTP id i63so11668064wma.4 for ; Sun, 17 Jan 2021 10:37:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dme-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zw3ljSINhLiwqqDwhyNVXbIgS3KCyi1M5bFxXcPjl6Q=; b=1uO7vDBnblUmMnh2BHx7JfcofUNsr0Sw8Eqxn2rsQKKT7Im8l4nFA4UEMwD4ojWmod lKwQtSbnII4GgsNrgsnGkLxoOjsIDgq/V8n/ekFDVSd92fgqVlUAmoCSvNiqkNKQn+Vr lG+TispcCggIrZFhF+e+VOfKiN11GWhFqYgCgDkK9CaYpUimphXQSFMVnYl2ChzwBtSE Uwt8lsN1tPT1VdzAaPA52JvAl205JywhLIf5k4OfJQ/JUc1bhQSYnPJGKjFEIGGXyIBn ewocRCpBGBlcHqbYs6YyniPhBfldwjO4dKR3Nn280uXqRSX1K8N42pYGR47F+Erjl+SB ZSfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zw3ljSINhLiwqqDwhyNVXbIgS3KCyi1M5bFxXcPjl6Q=; b=jIbe9cPO+0J6frmmqX0JGks/4nu+oWmMS5EM9/nTfPHKQ/WKmYqpFDipXxMSj9m4J1 YUhgnQCqkpFfll0yZc/VYZ3gMea6v48aqH/oMQPxqMlmVynF27LGX1MhZlU669j2Bqvy 1pOxU/INiveFcz0b9CNYVif3RDwymodRnsNwL7cb5r7C+Yo9YgkAUr3Ob0tN/M2+AsL8 LURzxKF2utwmZoqwEZB7wdI9SRZcKyiPC4CwoosZs30k5NULDoHH0lQiZ3iCHL5HMJPv 7PM+7QX34XOh53Il/yTDsKgOIlUEwocNZdXvGVujTt/5MFpu1CXhjPy1iclRQzJHa4yk SZCA== X-Gm-Message-State: AOAM532MfBzU/bcfa/BHFakTm3BpW/ZB52Y3pAdxZ/tcSwJuzTG9nAPY WKLnqKOB3lAtY6bLJw23m8yk8Q== X-Google-Smtp-Source: ABdhPJySvDcgUb28gqkLWu1lW2eEDXscUQjqXOIcJ9TPdE3KZ2/JJT025uhTONO/Zda9dGCzVXXU2g== X-Received: by 2002:a1c:1f83:: with SMTP id f125mr5523997wmf.82.1610908631700; Sun, 17 Jan 2021 10:37:11 -0800 (PST) Received: from disaster-area.hh.sledj.net (disaster-area.hh.sledj.net. [2001:8b0:bb71:7140:64::1]) by smtp.gmail.com with ESMTPSA id s13sm21026299wmj.28.2021.01.17.10.37.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 Jan 2021 10:37:11 -0800 (PST) Received: from localhost (disaster-area.hh.sledj.net [local]) by disaster-area.hh.sledj.net (OpenSMTPD) with ESMTPA id 320fda8e; Sun, 17 Jan 2021 18:37:10 +0000 (UTC) From: David Edmondson To: notmuch@notmuchmail.org Subject: [RFC PATCH] show: Add support for -format=raw -body=false Date: Sun, 17 Jan 2021 18:37:10 +0000 Message-Id: <20210117183710.29850-1-dme@dme.org> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Message-ID-Hash: OXGXEOGNFVUDWZXZWEZNM4ITCON4Q3SO X-Message-ID-Hash: OXGXEOGNFVUDWZXZWEZNM4ITCON4Q3SO X-MailFrom: dme@dme.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-notmuch.notmuchmail.org-0 CC: David Edmondson X-Mailman-Version: 3.2.1 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: -0.08 Authentication-Results: aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=dme-org.20150623.gappssmtp.com header.s=20150623 header.b=1uO7vDBn; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 144.217.243.247 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Queue-Id: 20CA59402C8 X-Spam-Score: -0.08 X-Migadu-Scanner: scn0.migadu.com X-TUID: /Eqwg7BHx+ul Similar to other formats, allow the body to be omitted when outputting raw messages. This can be used by UI code to get the full headers of a message without the need to consume the body, which may be large. --- notmuch-show.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/notmuch-show.c b/notmuch-show.c index dd836add..f52e6a40 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -888,6 +888,8 @@ format_part_raw (unused (const void *ctx), unused (sprinter_t *sp), ssize_t ssize; char buf[4096]; notmuch_status_t ret = NOTMUCH_STATUS_FILE_ERROR; + unsigned int cr_count = 0; + notmuch_bool_t done = false; filename = notmuch_message_get_filename (node->envelope_file); if (filename == NULL) { @@ -901,13 +903,32 @@ format_part_raw (unused (const void *ctx), unused (sprinter_t *sp), goto DONE; } - while (! g_mime_stream_eos (stream)) { + while (! done && ! g_mime_stream_eos (stream)) { ssize = g_mime_stream_read (stream, buf, sizeof (buf)); if (ssize < 0) { fprintf (stderr, "Error: Read failed from %s\n", filename); goto DONE; } + if (! params->output_body) { + /* + * Look for two adjacent newlines, as they mark the + * separation of the headers from the body. + */ + for (ssize_t off = 0; off < ssize; off++) { + if (buf[off] == '\n') { + cr_count++; + } else { + cr_count = 0; + } + if (cr_count == 2) { + ssize = off; + done = true; + break; + } + } + } + if (ssize > 0 && fwrite (buf, ssize, 1, stdout) != 1) { fprintf (stderr, "Error: Write %ld chars to stdout failed\n", ssize); goto DONE; @@ -1310,9 +1331,10 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[]) } else { if (format != NOTMUCH_FORMAT_TEXT && format != NOTMUCH_FORMAT_JSON && - format != NOTMUCH_FORMAT_SEXP) + format != NOTMUCH_FORMAT_SEXP && + format != NOTMUCH_FORMAT_RAW) fprintf (stderr, - "Warning: --body=false only implemented for format=text, format=json and format=sexp\n"); + "Warning: --body=false is not implemented for format=mbox\n"); } } -- 2.20.1