/* * If booted with ASKNAME, prompt on the console for a filesystem * name and return it. */ void getfsname(char *askfor, char *name, size_t namelen) { if (boothowto & RB_ASKNAME) { printf("%s name: ", askfor); console_gets(name, namelen); } }
/* * Get a physical device name, and maybe load and attach * the driver. * * XXX Need better checking of whether or not a device * actually exists if the user typed in a pathname. * * XXX Are we sure we want to expose users to this sort * of physical namespace gobbledygook (now there's * a word to conjure with..) * * XXX Note that on an OBP machine, we can easily ask the * prom and pretty-print some plausible set of bootable * devices. We can also user the prom to verify any * such device. Later tim.. later. */ static int getphysdev(char *askfor, char *name, size_t namelen) { static char fmt[] = "Enter physical name of %s device\n[%s]: "; dev_t dev; static char defaultpath[BO_MAXOBJNAME]; /* * Establish 'default' values - we get the root device from * boot, and we infer the swap device is the same but with * a 'b' on the end instead of an 'a'. A first stab at * ease-of-use .. */ if (strcmp(askfor, "root") == 0) { if (get_bootpath_prop(defaultpath) == -1) boothowto |= RB_ASKNAME | RB_VERBOSE; } else { (void) strcpy(defaultpath, rootfs.bo_name); defaultpath[strlen(defaultpath) - 1] = 'b'; } retry: if (boothowto & RB_ASKNAME) { printf(fmt, askfor, defaultpath); console_gets(name, namelen); } if (*name == '\0') (void) strcpy(name, defaultpath); if (strcmp(askfor, "swap") == 0) { /* * Try to load and install the swap device driver. */ dev = ddi_pathname_to_dev_t(name); if (dev == (dev_t)-1) { printf("Not a supported device for swap.\n"); boothowto |= RB_ASKNAME | RB_VERBOSE; goto retry; } /* * Ensure that we're not trying to swap on the floppy. */ if (strncmp(ddi_major_to_name(getmajor(dev)), "fd", 2) == 0) { printf("Too dangerous to swap on the floppy\n"); if (boothowto & RB_ASKNAME) goto retry; return (-1); } } return (0); }
/* * Get the name of the root or swap filesystem type, and return * the corresponding entry in the vfs switch. * * If we're not asking the user, and we're trying to find the * root filesystem type, we ask boot for the filesystem * type that it came from and use that. Similarly, if we're * trying to find the swap filesystem, we try and derive it from * the root filesystem type. * * If we are booting via NFS we currently have these options: * nfs - dynamically choose NFS V2. V3, or V4 (default) * nfs2 - force NFS V2 * nfs3 - force NFS V3 * nfs4 - force NFS V4 * Because we need to maintain backward compatibility with the naming * convention that the NFS V2 filesystem name is "nfs" (see vfs_conf.c) * we need to map "nfs" => "nfsdyn" and "nfs2" => "nfs". The dynamic * nfs module will map the type back to either "nfs", "nfs3", or "nfs4". * This is only for root filesystems, all other uses such as cachefs * will expect that "nfs" == NFS V2. * * If the filesystem isn't already loaded, vfs_getvfssw() will load * it for us, but if (at the time we call it) modrootloaded is * still not set, it won't run the filesystems _init routine (and * implicitly it won't run the filesystems vsw_init() entry either). * We do that explicitly in rootconf(). */ static struct vfssw * getfstype(char *askfor, char *fsname, size_t fsnamelen) { struct vfssw *vsw; static char defaultfs[BO_MAXFSNAME]; int root = 0; if (strcmp(askfor, "root") == 0) { (void) get_fstype_prop(defaultfs); root++; } else { (void) strcpy(defaultfs, "swapfs"); } if (boothowto & RB_ASKNAME) { for (*fsname = '\0'; *fsname == '\0'; *fsname = '\0') { printf("%s filesystem type [%s]: ", askfor, defaultfs); console_gets(fsname, fsnamelen); if (*fsname == '\0') (void) strcpy(fsname, defaultfs); if (root) { if (strcmp(fsname, "nfs2") == 0) (void) strcpy(fsname, "nfs"); else if (strcmp(fsname, "nfs") == 0) (void) strcpy(fsname, "nfsdyn"); } if ((vsw = vfs_getvfssw(fsname)) != NULL) return (vsw); printf("Unknown filesystem type '%s'\n", fsname); } } else if (*fsname == '\0') { fsname = defaultfs; } if (*fsname == '\0') { return (NULL); } if (root) { if (strcmp(fsname, "nfs2") == 0) (void) strcpy(fsname, "nfs"); else if (strcmp(fsname, "nfs") == 0) (void) strcpy(fsname, "nfsdyn"); } return (vfs_getvfssw(fsname)); }
void console_poll(void) { char *buf; buf = console_gets(); console_schedule_cmd(buf, 1); }