|
|
1.1 ! root 1: /* ! 2: * ! 3: * (c) 2005-2009 Laurent Vivier <[email protected]> ! 4: * ! 5: * This file has been copied from EMILE, http://emile.sf.net ! 6: * ! 7: */ ! 8: ! 9: #include "libiso9660.h" ! 10: ! 11: static inline int iso9660_is_directory(struct iso_directory_record * idr) ! 12: { ! 13: return ((idr->flags[0] & 2) != 0); ! 14: } ! 15: ! 16: static iso9660_DIR* iso9660_opendir_node(iso9660_VOLUME *volume, struct iso_directory_record *node) ! 17: { ! 18: iso9660_DIR *dir; ! 19: ! 20: dir = (iso9660_DIR*)malloc(sizeof(iso9660_DIR)); ! 21: if (dir == NULL) ! 22: return NULL; ! 23: ! 24: dir->extent = isonum_733((char *)node->extent); ! 25: dir->len = isonum_733((char *)node->size); ! 26: dir->index = sizeof (dir->buffer); ! 27: dir->volume = volume; ! 28: ! 29: return dir; ! 30: } ! 31: ! 32: static struct iso_directory_record* idr_new(struct iso_directory_record* idr) ! 33: { ! 34: struct iso_directory_record* result; ! 35: int size = sizeof(*idr) + (int)idr->name_len[0]; ! 36: ! 37: result = (struct iso_directory_record*)malloc(size); ! 38: memcpy(result, idr, size); ! 39: ! 40: return result; ! 41: } ! 42: ! 43: static struct iso_directory_record * seek_name(iso9660_VOLUME *volume, ! 44: struct iso_directory_record *idr, ! 45: char *name) ! 46: { ! 47: struct iso_directory_record *result; ! 48: char name_buf[256]; ! 49: iso9660_DIR *dir; ! 50: ! 51: dir = iso9660_opendir_node(volume, idr); ! 52: if (dir == NULL) ! 53: return NULL; ! 54: ! 55: while ((idr = iso9660_readdir(dir)) != NULL) ! 56: { ! 57: iso9660_name(volume, idr, name_buf); ! 58: if (strcasecmp(name, name_buf) == 0) ! 59: { ! 60: result = idr_new(idr); ! 61: iso9660_closedir(dir); ! 62: return result; ! 63: } ! 64: } ! 65: iso9660_closedir(dir); ! 66: return NULL; ! 67: } ! 68: ! 69: struct iso_directory_record* iso9660_get_node( ! 70: iso9660_VOLUME *volume, ! 71: struct iso_directory_record *dirnode, ! 72: const char *path) ! 73: { ! 74: struct iso_directory_record* result; ! 75: struct iso_directory_record* current; ! 76: char name[256]; ! 77: int i; ! 78: ! 79: current = idr_new(dirnode); ! 80: while(1) ! 81: { ! 82: /* ignore head '\' */ ! 83: ! 84: while (*path && *path == '\\') ! 85: path++; ! 86: ! 87: if (*path == 0) ! 88: break; ! 89: ! 90: /* extract first path component */ ! 91: ! 92: i = 0; ! 93: while (*path && *path != '\\') ! 94: name[i++] = *path++; ! 95: name[i] = 0; ! 96: ! 97: /* seek first component in current directory */ ! 98: ! 99: result = seek_name(volume, current, name); ! 100: if (result == NULL) ! 101: return NULL; ! 102: ! 103: free(current); ! 104: current = result; ! 105: } ! 106: return current; ! 107: } ! 108: ! 109: iso9660_DIR* iso9660_opendir(iso9660_VOLUME *volume, const char *name) ! 110: { ! 111: iso9660_DIR *dir; ! 112: struct iso_directory_record *node; ! 113: ! 114: node = iso9660_get_root_node((iso9660_VOLUME*)volume); ! 115: if (node == NULL) ! 116: return NULL; ! 117: ! 118: node = iso9660_get_node((iso9660_VOLUME*)volume, node, name); ! 119: if (node == NULL) ! 120: return NULL; ! 121: if (!iso9660_is_directory(node)) { ! 122: free(node); ! 123: return NULL; ! 124: } ! 125: ! 126: dir = iso9660_opendir_node((iso9660_VOLUME*)volume, node); ! 127: ! 128: free(node); ! 129: ! 130: dir->volume = (iso9660_VOLUME*)volume; ! 131: ! 132: return dir; ! 133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.