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 | ||||
| { 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]; | ||||
| 
 | ||||
| 	if (entry->type == ENTRY_DIR) { | ||||
| 	/* Indent the line */ | ||||
| 	for (space = 0; space < entries[mindex].depth; space++) { | ||||
| 		fprintf(out, " "); | ||||
| 	} | ||||
| 	if (entry->type == ENTRY_DIR) { | ||||
| 		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), | ||||
| 		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? */ | ||||
| 		/* Unknown line type.  */ | ||||
| 		fprintf(out, "#"); | ||||
| 		for (space = 1; space < entries[mindex].depth; space++) { | ||||
| 			fprintf(out, " "); | ||||
| 		} | ||||
| 		fprintf(out, "%i %s\n", entry->type, entry->path); | ||||
| 		exit(1); | ||||
| 		return 1; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Lionel Sambuc
						Lionel Sambuc