From: Lionel Sambuc Date: Fri, 4 Oct 2013 10:12:01 +0000 (+0200) Subject: usr.bin/toproto: Adding support for device nodes X-Git-Tag: v3.3.0~759 X-Git-Url: http://zhaoyanbai.com/repos/Bv9ARM.html?a=commitdiff_plain;h=refs%2Fchanges%2F11%2F1011%2F2;p=minix.git usr.bin/toproto: Adding support for device nodes Change-Id: I5958673274ecc06429c489a1ac5a88d2b3c31864 --- diff --git a/usr.bin/toproto/toproto.c b/usr.bin/toproto/toproto.c index 1d9113954..a5069805c 100644 --- a/usr.bin/toproto/toproto.c +++ b/usr.bin/toproto/toproto.c @@ -23,7 +23,7 @@ */ enum entry_type -{ ENTRY_DIR, ENTRY_FILE, ENTRY_LINK }; +{ ENTRY_DIR, ENTRY_FILE, ENTRY_LINK, ENTRY_BLOCK, ENTRY_CHAR }; struct entry @@ -37,6 +37,9 @@ struct entry char *time; /* time 1365836670.000000000 */ char *size; char *link; + /* Can't use devmajor_t/devminor_t on linux systems :( */ + dev_t dev_major; + dev_t dev_minor; /* just internal variables used to create a tree */ int depth; @@ -96,6 +99,10 @@ convert_to_entry(char *line, struct entry *entry) entry->type = ENTRY_FILE; } else if (strncmp(value, "link", 5) == 0) { entry->type = ENTRY_LINK; + } else if (strncmp(value, "block", 6) == 0) { + entry->type = ENTRY_BLOCK; + } else if (strncmp(value, "char", 5) == 0) { + entry->type = ENTRY_CHAR; } else { fprintf(stderr, "\tunknown type %s -> '%s'\n", key, @@ -113,6 +120,11 @@ convert_to_entry(char *line, struct entry *entry) entry->size = strndup(value, MAX_LINE_SIZE); } else if (strncmp(key, "link", 5) == 0) { entry->link = strndup(value, MAX_LINE_SIZE); + } else if (strncmp(key, "device", 7) == 0) { + long int dev_id; + dev_id = strtoul(value, NULL, 16); + entry->dev_major = major(dev_id); + entry->dev_minor = minor(dev_id); } else { fprintf(stderr, "\tunknown attribute %s -> %s\n", key, @@ -289,6 +301,12 @@ static char * parse_mode(int mode){ return m; } +static char *parse_filename(char *path) +{ + /* Skipping the first . in the path */ + return &path[1]; +} + static int dump_entry(FILE * out, int mindex, const char *base_dir) { @@ -297,10 +315,11 @@ dump_entry(FILE * out, int mindex, const char *base_dir) int i; struct entry *entry = &entries[mindex]; + /* Indent the line */ + for (space = 0; space < entries[mindex].depth; space++) { + fprintf(out, " "); + } if (entry->type == ENTRY_DIR) { - for (space = 0; space < entries[mindex].depth; space++) { - fprintf(out, " "); - } if (entries[mindex].depth > 0) { fprintf(out, "%s ", entry->filename); } @@ -318,26 +337,24 @@ dump_entry(FILE * out, int mindex, const char *base_dir) } fprintf(out, "$\n"); } else if (entry->type == ENTRY_FILE) { - for (space = 0; space < entries[mindex].depth; space++) { - fprintf(out, " "); - } - /* hack skipping the first . in the path */ fprintf(out, "%s -%s %s %s %s%s\n", entry->filename, - parse_mode(entry->mode), entry->uid, entry->gid, base_dir, - &entry->path[1]); + parse_mode(entry->mode), entry->uid, entry->gid, + base_dir, parse_filename(entry->path)); } else if (entry->type == ENTRY_LINK) { - for (space = 0; space < entries[mindex].depth; space++) { - fprintf(out, " "); - } - /* hack skipping the first . in the path */ - fprintf(out, "%s s%s 0 0 %s\n", entry->filename, parse_mode(entry->mode), - entry->link); + fprintf(out, "%s s%s %s %s %s\n", entry->filename, + parse_mode(entry->mode), entry->uid, entry->gid, + entry->link); + } else if (entry->type == ENTRY_CHAR) { + fprintf(out, "%s c%s %s %s %d %d\n", entry->filename, + parse_mode(entry->mode), entry->uid, entry->gid, + entry->dev_major, entry->dev_minor); + } else if (entry->type == ENTRY_BLOCK) { + fprintf(out, "%s b%s %s %s %d %d\n", entry->filename, + parse_mode(entry->mode), entry->uid, entry->gid, + entry->dev_major, entry->dev_minor); } else { - /* missing "b" and "c" for block and char device? */ - fprintf(out, "# "); - for (space = 1; space < entries[mindex].depth; space++) { - fprintf(out, " "); - } + /* Unknown line type. */ + fprintf(out, "#"); fprintf(out, "%i %s\n", entry->type, entry->path); exit(1); return 1;