+
+char *
+blockcheck(name)
+ char *name;
+{
+ struct stat stslash, stblock, stchar;
+ char *raw;
+ int looped = 0;
+
+ hotroot = 0;
+ if (stat("/", &stslash) < 0){
+ printf("Can't stat root\n");
+ return (0);
+ }
+retry:
+ if (stat(name, &stblock) < 0){
+ printf("Can't stat %s\n", name);
+ return (0);
+ }
+ if (stblock.st_mode & S_IFBLK) {
+ raw = rawname(name);
+ if (stat(raw, &stchar) < 0){
+ printf("Can't stat %s\n", raw);
+ return (0);
+ }
+ if (stchar.st_mode & S_IFCHR) {
+ if (stslash.st_dev == stblock.st_rdev) {
+ hotroot++;
+ raw = unrawname(name);
+ }
+ return (raw);
+ } else {
+ printf("%s is not a character device\n", raw);
+ return (0);
+ }
+ } else if (stblock.st_mode & S_IFCHR) {
+ if (looped) {
+ printf("Can't make sense out of name %s\n", name);
+ return (0);
+ }
+ name = unrawname(name);
+ looped++;
+ goto retry;
+ }
+ printf("Can't make sense out of name %s\n", name);
+ return (0);
+}
+
+char *
+unrawname(cp)
+ char *cp;
+{
+ char *dp = rindex(cp, '/');
+ struct stat stb;
+
+ if (dp == 0)
+ return (cp);
+ if (stat(cp, &stb) < 0)
+ return (cp);
+ if ((stb.st_mode&S_IFMT) != S_IFCHR)
+ return (cp);
+ if (*(dp+1) != 'r')
+ return (cp);
+ (void)strcpy(dp+1, dp+2);
+ return (cp);
+}
+
+char *
+rawname(cp)
+ char *cp;
+{
+ static char rawbuf[32];
+ char *dp = rindex(cp, '/');
+
+ if (dp == 0)
+ return (0);
+ *dp = 0;
+ (void)strcpy(rawbuf, cp);
+ *dp = '/';
+ (void)strcat(rawbuf, "/r");
+ (void)strcat(rawbuf, dp+1);
+ return (rawbuf);
+}