Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How portable is mktemp(1)?

As the title suggests — can I be reasonably sure that mktemp will exist on any unix-y operating system I'm likely to encounter?

like image 523
David Wolever Avatar asked May 08 '10 02:05

David Wolever


4 Answers

POSIX does not seem to specify mktemp(1).

It looks like most modern systems have it, but the available functionality and the semantics of the options vary between implementations (so particular invocations may not be portable):

  • mktemp(1) from OpenBSD — mktemp(1) originated in OpenBSD 2.1
  • mktemp(1) from FreeBSD
  • mktemp(1) from Mac OS X — almost always the same as from FreeBSD
  • mktemp(1) from Todd C. Miller of sudo fame
  • mktemp(1) from Solaris
  • mktemp(1) from GNU coreutils
  • mktemp(1) from HP/UX — this one seems particularly divergent from most of the others listed here

So if you want a portable solution you may need to stick to functionality and options that mean the same thing on all of your platforms of interest.

like image 102
Chris Johnsen Avatar answered Nov 07 '22 10:11

Chris Johnsen


A mktemp function (AKA mktemp(3)) first appeared in Unix V7 so it's likely to be everywhere. However, a mktemp command (aka mktemp(1)) first appeared, I believe, on OpenBSD 2.1, so if you have to deal with truly antediluvian Unix systems you might have to worry -- unless you can distribute the very portable mktemp.org version (to fix the potential lack of this utility on some customer's antediluvian system). How likely you are to encounter antediluvian system is nigh impossible for us to guess, of course -- e.g., in HP-UX, mktemp(1) has been around for at least 8 years (even most enterprises probably have updated their Unix OS's within that time frame), in Xenix I believe it appeared in 3.0 (in 1992), etc, etc.

like image 39
Alex Martelli Avatar answered Nov 07 '22 12:11

Alex Martelli


FYI, mktemp appears to NOT be included with Solaris 9 (released 2002/2003) - just ran across this today:

$ uname -a
SunOS dcmnapp02 5.9 Generic_122300-47 sun4u sparc SUNW,Sun-Fire-V440
$ mktemp
bash: mktemp: command not found
$ man mktemp
bash-2.05$ man mktemp
Reformatting page.  Please Wait... done

Standard C Library Functions                           mktemp(3C)

NAME
     mktemp - make a unique file name

SYNOPSIS
     #include 

     char *mktemp(char *template);
like image 5
MykennaC Avatar answered Nov 07 '22 12:11

MykennaC


On Solaris 9 it's in package SMCmktemp, see http://sunfreeware.com/indexsparc9.html:

uname -s
SunOS
uname -r
5.9
/usr/sbin/pkgchk -l -p /usr/local/bin/mktemp
Pathname: /usr/local/bin/mktemp
Type: regular file
Expected mode: 0555
Expected owner: bin
Expected group: bin
Expected file size (bytes): 8884
Expected sum(1) of contents: 6493
Expected last modification: Nov 05 08:48:17 2002
Referenced by the following packages:
SMCmktemp
Current status: installed

like image 2
martyw Avatar answered Nov 07 '22 10:11

martyw