diff options
author | Jani Nikula <jani@nikula.org> | 2014-09-22 11:54:58 +0200 |
---|---|---|
committer | David Bremner <david@tethera.net> | 2014-09-24 20:28:42 +0200 |
commit | dcfcb4ba7b9dfdb49ec62d8fb47a72fb60540655 (patch) | |
tree | 83abb103b803e6ecfab2bd61064757b6e2190dbd | |
parent | cd3d4e62d63819bd8eced5e2d8e5b6e07ea45e41 (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.
-rw-r--r-- | notmuch-insert.c | 39 |
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) { |