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.
This commit is contained in:
Jani Nikula 2014-09-22 11:54:58 +02:00 committed by David Bremner
parent cd3d4e62d6
commit dcfcb4ba7b

View file

@ -179,6 +179,31 @@ maildir_create_folder (const void *ctx, const char *maildir)
return TRUE; 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. /* Open a unique file in the 'tmp' sub-directory of dir.
* Returns the file descriptor on success, or -1 on failure. * Returns the file descriptor on success, or -1 on failure.
* On success, file paths for the message in the 'tmp' and 'new' * 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, maildir_open_tmp_file (void *ctx, const char *dir,
char **tmppath, char **newpath, char **newdir) char **tmppath, char **newpath, char **newdir)
{ {
pid_t pid;
char hostname[256];
struct timeval tv;
char *filename; char *filename;
int fd = -1; int fd = -1;
/* We follow the Dovecot file name generation algorithm. */
pid = getpid ();
safe_gethostname (hostname, sizeof (hostname));
do { do {
gettimeofday (&tv, NULL); filename = tempfilename (ctx);
filename = talloc_asprintf (ctx, "%ld.M%ldP%d.%s", if (! filename)
tv.tv_sec, tv.tv_usec, pid, hostname);
if (! filename) {
fprintf (stderr, "Out of memory\n");
return -1; return -1;
}
*tmppath = talloc_asprintf (ctx, "%s/tmp/%s", dir, filename); *tmppath = talloc_asprintf (ctx, "%s/tmp/%s", dir, filename);
if (! *tmppath) { if (! *tmppath) {