Subject: mkstemp and magiclinks (@uid)
To: None <>
From: Juan RP <>
List: tech-userlevel
Date: 02/15/2007 10:10:30
Hi, I've been playing with perusertmp and when it's enabled man(1)
does not work because couldn't use /tmp.

I verified with the man code and it uses mkstemp(3) to tranform the
manpage (or whatever it does).

The following shows a simple test program to demonstrate that
mkstemp(3) thinks that the link is not a link or directory.

[juan@nocturno][~/mkstemp]> sudo sysctl -w vfs.generic.magiclinks=1
vfs.generic.magiclinks: 0 -> 1

[juan@nocturno][~/mkstemp]> mkdir blah
[juan@nocturno][~/mkstemp]> ./test blah
blah/test.01975a created
[juan@nocturno][~/mkstemp]> ln -s blah/@uid foo
[juan@nocturno][~/mkstemp]> ls -l
total 48
-rw-r--r--  1 juan  wheel    48 Feb 14 21:49 Makefile
drwxr-xr-x  2 juan  wheel   512 Feb 15 10:02 blah
lrwxr-xr-x  1 juan  wheel     9 Feb 15 10:02 foo -> blah/@uid
-rwxr-xr-x  1 juan  wheel  6424 Feb 14 21:49 test
-rw-r--r--  1 juan  wheel   707 Feb 14 21:23 test.c
-rw-r--r--  1 juan  wheel  1520 Feb 14 21:49 test.o
[juan@nocturno][~/mkstemp]> ./test foo
test: not a directory or symlink to directory

Does anyone know what's the problem?

This is the code I'm using to verify that mkstemp works:

#include <sys/param.h>
#include <sys/stat.h>

#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TMPL    "test.XXXXXX"

int main(int argc, char **argv)
        struct stat st;
        char buf[MAXPATHLEN - 1];


        if (argc != 2) {
                (void)printf("usage: %s directory\n", getprogname());
                return 1;

        stat(argv[1], &st);
        (void)snprintf(buf, sizeof(buf), "%s/%s", argv[1], TMPL);

        switch (st.st_mode & S_IFMT) {
        case S_IFDIR:
        case S_IFLNK:
                if (mkstemp(buf) == -1)
                        errx(errno, "mkstemp %s", strerror(errno));

                (void)printf("%s created\n", buf);
                errx(1, "not a directory or symlink to directory");

        return 0;

Juan RP's blog - NetBSD/pkgsrc news in Spanish