From: "Mike Frysinger" <vapier@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/sandbox:master commit in: tests/
Date: Mon, 24 Dec 2012 23:58:19 +0000 (UTC) [thread overview]
Message-ID: <1356392915.5daa8f40978f03ea1ae96f2dff48e7219ad6fff4.vapier@gentoo> (raw)
commit: 5daa8f40978f03ea1ae96f2dff48e7219ad6fff4
Author: Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Dec 24 23:33:33 2012 +0000
Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Dec 24 23:48:35 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/sandbox.git;a=commit;h=5daa8f40
tests: expand usage strings
Makes it easier to quickly figure out how to run a helper test
without having to resort to existing usage or the code itself.
Signed-off-by: Mike Frysinger <vapier <AT> gentoo.org>
---
tests/access-0.c | 8 ++------
tests/faccessat-0.c | 5 ++---
tests/fchmodat-0.c | 2 +-
tests/fchownat-0.c | 2 +-
tests/fopen-0.c | 2 +-
tests/fopen64-0.c | 2 +-
tests/futimesat-0.c | 2 +-
tests/link-0.c | 2 +-
tests/linkat-0.c | 2 +-
tests/lutimes-0.c | 2 +-
tests/mkostemp-0.c | 2 +-
tests/mkostemp64-0.c | 2 +-
tests/mkostemps-0.c | 2 +-
tests/mkostemps64-0.c | 2 +-
tests/open-0.c | 2 +-
tests/open64-0.c | 2 +-
tests/openat-0.c | 2 +-
tests/openat64-0.c | 2 +-
tests/rename-0.c | 2 +-
tests/renameat-0.c | 2 +-
tests/symlink-0.c | 2 +-
tests/symlinkat-0.c | 2 +-
tests/test-skel-0.c | 41 ++++++++++++++++++++++++++++++++++++++++-
tests/truncate-0.c | 2 +-
tests/truncate64-0.c | 2 +-
tests/unlinkat-0.c | 2 +-
tests/utime-0.c | 2 +-
tests/utimensat-0.c | 2 +-
tests/utimes-0.c | 2 +-
29 files changed, 70 insertions(+), 36 deletions(-)
diff --git a/tests/access-0.c b/tests/access-0.c
index 91507e0..fd03177 100644
--- a/tests/access-0.c
+++ b/tests/access-0.c
@@ -3,17 +3,13 @@
#define FUNC_STR "\"%s\", %x"
#define FUNC_IMP file, mode
#define ARG_CNT 2
-#define ARG_USE "<file> <mode>"
+#define ARG_USE "<file> <acc_mode>"
#define process_args() \
s = argv[i++]; \
const char *file = f_get_file(s); \
\
s = argv[i++]; \
- int mode = 0; \
- if (strchr(s, 'r')) mode |= R_OK; \
- if (strchr(s, 'w')) mode |= W_OK; \
- if (strchr(s, 'x')) mode |= X_OK; \
- if (strchr(s, 'f')) mode = F_OK;
+ int mode = access_mode(s);
#include "test-skel-0.c"
diff --git a/tests/faccessat-0.c b/tests/faccessat-0.c
index e348984..98ea2ec 100644
--- a/tests/faccessat-0.c
+++ b/tests/faccessat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %x, %x"
#define FUNC_IMP dirfd, file, mode, flags
#define ARG_CNT 4
-#define ARG_USE "<dirfd> <file> <mode> <flags>"
+#define ARG_USE "<dirfd> <file> <acc_mode> <atflags>"
#define process_args() \
s = argv[i++]; \
@@ -14,8 +14,7 @@
const char *file = f_get_file(s); \
\
s = argv[i++]; \
- int mode = 0; \
- sscanf(s, "%i", &mode); \
+ int mode = access_mode(s); \
\
s = argv[i++]; \
int flags = at_get_flags(s);
diff --git a/tests/fchmodat-0.c b/tests/fchmodat-0.c
index 98ffe66..fe77a35 100644
--- a/tests/fchmodat-0.c
+++ b/tests/fchmodat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %o, %x"
#define FUNC_IMP dirfd, file, mode, flags
#define ARG_CNT 4
-#define ARG_USE "<dirfd> <file> <mode> <flags>"
+#define ARG_USE "<dirfd> <file> <mode> <atflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/fchownat-0.c b/tests/fchownat-0.c
index a168e75..e47d7f3 100644
--- a/tests/fchownat-0.c
+++ b/tests/fchownat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %i, %i, %x"
#define FUNC_IMP dirfd, file, uid, gid, flags
#define ARG_CNT 5
-#define ARG_USE "<dirfd> <file> <uid> <gid> <flags>"
+#define ARG_USE "<dirfd> <file> <uid> <gid> <atflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/fopen-0.c b/tests/fopen-0.c
index abf4965..e8702bf 100644
--- a/tests/fopen-0.c
+++ b/tests/fopen-0.c
@@ -3,7 +3,7 @@
#define FUNC_STR "\"%s\", \"%s\""
#define FUNC_IMP file, mode
#define ARG_CNT 2
-#define ARG_USE "<file> <mode>"
+#define ARG_USE "<file> <strmode>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/fopen64-0.c b/tests/fopen64-0.c
index e7aa673..78c0fa7 100644
--- a/tests/fopen64-0.c
+++ b/tests/fopen64-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", \"%s\""
#define FUNC_IMP file, mode
#define ARG_CNT 2
-#define ARG_USE "<file> <mode>"
+#define ARG_USE "<file> <strmode>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/futimesat-0.c b/tests/futimesat-0.c
index f710e8f..6d2ae43 100644
--- a/tests/futimesat-0.c
+++ b/tests/futimesat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %p"
#define FUNC_IMP dirfd, file, times
#define ARG_CNT 3
-#define ARG_USE "<dirfd> <file> <times:=NULL>"
+#define ARG_USE "<dirfd> <file> <times>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/link-0.c b/tests/link-0.c
index f5e4f88..2c7b66c 100644
--- a/tests/link-0.c
+++ b/tests/link-0.c
@@ -3,7 +3,7 @@
#define FUNC_STR "\"%s\", \"%s\""
#define FUNC_IMP oldpath, newpath
#define ARG_CNT 2
-#define ARG_USE "<oldpath> <newpath>"
+#define ARG_USE "<path>(old) <path>(new)"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/linkat-0.c b/tests/linkat-0.c
index 8c1af52..0f729bb 100644
--- a/tests/linkat-0.c
+++ b/tests/linkat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %i, \"%s\", %x"
#define FUNC_IMP olddirfd, oldpath, newdirfd, newpath, flags
#define ARG_CNT 5
-#define ARG_USE "<olddirfd> <oldpath> <newdirfd> <newpath> <flags>"
+#define ARG_USE "<dirfd>(old) <path>(old) <dirfd>(new) <path>(new) <atflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/lutimes-0.c b/tests/lutimes-0.c
index 6b7c2e3..1037438 100644
--- a/tests/lutimes-0.c
+++ b/tests/lutimes-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %p"
#define FUNC_IMP file, times
#define ARG_CNT 2
-#define ARG_USE "<file> <times:=NULL>"
+#define ARG_USE "<file> <times>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/mkostemp-0.c b/tests/mkostemp-0.c
index 7445126..65cf8c2 100644
--- a/tests/mkostemp-0.c
+++ b/tests/mkostemp-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %#x"
#define FUNC_IMP template, flags
#define ARG_CNT 2
-#define ARG_USE "<template> <flags>"
+#define ARG_USE "<template> <fflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/mkostemp64-0.c b/tests/mkostemp64-0.c
index 6b25c29..54e5a5b 100644
--- a/tests/mkostemp64-0.c
+++ b/tests/mkostemp64-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %#x"
#define FUNC_IMP template, flags
#define ARG_CNT 2
-#define ARG_USE "<template> <flags>"
+#define ARG_USE "<template> <fflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/mkostemps-0.c b/tests/mkostemps-0.c
index 62857b8..739a491 100644
--- a/tests/mkostemps-0.c
+++ b/tests/mkostemps-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %i, %#x"
#define FUNC_IMP template, suffixlen, flags
#define ARG_CNT 3
-#define ARG_USE "<template> <suffixlen> <flags>"
+#define ARG_USE "<template> <suffixlen> <fflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/mkostemps64-0.c b/tests/mkostemps64-0.c
index 146da61..9f2e5d8 100644
--- a/tests/mkostemps64-0.c
+++ b/tests/mkostemps64-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %i, %#x"
#define FUNC_IMP template, suffixlen, flags
#define ARG_CNT 3
-#define ARG_USE "<template> <suffixlen> <flags>"
+#define ARG_USE "<template> <suffixlen> <fflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/open-0.c b/tests/open-0.c
index dfae46d..7c84e51 100644
--- a/tests/open-0.c
+++ b/tests/open-0.c
@@ -3,7 +3,7 @@
#define FUNC_STR "\"%s\", %#x, %o"
#define FUNC_IMP file, flags, mode
#define ARG_CNT 3
-#define ARG_USE "<file> <flags> <mode>"
+#define ARG_USE "<file> <fflags> <mode>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/open64-0.c b/tests/open64-0.c
index 76d2686..5000ddb 100644
--- a/tests/open64-0.c
+++ b/tests/open64-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %o"
#define FUNC_IMP file, flags
#define ARG_CNT 2
-#define ARG_USE "<file> <flags>"
+#define ARG_USE "<file> <fflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/openat-0.c b/tests/openat-0.c
index 7978e11..24f230b 100644
--- a/tests/openat-0.c
+++ b/tests/openat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %#x, %o"
#define FUNC_IMP dirfd, file, flags, mode
#define ARG_CNT 4
-#define ARG_USE "<dirfd> <file> <flags> <mode>"
+#define ARG_USE "<dirfd> <file> <fflags> <mode>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/openat64-0.c b/tests/openat64-0.c
index 9c707f6..9686bc9 100644
--- a/tests/openat64-0.c
+++ b/tests/openat64-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %#x, %o"
#define FUNC_IMP dirfd, file, flags, mode
#define ARG_CNT 4
-#define ARG_USE "<dirfd> <file> <flags> <mode>"
+#define ARG_USE "<dirfd> <file> <fflags> <mode>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/rename-0.c b/tests/rename-0.c
index aa50f37..28fbdc9 100644
--- a/tests/rename-0.c
+++ b/tests/rename-0.c
@@ -3,7 +3,7 @@
#define FUNC_STR "\"%s\", \"%s\""
#define FUNC_IMP oldpath, newpath
#define ARG_CNT 2
-#define ARG_USE "<oldpath> <newpath>"
+#define ARG_USE "<path>(old) <path>(new)"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/renameat-0.c b/tests/renameat-0.c
index fcb5c88..1c1cd59 100644
--- a/tests/renameat-0.c
+++ b/tests/renameat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %i, \"%s\""
#define FUNC_IMP olddirfd, oldpath, newdirfd, newpath
#define ARG_CNT 4
-#define ARG_USE "<olddirfd> <oldpath> <newdirfd> <newpath>"
+#define ARG_USE "<dirfd>(old) <path>(old) <dirfd>(new) <path>(new)"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/symlink-0.c b/tests/symlink-0.c
index 6ddfd0c..70f52e3 100644
--- a/tests/symlink-0.c
+++ b/tests/symlink-0.c
@@ -3,7 +3,7 @@
#define FUNC_STR "\"%s\", \"%s\""
#define FUNC_IMP oldpath, newpath
#define ARG_CNT 2
-#define ARG_USE "<oldpath> <newpath>"
+#define ARG_USE "<path>(old) <path>(new)"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/symlinkat-0.c b/tests/symlinkat-0.c
index f668829..1e52c60 100644
--- a/tests/symlinkat-0.c
+++ b/tests/symlinkat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %i, \"%s\""
#define FUNC_IMP oldpath, newdirfd, newpath
#define ARG_CNT 3
-#define ARG_USE "<oldpath> <newdirfd> <newpath>"
+#define ARG_USE "<path>(old) <dirfd>(new) <path>(new)"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/test-skel-0.c b/tests/test-skel-0.c
index 3476552..dbe60db 100644
--- a/tests/test-skel-0.c
+++ b/tests/test-skel-0.c
@@ -9,6 +9,9 @@ const char *color_red = "\033[31;01m";
# define CONFIG 1
#endif
+#define V_TIMESPEC "NULL"
+#define V_STRMODE "<r|w|a>[+bcemx] (see `man 3 fopen`)"
+
static bool _strtoul(const char *sul, unsigned long *ul)
{
char *e;
@@ -34,6 +37,7 @@ static int _get_flags(const char *str_flags, const value_pair flags[])
return ret;
}
+#define V_FFLAGS "O_XXX flags (see `man 2 open`)"
int f_get_flags(const char *str_flags)
{
const value_pair flags[] = {
@@ -54,6 +58,7 @@ int f_get_flags(const char *str_flags)
return _get_flags(str_flags, flags);
}
+#define V_FILE "NULL | path"
const char *f_get_file(const char *str_file)
{
if (!strcmp(str_file, "NULL"))
@@ -62,6 +67,7 @@ const char *f_get_file(const char *str_file)
return str_file;
}
+#define V_ATFLAGS "0 | AT_SYMLINK_NOFOLLOW | AT_REMOVEDIR | AT_SYMLINK_FOLLOW | AT_EACCESS"
int at_get_flags(const char *str_flags)
{
const value_pair flags[] = {
@@ -74,6 +80,7 @@ int at_get_flags(const char *str_flags)
return _get_flags(str_flags, flags);
}
+#define V_MODE_T "0x# (for hex) | 0# (for octal) | # (for decimal)"
mode_t sscanf_mode_t(const char *str_mode)
{
/* some systems (like Linux) have a 32bit mode_t. Others
@@ -88,6 +95,7 @@ mode_t sscanf_mode_t(const char *str_mode)
return (mode_t)mode;
}
+#define V_DEV_T V_MODE_T
dev_t sscanf_dev_t(const char *str_dev)
{
/* Similar issue with dev_t as mode_t. Can't assume that
@@ -98,6 +106,7 @@ dev_t sscanf_dev_t(const char *str_dev)
return (dev_t)dev;
}
+#define V_DIRFD "AT_FDCWD | fd # | path[:<flags>[:<mode>]]"
int at_get_fd(const char *str_dirfd)
{
/* work some magic ... expected format:
@@ -123,16 +132,46 @@ int at_get_fd(const char *str_dirfd)
return open(str_path, f_get_flags(str_flags), sscanf_mode_t(str_mode));
}
+#define V_ACCESS_MODE "r | w | x | f"
+int access_mode(const char *s)
+{
+ int ret = 0;
+ if (strchr(s, 'r')) ret |= R_OK;
+ if (strchr(s, 'w')) ret |= W_OK;
+ if (strchr(s, 'x')) ret |= X_OK;
+ if (strchr(s, 'f')) ret = F_OK;
+ return ret;
+}
+
int main(int argc, char *argv[])
{
#if CONFIG
int i, test_ret;
if ((argc - 1) % (ARG_CNT + 1) || argc == 1) {
+#define _ARG_USE "<ret> " ARG_USE
printf(
"usage: " SFUNC " <tests>\n"
- "test: < <ret> " ARG_USE " >\n"
+ "test: < " _ARG_USE " >\n"
+ "\n"
);
+ const char *vusage[] = {
+ "<ret>", "#[,<errno>]; # is a decimal and errno can be symbolic",
+ "<dirfd>", V_DIRFD,
+ "<file>", V_FILE,
+ "<times>", V_TIMESPEC,
+ "<atflags>", V_ATFLAGS,
+ "<fflags>", V_FFLAGS,
+ "<mode>", V_MODE_T,
+ "<strmode>", V_STRMODE,
+ "<acc_mode>", V_ACCESS_MODE,
+ "<dev>", V_DEV_T,
+ "<uid>", "# (decimal)",
+ "<gid>", "# (decimal)",
+ };
+ for (i = 0; i < ARRAY_SIZE(vusage); i += 2)
+ if (strstr(_ARG_USE, vusage[i]))
+ printf("%-10s := %s\n", vusage[i], vusage[i + 1]);
exit(1);
}
diff --git a/tests/truncate-0.c b/tests/truncate-0.c
index 43810a8..c510e5c 100644
--- a/tests/truncate-0.c
+++ b/tests/truncate-0.c
@@ -3,7 +3,7 @@
#define FUNC_STR "\"%s\", %llu"
#define FUNC_IMP path, (unsigned long long)length
#define ARG_CNT 2
-#define ARG_USE "<oldpath> <newpath>"
+#define ARG_USE "<path> <length>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/truncate64-0.c b/tests/truncate64-0.c
index 2e28332..6e1a15f 100644
--- a/tests/truncate64-0.c
+++ b/tests/truncate64-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %llu"
#define FUNC_IMP path, (unsigned long long)length
#define ARG_CNT 2
-#define ARG_USE "<oldpath> <newpath>"
+#define ARG_USE "<path> <length>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/unlinkat-0.c b/tests/unlinkat-0.c
index 3653965..6bf8bd6 100644
--- a/tests/unlinkat-0.c
+++ b/tests/unlinkat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %x"
#define FUNC_IMP dirfd, path, flags
#define ARG_CNT 3
-#define ARG_USE "<dirfd> <path> <flags>"
+#define ARG_USE "<dirfd> <path> <atflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/utime-0.c b/tests/utime-0.c
index 865163e..a532693 100644
--- a/tests/utime-0.c
+++ b/tests/utime-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %p"
#define FUNC_IMP file, times
#define ARG_CNT 2
-#define ARG_USE "<file> <times:=NULL>"
+#define ARG_USE "<file> <times>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/utimensat-0.c b/tests/utimensat-0.c
index da1847d..431d179 100644
--- a/tests/utimensat-0.c
+++ b/tests/utimensat-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "%i, \"%s\", %p, %x"
#define FUNC_IMP dirfd, file, times, flags
#define ARG_CNT 4
-#define ARG_USE "<dirfd> <file> <times:=NULL> <flags>"
+#define ARG_USE "<dirfd> <file> <times> <atflags>"
#define process_args() \
s = argv[i++]; \
diff --git a/tests/utimes-0.c b/tests/utimes-0.c
index 62c8e93..366d44a 100644
--- a/tests/utimes-0.c
+++ b/tests/utimes-0.c
@@ -4,7 +4,7 @@
#define FUNC_STR "\"%s\", %p"
#define FUNC_IMP file, times
#define ARG_CNT 2
-#define ARG_USE "<file> <times:=NULL>"
+#define ARG_USE "<file> <times>"
#define process_args() \
s = argv[i++]; \
next reply other threads:[~2012-12-24 23:58 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-24 23:58 Mike Frysinger [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-11-11 22:47 [gentoo-commits] proj/sandbox:master commit in: tests/ Sam James
2023-07-01 23:52 Mike Gilbert
2023-06-22 13:54 Mike Gilbert
2023-06-22 13:54 Mike Gilbert
2021-11-03 19:13 Mike Frysinger
2021-10-24 0:54 Mike Frysinger
2021-10-23 22:19 Mike Frysinger
2021-10-22 7:21 Michał Górny
2021-10-22 4:54 Mike Frysinger
2021-10-22 4:15 Mike Frysinger
2021-10-21 2:48 Mike Frysinger
2021-10-18 5:21 Mike Frysinger
2020-05-31 10:52 Michał Górny
2019-06-27 21:41 Sergei Trofimovich
2018-02-19 5:50 Michał Górny
2016-03-29 12:24 Mike Frysinger
2016-03-29 12:24 Mike Frysinger
2015-12-20 21:33 Mike Frysinger
2015-09-28 20:17 Mike Frysinger
2015-09-27 6:13 Mike Frysinger
2015-09-11 7:53 Mike Frysinger
2015-09-11 7:53 Mike Frysinger
2012-11-26 10:10 Mike Frysinger
2012-06-24 6:14 Mike Frysinger
2012-06-23 21:27 Mike Frysinger
2012-03-06 19:00 Mike Frysinger
2012-03-05 7:01 Mike Frysinger
2012-03-05 7:01 Mike Frysinger
2011-07-08 19:53 Mike Frysinger
2011-07-04 23:06 Mike Frysinger
2011-07-04 23:06 Mike Frysinger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1356392915.5daa8f40978f03ea1ae96f2dff48e7219ad6fff4.vapier@gentoo \
--to=vapier@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox