static int __init set_umid_arg(char *name, int *add) { int err; if (umid_inited) { printf("umid already set\n"); return 0; } *add = 0; err = set_umid(name); if (err == -EEXIST) printf("umid '%s' already in use\n", name); else if (!err) umid_inited = 1; return 0; }
static int __init make_umid(int (*printer)(const char *fmt, ...)) { int fd, err; char tmp[strlen(uml_dir) + UMID_LEN + 1]; strlcpy(tmp, uml_dir, sizeof(tmp)); if(!umid_inited){ strcat(tmp, "XXXXXX"); fd = mkstemp(tmp); if(fd < 0){ (*printer)("make_umid - mkstemp(%s) failed: %s\n", tmp,strerror(errno)); return(1); } os_close_file(fd); /* There's a nice tiny little race between this unlink and * the mkdir below. It'd be nice if there were a mkstemp * for directories. */ unlink(tmp); set_umid(&tmp[strlen(uml_dir)], 1, printer); } sprintf(tmp, "%s%s", uml_dir, umid); err = mkdir(tmp, 0777); if(err < 0){ if(errno == EEXIST){ if(not_dead_yet(tmp)){ (*printer)("umid '%s' is in use\n", umid); return(-1); } err = mkdir(tmp, 0777); } } if(err < 0){ (*printer)("Failed to create %s - errno = %d\n", umid, errno); return(-1); } return(0); }
static int __init make_umid(void) { int fd, err; char tmp[256]; if (umid_setup) return 0; make_uml_dir(); if (*umid == '\0') { strlcpy(tmp, uml_dir, sizeof(tmp)); strlcat(tmp, "XXXXXX", sizeof(tmp)); fd = mkstemp(tmp); if (fd < 0) { printk(UM_KERN_ERR "make_umid - mkstemp(%s) failed: " "%s\n", tmp, strerror(errno)); err = -errno; goto err; } close(fd); set_umid(&tmp[strlen(uml_dir)]); /* * There's a nice tiny little race between this unlink and * the mkdir below. It'd be nice if there were a mkstemp * for directories. */ if (unlink(tmp)) { err = -errno; goto err; } } snprintf(tmp, sizeof(tmp), "%s%s", uml_dir, umid); err = mkdir(tmp, 0777); if (err < 0) { err = -errno; if (err != -EEXIST) goto err; if (umdir_take_if_dead(tmp) < 0) goto err; err = mkdir(tmp, 0777); } if (err) { err = -errno; printk(UM_KERN_ERR "Failed to create '%s' - err = %d\n", umid, errno); goto err; } umid_setup = 1; create_pid_file(); err = 0; err: return err; }
int __init make_umid(void) { int fd, err; char tmp[256]; if(umid_setup) return 0; make_uml_dir(); if(*umid == '\0'){ strlcpy(tmp, uml_dir, sizeof(tmp)); strlcat(tmp, "XXXXXX", sizeof(tmp)); fd = mkstemp(tmp); if(fd < 0){ printk("make_umid - mkstemp(%s) failed: %s\n", tmp, strerror(errno)); err = -errno; goto err; } close(fd); set_umid(&tmp[strlen(uml_dir)]); /* There's a nice tiny little race between this unlink and * the mkdir below. It'd be nice if there were a mkstemp * for directories. */ if(unlink(tmp)){ err = -errno; goto err; } } snprintf(tmp, sizeof(tmp), "%s%s", uml_dir, umid); err = mkdir(tmp, 0777); if(err < 0){ err = -errno; if(err != -EEXIST) goto err; /* 1 -> this umid is already in use * < 0 -> we couldn't remove the umid directory * In either case, we can't use this umid, so return -EEXIST. */ if(not_dead_yet(tmp) != 0) goto err; err = mkdir(tmp, 0777); } if(err){ err = -errno; printk("Failed to create '%s' - err = %d\n", umid, -errno); goto err; } umid_setup = 1; create_pid_file(); err = 0; err: return err; }
static int __init set_umid_arg(char *name, int *add) { *add = 0; return(set_umid(name, 0, printf)); }