Example #1
0
static int not_dead_yet(char *dir)
{
	char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
	char pid[sizeof("nnnnn\0")], *end;
	int dead, fd, p, n, err;

	n = snprintf(file, sizeof(file), "%s/pid", dir);
	if(n >= sizeof(file)){
		printk("not_dead_yet - pid filename too long\n");
		err = -E2BIG;
		goto out;
	}

	dead = 0;
	fd = open(file, O_RDONLY);
	if(fd < 0) {
		fd = -errno;
		if(fd != -ENOENT){
			printk("not_dead_yet : 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("not_dead_yet : couldn't read pid file '%s', "
		       "err = %d\n", file, errno);
		goto out_close;
	} else if(n == 0){
		printk("not_dead_yet : couldn't read pid file '%s', "
		       "0-byte read\n", file);
		goto out_close;
	}

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

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

	err = actually_do_remove(dir);
	if(err)
		printk("not_dead_yet - actually_do_remove failed with "
		       "err = %d\n", err);

	return err;

out_close:
	close(fd);
out:
	return 0;
}
Example #2
0
void remove_umid_dir(void)
{
	char dir[strlen(uml_dir) + UMID_LEN + 1];
	if(!umid_inited) return;

	sprintf(dir, "%s%s", uml_dir, umid);
	actually_do_remove(dir);
}
Example #3
0
static void remove_umid_dir(void)
{
	char dir[strlen(uml_dir) + UMID_LEN + 1], err;

	sprintf(dir, "%s%s", uml_dir, umid);
	err = actually_do_remove(dir);
	if(err)
		printf("remove_umid_dir - actually_do_remove failed with "
		       "err = %d\n", err);
}
Example #4
0
int not_dead_yet(char *dir)
{
	char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
	char pid[sizeof("nnnnn\0")], *end;
	int dead, fd, p, n;

	sprintf(file, "%s/pid", dir);
	dead = 0;
	fd = os_open_file(file, of_read(OPENFLAGS()), 0);
	if(fd < 0){
		if(fd != -ENOENT){
			printk("not_dead_yet : couldn't open pid file '%s', "
			       "err = %d\n", file, -fd);
			return(1);
		}
		dead = 1;
	}
	if(fd > 0){
		n = os_read_file(fd, pid, sizeof(pid));
		if(n < 0){
			printk("not_dead_yet : couldn't read pid file '%s', "
			       "err = %d\n", file, -n);
			return(1);
		}
		p = strtoul(pid, &end, 0);
		if(end == pid){
			printk("not_dead_yet : couldn't parse pid file '%s', "
			       "errno = %d\n", file, errno);
			dead = 1;
		}
		if(((kill(p, 0) < 0) && (errno == ESRCH)) ||
		   (p == CHOOSE_MODE(tracing_pid, os_getpid())))
			dead = 1;
	}
	if(!dead) return(1);
	return(actually_do_remove(dir));
}