/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2005, 2007, 2009, 2010, 2011 Free Software Foundation,
Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Mailutils is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Mailutils. If not, see . */
#ifdef HAVE_CONFIG_H
# include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
char *progname;
void
usage (FILE *fp, int code)
{
fprintf (fp,
"usage: %s [-tmpdir=DIR] [-suffix=SUF] [-dry-run | -unlink] { file | dir }\n",
progname);
exit (code);
}
int
main (int argc, char **argv)
{
struct mu_tempfile_hints hints, *phints;
int flags = 0;
int fd;
int *pfd = &fd;
char *filename;
char **pname = &filename;
char *infile = NULL;
int verify = 0;
int verbose = 0;
int yes = 1;
progname = argv[0];
if (argc == 1)
usage (stdout, 0);
while (--argc)
{
char *arg = *++argv;
if (strncmp (arg, "-tmpdir=", 8) == 0)
{
hints.tmpdir = arg + 8;
flags |= MU_TEMPFILE_TMPDIR;
}
else if (strncmp (arg, "-suffix=", 8) == 0)
{
hints.suffix = arg + 8;
flags |= MU_TEMPFILE_SUFFIX;
}
else if (strcmp (arg, "-dry-run") == 0)
pfd = NULL;
else if (strcmp (arg, "-unlink") == 0)
pname = NULL;
else if (strncmp (arg, "-infile=", 8) == 0)
infile = arg + 8;
else if (strncmp (arg, "-verify", 7) == 0)
verify = 1;
else if (strncmp (arg, "-verbose", 8) == 0)
verbose = 1;
else
break;
}
if (argv[0] == NULL)
usage (stderr, 1);
if (strcmp (argv[0], "file") == 0)
/* nothing */;
else if (strcmp (argv[0], "dir") == 0)
flags |= MU_TEMPFILE_MKDIR;
else
usage (stderr, 1);
if (pname == NULL && pfd == NULL)
{
mu_error ("both -unlink and -dry-run given");
exit (1);
}
if (infile)
{
if (flags & MU_TEMPFILE_MKDIR)
{
mu_error ("-infile is useless with dir");
exit (1);
}
else if (pfd == NULL)
{
mu_error ("-infile is useless with -dry-run");
exit (1);
}
}
if (verify && pfd == NULL)
{
mu_error ("-verify is useless with -dry-run");
exit (1);
}
phints = flags ? &hints : NULL;
MU_ASSERT (mu_tempfile (phints, flags, pfd, pname));
if (filename)
printf ("created file name %s\n", filename);
if (!pfd)
return 0;
if (infile)
{
mu_stream_t in, out;
mu_off_t size;
if (strcmp (infile, "-") == 0)
MU_ASSERT (mu_stdio_stream_create (&in, MU_STDIN_FD, 0));
else
MU_ASSERT (mu_file_stream_create (&in, infile, MU_STREAM_READ));
MU_ASSERT (mu_fd_stream_create (&out, filename, fd, MU_STREAM_WRITE));
mu_stream_ioctl (out, MU_IOCTL_FD, MU_IOCTL_FD_SET_BORROW, &yes);
MU_ASSERT (mu_stream_copy (out, in, 0, &size));
if (verbose)
printf ("copied %lu bytes to the temporary\n", (unsigned long) size);
mu_stream_unref (out);
mu_stream_unref (in);
}
if (verify)
{
mu_stream_t in, out;
mu_off_t size;
MU_ASSERT (mu_stdio_stream_create (&out, MU_STDOUT_FD, 0));
MU_ASSERT (mu_fd_stream_create (&in, filename, fd,
MU_STREAM_READ|MU_STREAM_SEEK));
mu_stream_ioctl (in, MU_IOCTL_FD, MU_IOCTL_FD_SET_BORROW, &yes);
MU_ASSERT (mu_stream_copy (out, in, 0, &size));
if (verbose)
printf ("dumped %lu bytes\n", (unsigned long) size);
mu_stream_unref (out);
mu_stream_unref (in);
}
close (fd);
return 0;
}