[erlang-questions] file:open with O_EXCL mode

Michael Santos <>
Wed Jan 20 21:40:04 CET 2010


On Wed, Jan 20, 2010 at 04:53:04PM +0300, Dmitry Belayev wrote:
> Yes, I know about directories. But I have to create new files in one  
> directory without any subdirectories.
>
> I've looked through mailing list archive and found out that people meet  
> this problem once a year since 2004 year.
> And nothing changed since then.

Yeah, it's sort of a wtf moment, but I wonder if O_EXCL was even supported
on whatever Linux versions were commonly used in 2004 (manpage says 2.6+).

Are you allowed to use C? A linked in driver or an NIF might be an
option then. Something like (untested):

    static ERL_NIF_TERM
nif_tmpfile(ErlNifEnv *env, ERL_NIF_TERM _path)
{
    char path[MAXPATHLEN];
    int fd = -1;

    (void)memset(&path, '\0', sizeof(path));

    if (!my_enif_get_string(env, _path, path, sizeof(path)))
        return enif_make_badarg(env);

    errno = 0;
    if ( (fd = open(path, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR)) == -1)
        return enif_make_tuple(env, 2,
            enif_make_atom(env, "error"),
            enif_make_string(env, strerror(errno)));

    /* Unlike gen_tcp/udp, file module doesn't support passing in an {fd,FD} arg */
    (void)close(fd);

    return enif_make_atom(env, "ok");
}

Then (assuming nif_tmpfile maps to open/1):

    Tmp = "/tmp/foo.bar",
    ok = tmpfile:open(Tmp),
    {ok, FD} = file:open(Tmp, [read,write,binary]).




More information about the erlang-questions mailing list