usr.bin/toproto: Adding support for device nodes
Change-Id: I5958673274ecc06429c489a1ac5a88d2b3c31864
This commit is contained in:
parent
916b872033
commit
45783c536a
@ -23,7 +23,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
enum entry_type
|
enum entry_type
|
||||||
{ ENTRY_DIR, ENTRY_FILE, ENTRY_LINK };
|
{ ENTRY_DIR, ENTRY_FILE, ENTRY_LINK, ENTRY_BLOCK, ENTRY_CHAR };
|
||||||
|
|
||||||
|
|
||||||
struct entry
|
struct entry
|
||||||
@ -37,6 +37,9 @@ struct entry
|
|||||||
char *time; /* time 1365836670.000000000 */
|
char *time; /* time 1365836670.000000000 */
|
||||||
char *size;
|
char *size;
|
||||||
char *link;
|
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 */
|
/* just internal variables used to create a tree */
|
||||||
int depth;
|
int depth;
|
||||||
@ -96,6 +99,10 @@ convert_to_entry(char *line, struct entry *entry)
|
|||||||
entry->type = ENTRY_FILE;
|
entry->type = ENTRY_FILE;
|
||||||
} else if (strncmp(value, "link", 5) == 0) {
|
} else if (strncmp(value, "link", 5) == 0) {
|
||||||
entry->type = ENTRY_LINK;
|
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 {
|
} else {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\tunknown type %s -> '%s'\n", key,
|
"\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);
|
entry->size = strndup(value, MAX_LINE_SIZE);
|
||||||
} else if (strncmp(key, "link", 5) == 0) {
|
} else if (strncmp(key, "link", 5) == 0) {
|
||||||
entry->link = strndup(value, MAX_LINE_SIZE);
|
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 {
|
} else {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\tunknown attribute %s -> %s\n", key,
|
"\tunknown attribute %s -> %s\n", key,
|
||||||
@ -289,6 +301,12 @@ static char * parse_mode(int mode){
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *parse_filename(char *path)
|
||||||
|
{
|
||||||
|
/* Skipping the first . in the path */
|
||||||
|
return &path[1];
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dump_entry(FILE * out, int mindex, const char *base_dir)
|
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;
|
int i;
|
||||||
struct entry *entry = &entries[mindex];
|
struct entry *entry = &entries[mindex];
|
||||||
|
|
||||||
if (entry->type == ENTRY_DIR) {
|
/* Indent the line */
|
||||||
for (space = 0; space < entries[mindex].depth; space++) {
|
for (space = 0; space < entries[mindex].depth; space++) {
|
||||||
fprintf(out, " ");
|
fprintf(out, " ");
|
||||||
}
|
}
|
||||||
|
if (entry->type == ENTRY_DIR) {
|
||||||
if (entries[mindex].depth > 0) {
|
if (entries[mindex].depth > 0) {
|
||||||
fprintf(out, "%s ", entry->filename);
|
fprintf(out, "%s ", entry->filename);
|
||||||
}
|
}
|
||||||
@ -318,26 +337,24 @@ dump_entry(FILE * out, int mindex, const char *base_dir)
|
|||||||
}
|
}
|
||||||
fprintf(out, "$\n");
|
fprintf(out, "$\n");
|
||||||
} else if (entry->type == ENTRY_FILE) {
|
} 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,
|
fprintf(out, "%s -%s %s %s %s%s\n", entry->filename,
|
||||||
parse_mode(entry->mode), entry->uid, entry->gid, base_dir,
|
parse_mode(entry->mode), entry->uid, entry->gid,
|
||||||
&entry->path[1]);
|
base_dir, parse_filename(entry->path));
|
||||||
} else if (entry->type == ENTRY_LINK) {
|
} else if (entry->type == ENTRY_LINK) {
|
||||||
for (space = 0; space < entries[mindex].depth; space++) {
|
fprintf(out, "%s s%s %s %s %s\n", entry->filename,
|
||||||
fprintf(out, " ");
|
parse_mode(entry->mode), entry->uid, entry->gid,
|
||||||
}
|
|
||||||
/* hack skipping the first . in the path */
|
|
||||||
fprintf(out, "%s s%s 0 0 %s\n", entry->filename, parse_mode(entry->mode),
|
|
||||||
entry->link);
|
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 {
|
} else {
|
||||||
/* missing "b" and "c" for block and char device? */
|
/* Unknown line type. */
|
||||||
fprintf(out, "# ");
|
fprintf(out, "#");
|
||||||
for (space = 1; space < entries[mindex].depth; space++) {
|
|
||||||
fprintf(out, " ");
|
|
||||||
}
|
|
||||||
fprintf(out, "%i %s\n", entry->type, entry->path);
|
fprintf(out, "%i %s\n", entry->type, entry->path);
|
||||||
exit(1);
|
exit(1);
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user