usr.bin/toproto: Adding support for device nodes

Change-Id: I5958673274ecc06429c489a1ac5a88d2b3c31864
This commit is contained in:
Lionel Sambuc 2013-10-04 12:12:01 +02:00 committed by Gerrit Code Review
parent 916b872033
commit 45783c536a

View File

@ -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;