1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4 
5 #include <unistd.h>
6 
7 MODULE = OpenBSD::MkTemp		PACKAGE = OpenBSD::MkTemp
8 
9 
10 # $tmpdir = mkdtemp( "/tmp/tmpdirXXXXXXXXXX" );
11 char *
12 mkdtemp(SV *template)
13 	PREINIT:
14 		char *path;
15 	CODE:
16 		if (SvTAINTED(template))
17 			croak("tainted template");
18 		path = savesvpv(template);
19 		RETVAL = mkdtemp(path);
20 		if (RETVAL == NULL)
21 			Safefree(path);
22 	OUTPUT:
23 		RETVAL
24 
25 
26 # $fh = mkstemps_real( $template, suffixlen )
27 void
28 mkstemps_real(SV *template, int suffixlen)
29 	PREINIT:
30 		int fd;
31 	PPCODE:
32 		if (suffixlen < 0)
33 			croak("invalid suffixlen");
34 		if (SvTAINTED(template))
35 			croak("tainted template");
36 		/* detect read-only SVs */
37 		sv_catpv(template, "");
38 		fd = mkstemps(SvPV_nolen(template), suffixlen);
39 		SvSETMAGIC(template);
40 		if (fd != -1) {
41 			GV *gv = newGVgen("OpenBSD::MkTemp");
42 			PerlIO *io = PerlIO_fdopen(fd, "w+");
43 			if (do_open(gv, "+<&", 3, FALSE, 0, 0, io)) {
44 				mXPUSHs(sv_bless(newRV((SV*)gv),
45 				    gv_stashpv("OpenBSD::MkTemp",1)));
46 				SvREFCNT_dec(gv);
47 			}
48 		}
49 
50