aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-insert.c
diff options
context:
space:
mode:
authorGravatar Jani Nikula <jani@nikula.org>2014-09-22 11:54:58 +0200
committerGravatar David Bremner <david@tethera.net>2014-09-24 20:28:42 +0200
commitdcfcb4ba7b9dfdb49ec62d8fb47a72fb60540655 (patch)
tree83abb103b803e6ecfab2bd61064757b6e2190dbd /notmuch-insert.c
parentcd3d4e62d63819bd8eced5e2d8e5b6e07ea45e41 (diff)
cli/insert: abstract temporary filename generation
This will clean up the usage. There's the slight functional change of potentially ending up doing extra gethostname and getpid calls, but this is neglible.
Diffstat (limited to 'notmuch-insert.c')
-rw-r--r--notmuch-insert.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/notmuch-insert.c b/notmuch-insert.c
index cdeeb415..a1d564c7 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -179,6 +179,31 @@ maildir_create_folder (const void *ctx, const char *maildir)
return TRUE;
}
+/*
+ * Generate a temporary file basename, no path, do not create an
+ * actual file. Return the basename, or NULL on errors.
+ */
+static char *
+tempfilename (const void *ctx)
+{
+ char *filename;
+ char hostname[256];
+ struct timeval tv;
+ pid_t pid;
+
+ /* We follow the Dovecot file name generation algorithm. */
+ pid = getpid ();
+ safe_gethostname (hostname, sizeof (hostname));
+ gettimeofday (&tv, NULL);
+
+ filename = talloc_asprintf (ctx, "%ld.M%ldP%d.%s",
+ tv.tv_sec, tv.tv_usec, pid, hostname);
+ if (! filename)
+ fprintf (stderr, "Error: %s\n", strerror (ENOMEM));
+
+ return filename;
+}
+
/* Open a unique file in the 'tmp' sub-directory of dir.
* Returns the file descriptor on success, or -1 on failure.
* On success, file paths for the message in the 'tmp' and 'new'
@@ -188,23 +213,13 @@ static int
maildir_open_tmp_file (void *ctx, const char *dir,
char **tmppath, char **newpath, char **newdir)
{
- pid_t pid;
- char hostname[256];
- struct timeval tv;
char *filename;
int fd = -1;
- /* We follow the Dovecot file name generation algorithm. */
- pid = getpid ();
- safe_gethostname (hostname, sizeof (hostname));
do {
- gettimeofday (&tv, NULL);
- filename = talloc_asprintf (ctx, "%ld.M%ldP%d.%s",
- tv.tv_sec, tv.tv_usec, pid, hostname);
- if (! filename) {
- fprintf (stderr, "Out of memory\n");
+ filename = tempfilename (ctx);
+ if (! filename)
return -1;
- }
*tmppath = talloc_asprintf (ctx, "%s/tmp/%s", dir, filename);
if (! *tmppath) {