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; }
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); }
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); }
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)); }