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