return 3;
 }
 
+static int
+do_mkstemp(lua_State *L)
+{
+       char template[PATH_MAX];
+       const char *template_in = luaL_checkstring(L, 1);
+       int fd;
+
+       if (snprintf(template, PATH_MAX, "%s", template_in)
+           >= PATH_MAX) {
+               lua_pushboolean(L, 0);
+               lua_pushstring(L, "template does not fit in PATH_MAX");
+
+               return 2;
+       }
+
+       fd = mkstemp(template);
+       if (fd < 0)  {
+               lua_pushboolean(L, 0);
+               lua_pushstring(L, strerror(errno));
+
+               return 2;
+       }
+
+       lua_pushboolean(L, 1);
+       lua_pushnil(L);
+       lua_pushstring(L, template);
+       lua_pushnumber(L, fd);
+
+       return 4;
+}
+
 /*
  * Hook that gets called once an interrupt has been requested.
  * Calls e2lib.interrupt_hook() to deal with any cleanup that might be required.
        { "kill", do_kill },
        { "mkdir", do_mkdir },
        { "mkdtemp", do_mkdtemp },
+       { "mkstemp", do_mkstemp },
        { "parse_mode", do_parse_mode },
        { "poll", poll_fd },
        { "rmdir", do_rmdir },