Annotation of qemu/roms/openbios/fs/iso9660/iso9660_mount.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:  * some parts from mkisofs (c) J. Schilling
                      8:  *
                      9:  */
                     10: 
                     11: #include "libiso9660.h"
                     12: #include "libopenbios/bindings.h"
                     13: #include "libc/diskio.h"
                     14: 
                     15: void iso9660_name(iso9660_VOLUME *volume, struct iso_directory_record *idr, char *buffer)
                     16: {
                     17:        int     j;
                     18:         unsigned char ul, uc;
                     19: 
                     20:        buffer[0] = 0;
                     21:        if (idr->name_len[0] == 1 && idr->name[0] == 0)
                     22:                strcpy(buffer, ".");
                     23:        else if (idr->name_len[0] == 1 && idr->name[0] == 1)
                     24:                strcpy(buffer, "..");
                     25:        else {
                     26:                switch (volume->ucs_level) {
                     27:                case 3:
                     28:                case 2:
                     29:                case 1:
                     30:                        /*
                     31:                         * Unicode name.
                     32:                         */
                     33: 
                     34:                        for (j = 0; j < (int)idr->name_len[0] / 2; j++) {
                     35:                                ul = idr->name[j*2+1];
                     36: 
                     37:                                /*
                     38:                                 * unicode convertion
                     39:                                 * up = unls->unls_uni2cs[uh];
                     40:                                 *
                     41:                                 * if (up == NULL)
                     42:                                 *      uc = '\0';
                     43:                                 * else
                     44:                                 *      uc = up[ul];
                     45:                                 *
                     46:                                 * we use only low byte
                     47:                                 */
                     48: 
                     49:                                uc = ul;
                     50: 
                     51:                                buffer[j] = uc ? uc : '_';
                     52:                        }
                     53:                        buffer[idr->name_len[0]/2] = '\0';
                     54:                        break;
                     55:                case 0:
                     56:                        /*
                     57:                         * Normal non-Unicode name.
                     58:                         */
                     59:                        strncpy(buffer, idr->name, idr->name_len[0]);
                     60:                        buffer[idr->name_len[0]] = 0;
                     61:                        break;
                     62:                default:
                     63:                        /*
                     64:                         * Don't know how to do these yet.  Maybe they are the same
                     65:                         * as one of the above.
                     66:                         */
                     67:                        break;
                     68:                }
                     69:        }
                     70: }
                     71: 
                     72: iso9660_VOLUME *iso9660_mount(int fd)
                     73: {
                     74:        iso9660_VOLUME* volume;
                     75:        struct iso_primary_descriptor *jpd;
                     76:        struct iso_primary_descriptor ipd;
                     77:        int     block;
                     78:        int ucs_level = 0;
                     79: 
                     80:        /* read filesystem descriptor */
                     81: 
                     82:        seek_io(fd, 16 * ISOFS_BLOCK_SIZE);
                     83:        read_io(fd, &ipd, sizeof (ipd));
                     84: 
                     85:        /*
                     86:         * High sierra:
                     87:         *
                     88:         *      DESC TYPE       == 1 (VD_SFS)   offset 8        len 1
                     89:         *      STR ID          == "CDROM"      offset 9        len 5
                     90:         *      STD_VER         == 1            offset 14       len 1
                     91:         */
                     92: 
                     93:        /* High Sierra format ? */
                     94: 
                     95:        if ((((char *)&ipd)[8] == 1) &&
                     96:            (strncmp(&((char *)&ipd)[9], "CDROM", 5) == 0) &&
                     97:            (((char *)&ipd)[14] == 1)) {
                     98:                printk("Incompatible format: High Sierra format\n");
                     99:                return NULL;
                    100:        }
                    101: 
                    102:        /*
                    103:         * ISO 9660:
                    104:         *
                    105:         *      DESC TYPE       == 1 (VD_PVD)   offset 0        len 1
                    106:         *      STR ID          == "CD001"      offset 1        len 5
                    107:         *      STD_VER         == 1            offset 6        len 1
                    108:         */
                    109: 
                    110:        /* NOT ISO 9660 format ? */
                    111: 
                    112:        if ((ipd.type[0] != ISO_VD_PRIMARY) ||
                    113:            (strncmp(ipd.id, ISO_STANDARD_ID, sizeof (ipd.id)) != 0) ||
                    114:            (ipd.version[0] != 1)) {
                    115:                return NULL;
                    116:        }
                    117: 
                    118:        /* UCS info */
                    119: 
                    120:        block = 16;
                    121: 
                    122:        jpd = (struct iso_primary_descriptor *)
                    123:                malloc(sizeof(struct iso_primary_descriptor));
                    124:        if (jpd == NULL)
                    125:                return NULL;
                    126: 
                    127:        memcpy(jpd, &ipd, sizeof (ipd));
                    128:        while ((uint8_t)jpd->type[0] != ISO_VD_END) {
                    129: 
                    130:                /*
                    131:                 * If Joliet UCS escape sequence found, we may be wrong
                    132:                 */
                    133: 
                    134:                if (jpd->unused3[0] == '%' &&
                    135:                    jpd->unused3[1] == '/' &&
                    136:                    (jpd->unused3[3] == '\0' ||
                    137:                    jpd->unused3[3] == ' ') &&
                    138:                    (jpd->unused3[2] == '@' ||
                    139:                    jpd->unused3[2] == 'C' ||
                    140:                    jpd->unused3[2] == 'E')) {
                    141: 
                    142:                        if (jpd->version[0] != 1)
                    143:                                break;
                    144:                }
                    145: 
                    146:                block++;
                    147:                seek_io(fd, block * ISOFS_BLOCK_SIZE);
                    148:                read_io(fd, jpd, sizeof (*jpd));
                    149:        }
                    150: 
                    151:        ucs_level = 0;
                    152:        if (((unsigned char) jpd->type[0] == ISO_VD_END)) {
                    153:                memcpy(jpd, &ipd, sizeof (ipd));
                    154:        } else {
                    155:                switch (jpd->unused3[2]) {
                    156:                case '@':
                    157:                        ucs_level = 1;
                    158:                        break;
                    159:                case 'C':
                    160:                        ucs_level = 2;
                    161:                        break;
                    162:                case 'E':
                    163:                        ucs_level = 3;
                    164:                        break;
                    165:                }
                    166: 
                    167:                if (ucs_level && jpd->unused3[3] == ' ')
                    168:                        printk("Warning: Joliet escape sequence uses illegal space at offset 3\n");
                    169:        }
                    170: 
                    171:        volume = (iso9660_VOLUME*)malloc(sizeof(iso9660_VOLUME));
                    172:        if (volume == NULL)
                    173:                return NULL;
                    174: 
                    175:        volume->descriptor = jpd;
                    176:        volume->ucs_level = ucs_level;
                    177:        volume->fd = fd;
                    178: 
                    179:        return volume;
                    180: }
                    181: 
                    182: int iso9660_umount(iso9660_VOLUME* volume)
                    183: {
                    184:        if (volume == NULL)
                    185:                return -1;
                    186:        free(volume->descriptor);
                    187:        free(volume);
                    188:        return 0;
                    189: }
                    190: 
                    191: int iso9660_probe(int fd, long long offset)
                    192: {
                    193:        struct iso_primary_descriptor ipd;
                    194: 
                    195:        seek_io(fd, 16 * ISOFS_BLOCK_SIZE + offset);
                    196:        read_io(fd, &ipd, sizeof (ipd));
                    197: 
                    198:        if ((ipd.type[0] != ISO_VD_PRIMARY) ||
                    199:            (strncmp(ipd.id, ISO_STANDARD_ID, sizeof (ipd.id)) != 0) ||
                    200:            (ipd.version[0] != 1)) {
                    201:                return 0;
                    202:        }
                    203: 
                    204:        return -1;
                    205: }
                    206: 
                    207: struct iso_directory_record *iso9660_get_root_node(iso9660_VOLUME* volume)
                    208: {
                    209:        return (struct iso_directory_record *)volume->descriptor->root_directory_record;
                    210: }

unix.superglobalmegacorp.com

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