Annotation of qemu/roms/openbios/fs/iso9660/iso9660_opendir.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.