17aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley/* mktemp.c - Create a temporary file or directory.
2d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer *
3d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer * Copyright 2012 Elie De Brauwer <eliedebrauwer@gmail.com>
4d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer *
5f91b7c89bc852868692b9518185421ebb52d67b3Rob Landley * http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/mktemp.html
6d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
7ca6a91063d241d48a5c83f9042ed370e3918b639Rob LandleyUSE_MKTEMP(NEWTOY(mktemp, ">1qd(directory)p(tmpdir):", TOYFLAG_BIN))
8d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
9d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwerconfig MKTEMP
107aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  bool "mktemp"
117aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  default y
127aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  help
137aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    usage: mktemp [-dq] [-p DIR] [TEMPLATE]
14d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
156434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    Safely create a new file "DIR/TEMPLATE" and print its name.
16d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
176434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    -d	Create directory instead of file (--directory)
186434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    -p	Put new file in DIR (--tmpdir)
196434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    -q	Quiet, no error messages
206434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley
216434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    Each X in TEMPLATE is replaced with a random printable character. The
226434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    default TEMPLATE is tmp.XXXXXX, and the default DIR is $TMPDIR if set,
236434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    else "/tmp".
24d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer*/
25d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
26c0e56edaf256adb6c60c5a052525a1ffbb927901Rob Landley#define FOR_mktemp
27d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer#include "toys.h"
28d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
29c0e56edaf256adb6c60c5a052525a1ffbb927901Rob LandleyGLOBALS(
306434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley  char *tmpdir;
31d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer)
32b0e87ff287ca6938b9450a61cb6134fba6309b37Rob Landley
33d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwervoid mktemp_main(void)
34d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer{
35831a085a8d36cfb4fa064bdddb6bd0a434d4b3e1Elliot Hughes  int d_flag = toys.optflags & FLAG_d;
36831a085a8d36cfb4fa064bdddb6bd0a434d4b3e1Elliot Hughes  char *template = *toys.optargs;
370f6f98009a7631e613711304f99205de7e19c123Rob Landley
386434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley  if (!template) template = "tmp.XXXXXX";
39d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
40831a085a8d36cfb4fa064bdddb6bd0a434d4b3e1Elliot Hughes  if (!TT.tmpdir) TT.tmpdir = getenv("TMPDIR");
41128928f123d7192d07538d6ea6bbda2b1a75fd5bRob Landley  if (!TT.tmpdir || !*TT.tmpdir) TT.tmpdir = "/tmp";
42831a085a8d36cfb4fa064bdddb6bd0a434d4b3e1Elliot Hughes
4367d9ea5a81c8083875ac7420d7e6a62766b48b6fRob Landley  template = strchr(template, '/') ? xstrdup(template)
4467d9ea5a81c8083875ac7420d7e6a62766b48b6fRob Landley             : xmprintf("%s/%s", TT.tmpdir, template);
45d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer
46b2bb6e65f3461d1dfdcd3614c3c63f7a1453840bRob Landley  if (d_flag ? !mkdtemp(template) : mkstemp(template) == -1) {
476434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    if (toys.optflags & FLAG_q) toys.exitval = 1;
486434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley    else perror_exit("Failed to create %s %s/%s",
496434acef74318e8c3f7e68f4513112b95d2979e8Rob Landley                     d_flag ? "directory" : "file", TT.tmpdir, template);
5067d9ea5a81c8083875ac7420d7e6a62766b48b6fRob Landley  } else xputs(template);
5167d9ea5a81c8083875ac7420d7e6a62766b48b6fRob Landley
5267d9ea5a81c8083875ac7420d7e6a62766b48b6fRob Landley  if (CFG_TOYBOX_FREE) free(template);
53d6f7e788ac34c05f7be31a8eb751b7595d48ec0aElie De Brauwer}
54