Annotation of qemu/roms/openbios/fs/hfs/file.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * libhfs - library for reading and writing Macintosh HFS volumes
                      3:  * Copyright (C) 1996-1998 Robert Leslie
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify
                      6:  * it under the terms of the GNU General Public License as published by
                      7:  * the Free Software Foundation; either version 2 of the License, or
                      8:  * (at your option) any later version.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful,
                     11:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     12:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     13:  * GNU General Public License for more details.
                     14:  *
                     15:  * You should have received a copy of the GNU General Public License
                     16:  * along with this program; if not, write to the Free Software
                     17:  * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
                     18:  * MA 02110-1301, USA.
                     19:  *
                     20:  * $Id: file.c,v 1.9 1998/11/02 22:08:59 rob Exp $
                     21:  */
                     22: 
                     23: #include "config.h"
                     24: #include "libhfs.h"
                     25: #include "file.h"
                     26: #include "btree.h"
                     27: #include "record.h"
                     28: #include "volume.h"
                     29: 
                     30: /*
                     31:  * NAME:       file->init()
                     32:  * DESCRIPTION:        initialize file structure
                     33:  */
                     34: void f_init(hfsfile *file, hfsvol *vol, long cnid, const char *name)
                     35: {
                     36:   int i;
                     37: 
                     38:   file->vol   = vol;
                     39:   file->parid = 0;
                     40: 
                     41:   strcpy(file->name, name);
                     42: 
                     43:   file->cat.cdrType          = cdrFilRec;
                     44:   file->cat.cdrResrv2        = 0;
                     45: 
                     46:   file->cat.u.fil.filFlags   = 0;
                     47:   file->cat.u.fil.filTyp     = 0;
                     48: 
                     49:   file->cat.u.fil.filUsrWds.fdType       = 0;
                     50:   file->cat.u.fil.filUsrWds.fdCreator    = 0;
                     51:   file->cat.u.fil.filUsrWds.fdFlags      = 0;
                     52:   file->cat.u.fil.filUsrWds.fdLocation.v = 0;
                     53:   file->cat.u.fil.filUsrWds.fdLocation.h = 0;
                     54:   file->cat.u.fil.filUsrWds.fdFldr       = 0;
                     55: 
                     56:   file->cat.u.fil.filFlNum   = cnid;
                     57:   file->cat.u.fil.filStBlk   = 0;
                     58:   file->cat.u.fil.filLgLen   = 0;
                     59:   file->cat.u.fil.filPyLen   = 0;
                     60:   file->cat.u.fil.filRStBlk  = 0;
                     61:   file->cat.u.fil.filRLgLen  = 0;
                     62:   file->cat.u.fil.filRPyLen  = 0;
                     63:   file->cat.u.fil.filCrDat   = 0;
                     64:   file->cat.u.fil.filMdDat   = 0;
                     65:   file->cat.u.fil.filBkDat   = 0;
                     66: 
                     67:   file->cat.u.fil.filFndrInfo.fdIconID = 0;
                     68:   for (i = 0; i < 4; ++i)
                     69:     file->cat.u.fil.filFndrInfo.fdUnused[i] = 0;
                     70:   file->cat.u.fil.filFndrInfo.fdComment = 0;
                     71:   file->cat.u.fil.filFndrInfo.fdPutAway = 0;
                     72: 
                     73:   file->cat.u.fil.filClpSize = 0;
                     74: 
                     75:   for (i = 0; i < 3; ++i)
                     76:     {
                     77:       file->cat.u.fil.filExtRec[i].xdrStABN     = 0;
                     78:       file->cat.u.fil.filExtRec[i].xdrNumABlks  = 0;
                     79: 
                     80:       file->cat.u.fil.filRExtRec[i].xdrStABN    = 0;
                     81:       file->cat.u.fil.filRExtRec[i].xdrNumABlks = 0;
                     82:     }
                     83: 
                     84:   file->cat.u.fil.filResrv   = 0;
                     85: 
                     86:   f_selectfork(file, fkData);
                     87: 
                     88:   file->flags = 0;
                     89: 
                     90:   file->prev  = NULL;
                     91:   file->next  = NULL;
                     92: }
                     93: 
                     94: /*
                     95:  * NAME:       file->selectfork()
                     96:  * DESCRIPTION:        choose a fork for file operations
                     97:  */
                     98: void f_selectfork(hfsfile *file, int fork)
                     99: {
                    100:   file->fork = fork;
                    101: 
                    102:   memcpy(&file->ext, fork == fkData ?
                    103:         &file->cat.u.fil.filExtRec : &file->cat.u.fil.filRExtRec,
                    104:         sizeof(ExtDataRec));
                    105: 
                    106:   file->fabn = 0;
                    107:   file->pos  = 0;
                    108: }
                    109: 
                    110: /*
                    111:  * NAME:       file->getptrs()
                    112:  * DESCRIPTION:        make pointers to the current fork's lengths and extents
                    113:  */
                    114: void f_getptrs(hfsfile *file, ExtDataRec **extrec,
                    115:               unsigned long **lglen, unsigned long **pylen)
                    116: {
                    117:   if (file->fork == fkData)
                    118:     {
                    119:       if (extrec)
                    120:        *extrec = &file->cat.u.fil.filExtRec;
                    121:       if (lglen)
                    122:        *lglen  = &file->cat.u.fil.filLgLen;
                    123:       if (pylen)
                    124:        *pylen  = &file->cat.u.fil.filPyLen;
                    125:     }
                    126:   else
                    127:     {
                    128:       if (extrec)
                    129:        *extrec = &file->cat.u.fil.filRExtRec;
                    130:       if (lglen)
                    131:        *lglen  = &file->cat.u.fil.filRLgLen;
                    132:       if (pylen)
                    133:        *pylen  = &file->cat.u.fil.filRPyLen;
                    134:     }
                    135: }
                    136: 
                    137: /*
                    138:  * NAME:       file->doblock()
                    139:  * DESCRIPTION:        read or write a numbered block from a file
                    140:  */
                    141: int f_doblock(hfsfile *file, unsigned long num, block *bp,
                    142:              int (*func)(hfsvol *, unsigned int, unsigned int, block *))
                    143: {
                    144:   unsigned int abnum;
                    145:   unsigned int blnum;
                    146:   unsigned int fabn;
                    147:   int i;
                    148: 
                    149:   abnum = num / file->vol->lpa;
                    150:   blnum = num % file->vol->lpa;
                    151: 
                    152:   /* locate the appropriate extent record */
                    153: 
                    154:   fabn = file->fabn;
                    155: 
                    156:   if (abnum < fabn)
                    157:     {
                    158:       ExtDataRec *extrec;
                    159: 
                    160:       f_getptrs(file, &extrec, NULL, NULL);
                    161: 
                    162:       fabn = file->fabn = 0;
                    163:       memcpy(&file->ext, extrec, sizeof(ExtDataRec));
                    164:     }
                    165:   else
                    166:     abnum -= fabn;
                    167: 
                    168:   while (1)
                    169:     {
                    170:       unsigned int n;
                    171: 
                    172:       for (i = 0; i < 3; ++i)
                    173:        {
                    174:          n = file->ext[i].xdrNumABlks;
                    175: 
                    176:          if (abnum < n)
                    177:            return func(file->vol, file->ext[i].xdrStABN + abnum, blnum, bp);
                    178: 
                    179:          fabn  += n;
                    180:          abnum -= n;
                    181:        }
                    182: 
                    183:       if (v_extsearch(file, fabn, &file->ext, NULL) <= 0)
                    184:        goto fail;
                    185: 
                    186:       file->fabn = fabn;
                    187:     }
                    188: 
                    189: fail:
                    190:   return -1;
                    191: }

unix.superglobalmegacorp.com

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