Annotation of qemu/roms/openbios/fs/grubfs/fsys_vstafs.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  GRUB  --  GRand Unified Bootloader
                      3:  *  Copyright (C) 2001   Free Software Foundation, Inc.
                      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: 
                     21: #ifdef FSYS_VSTAFS
                     22: 
                     23: #include "shared.h"
                     24: #include "filesys.h"
                     25: #include "vstafs.h"
                     26: 
                     27: 
                     28: static void get_file_info (int sector);
                     29: static struct dir_entry *vstafs_readdir (long sector);
                     30: static struct dir_entry *vstafs_nextdir (void);
                     31: 
                     32: 
                     33: #define FIRST_SECTOR   ((struct first_sector *) FSYS_BUF)
                     34: #define FILE_INFO       ((struct fs_file *) (long) FIRST_SECTOR + 8192)
                     35: #define DIRECTORY_BUF   ((struct dir_entry *) (long) FILE_INFO + 512)
                     36: 
                     37: #define ROOT_SECTOR    1
                     38: 
                     39: /*
                     40:  * In f_sector we store the sector number in which the information about
                     41:  * the found file is.
                     42:  */
                     43: static int f_sector;
                     44: 
                     45: int
                     46: vstafs_mount (void)
                     47: {
                     48:   int retval = 1;
                     49: 
                     50:   if( (((current_drive & 0x80) || (current_slice != 0))
                     51:        && current_slice != PC_SLICE_TYPE_VSTAFS)
                     52:       ||  ! devread (0, 0, BLOCK_SIZE, (char *) FSYS_BUF)
                     53:       ||  FIRST_SECTOR->fs_magic != 0xDEADFACE)
                     54:     retval = 0;
                     55: 
                     56:   return retval;
                     57: }
                     58: 
                     59: static void
                     60: get_file_info (int sector)
                     61: {
                     62:   devread (sector, 0, BLOCK_SIZE, (char *) FILE_INFO);
                     63: }
                     64: 
                     65: static int curr_ext, current_direntry, current_blockpos;
                     66: static struct alloc *a1;
                     67: 
                     68: static struct dir_entry *
                     69: vstafs_readdir (long sector)
                     70: {
                     71:   /*
                     72:    * Get some information from the current directory
                     73:    */
                     74:   get_file_info (sector);
                     75:   if (FILE_INFO->type != 2)
                     76:     {
                     77:       errnum = ERR_FILE_NOT_FOUND;
                     78:       return NULL;
                     79:     }
                     80: 
                     81:   a1 = FILE_INFO->blocks;
                     82:   curr_ext = 0;
                     83:   devread (a1[curr_ext].a_start, 0, 512, (char *) DIRECTORY_BUF);
                     84:   current_direntry = 11;
                     85:   current_blockpos = 0;
                     86: 
                     87:   return &DIRECTORY_BUF[10];
                     88: }
                     89: 
                     90: static struct dir_entry *
                     91: vstafs_nextdir (void)
                     92: {
                     93:   if (current_direntry > 15)
                     94:     {
                     95:       current_direntry = 0;
                     96:       if (++current_blockpos > (a1[curr_ext].a_len - 1))
                     97:        {
                     98:          current_blockpos = 0;
                     99:          curr_ext++;
                    100:        }
                    101: 
                    102:       if (curr_ext < FILE_INFO->extents)
                    103:        {
                    104:             devread (a1[curr_ext].a_start + current_blockpos, 0,
                    105:                      512, (char *) DIRECTORY_BUF);
                    106:        }
                    107:       else
                    108:        {
                    109:             /* errnum =ERR_FILE_NOT_FOUND; */
                    110:             return NULL;
                    111:        }
                    112:     }
                    113: 
                    114:   return &DIRECTORY_BUF[current_direntry++];
                    115: }
                    116: 
                    117: int
                    118: vstafs_dir (char *dirname)
                    119: {
                    120:   char *fn, ch;
                    121:   struct dir_entry *d;
                    122:   /* int l, i, s; */
                    123: 
                    124:   /*
                    125:    * Read in the entries of the current directory.
                    126:    */
                    127:   f_sector = ROOT_SECTOR;
                    128:   do
                    129:     {
                    130:       if (! (d = vstafs_readdir (f_sector)))
                    131:        {
                    132:          return 0;
                    133:        }
                    134: 
                    135:       /*
                    136:        * Find the file in the path
                    137:        */
                    138:       while (*dirname == '/') dirname++;
                    139:       fn = dirname;
                    140:       while ((ch = *fn) && ch != '/' && ! isspace (ch)) fn++;
                    141:       *fn = 0;
                    142: 
                    143:       do
                    144:        {
                    145:          if (d->name[0] == 0 || d->name[0] & 0x80)
                    146:            continue;
                    147: 
                    148: #ifndef STAGE1_5
                    149:          if (print_possibilities && ch != '/'
                    150:              && (! *dirname || strcmp (dirname, d->name) <= 0))
                    151:            {
                    152:              if (print_possibilities > 0)
                    153:                print_possibilities = -print_possibilities;
                    154: 
                    155:              printf ("  %s", d->name);
                    156:            }
                    157: #endif
                    158:          if (! grub_strcmp (dirname, d->name))
                    159:            {
                    160:              f_sector = d->start;
                    161:              get_file_info (f_sector);
                    162:              filemax = FILE_INFO->len;
                    163:              break;
                    164:            }
                    165:        }
                    166:       while ((d =vstafs_nextdir ()));
                    167: 
                    168:       *(dirname = fn) = ch;
                    169:       if (! d)
                    170:        {
                    171:          if (print_possibilities < 0)
                    172:            {
                    173: #ifndef STAGE1_5
                    174:              putchar ('\n');
                    175: #endif
                    176:              return 1;
                    177:            }
                    178: 
                    179:          errnum = ERR_FILE_NOT_FOUND;
                    180:          return 0;
                    181:        }
                    182:     }
                    183:   while (*dirname && ! isspace (ch));
                    184: 
                    185:   return 1;
                    186: }
                    187: 
                    188: int
                    189: vstafs_read (char *addr, int len)
                    190: {
                    191:   struct alloc *a2;
                    192:   int size, ret = 0, offset, curr_len = 0;
                    193:   int curr_ext2;
                    194:   char extent;
                    195:   int ext_size;
                    196:   char *curr_pos;
                    197: 
                    198:   get_file_info (f_sector);
                    199:   size = FILE_INFO->len-VSTAFS_START_DATA;
                    200:   a2 = FILE_INFO->blocks;
                    201: 
                    202:   if (filepos > 0)
                    203:     {
                    204:       if (filepos < a2[0].a_len * 512 - VSTAFS_START_DATA)
                    205:        {
                    206:          offset = filepos + VSTAFS_START_DATA;
                    207:          extent = 0;
                    208:           curr_len = a2[0].a_len * 512 - offset - filepos;
                    209:        }
                    210:       else
                    211:        {
                    212:           ext_size = a2[0].a_len * 512 - VSTAFS_START_DATA;
                    213:          offset = filepos - ext_size;
                    214:          extent = 1;
                    215:          do
                    216:            {
                    217:              curr_len -= ext_size;
                    218:              offset -= ext_size;
                    219:               ext_size = a2[extent+1].a_len * 512;
                    220:            }
                    221:          while (extent < FILE_INFO->extents && offset>ext_size);
                    222:        }
                    223:     }
                    224:   else
                    225:     {
                    226:       offset = VSTAFS_START_DATA;
                    227:       extent = 0;
                    228:       curr_len = a2[0].a_len * 512 - offset;
                    229:     }
                    230: 
                    231:   curr_pos = addr;
                    232:   if (curr_len > len)
                    233:     curr_len = len;
                    234: 
                    235:   for (curr_ext2=extent;
                    236:        curr_ext2 < FILE_INFO->extents;
                    237:        curr_len = a2[curr_ext].a_len * 512, curr_pos += curr_len, curr_ext2++)
                    238:     {
                    239:       ret += curr_len;
                    240:       size -= curr_len;
                    241:       if (size < 0)
                    242:        {
                    243:          ret += size;
                    244:          curr_len += size;
                    245:        }
                    246: 
                    247:       devread (a2[curr_ext2].a_start,offset, curr_len, curr_pos);
                    248:       offset = 0;
                    249:     }
                    250: 
                    251:   return ret;
                    252: }
                    253: 
                    254: #endif /* FSYS_VSTAFS */

unix.superglobalmegacorp.com

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