mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 20:08:10 +01:00
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:
parent
cd3d4e62d6
commit
dcfcb4ba7b
1 changed files with 27 additions and 12 deletions
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue