static inline int is_umdir_used()

in os-Linux/umid.c [136:189]


static inline int is_umdir_used(char *dir)
{
	char pid[sizeof("nnnnnnnnn")], *end, *file;
	int dead, fd, p, n, err;
	size_t filelen = strlen(dir) + sizeof("/pid") + 1;

	file = malloc(filelen);
	if (!file)
		return -ENOMEM;

	snprintf(file, filelen, "%s/pid", dir);

	dead = 0;
	fd = open(file, O_RDONLY);
	if (fd < 0) {
		fd = -errno;
		if (fd != -ENOENT) {
			printk(UM_KERN_ERR "is_umdir_used : couldn't open pid "
			       "file '%s', err = %d\n", file, -fd);
		}
		goto out;
	}

	err = 0;
	n = read(fd, pid, sizeof(pid));
	if (n < 0) {
		printk(UM_KERN_ERR "is_umdir_used : couldn't read pid file "
		       "'%s', err = %d\n", file, errno);
		goto out_close;
	} else if (n == 0) {
		printk(UM_KERN_ERR "is_umdir_used : couldn't read pid file "
		       "'%s', 0-byte read\n", file);
		goto out_close;
	}

	p = strtoul(pid, &end, 0);
	if (end == pid) {
		printk(UM_KERN_ERR "is_umdir_used : couldn't parse pid file "
		       "'%s', errno = %d\n", file, errno);
		goto out_close;
	}

	if ((kill(p, 0) == 0) || (errno != ESRCH)) {
		printk(UM_KERN_ERR "umid \"%s\" is already in use by pid %d\n",
		       umid, p);
		return 1;
	}

out_close:
	close(fd);
out:
	free(file);
	return 0;
}