Subversion Repositories HelenOS

Rev

Rev 2365 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 1987,1997, Prentice Hall
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use of the MINIX operating system in source and
  6.  * binary forms, with or without modification, are permitted provided
  7.  * that the following conditions are met:
  8.  
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  
  12.  * - Redistributions in binary form must reproduce the above
  13.  *   copyright notice, this list of conditions and the following
  14.  *   disclaimer in the documentation and/or other materials provided
  15.  *   with the distribution.
  16.  
  17.  * - Neither the name of Prentice Hall nor the names of the software
  18.  *   authors or contributors may be used to endorse or promote
  19.  *   products derived from this software without specific prior
  20.  *   written permission.
  21.  
  22.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND
  23.  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
  24.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  25.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  26.  * IN NO EVENT SHALL PRENTICE HALL OR ANY AUTHORS OR CONTRIBUTORS BE
  27.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  28.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  29.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  30.  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  31.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  32.  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  33.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  34.  */
  35.  
  36. /** @addtogroup FileSystemImpl
  37. * @{
  38. */
  39.  
  40. /**
  41.  * @file    dir.c
  42.  * @brief   This file contains the procedures for support directory operations.
  43.  */
  44.  
  45. #include <stdio.h>
  46. #include "fs.h"
  47. #include "dir.h"
  48. #include "block.h"
  49. #include "inode.h"
  50. #include "param.h"
  51.  
  52. /**
  53.  * Return total number of directory entries
  54.  */
  55. int do_sum()
  56. {  
  57.    
  58.     /* Perform dsum system call. */
  59.  
  60.     inode_t *rip;
  61.     int dir_count;
  62.     offset_t dir_size;
  63.    
  64.     rip = fp->fp_workdir;
  65.     dir_size = rip->i_size;
  66.    
  67.     /* We must calculate with both versions of directory entry sizes. */
  68.     if (rip->i_sp->s_extend) {
  69.         dir_count = dir_size/DIR_ENTRY_SIZE;
  70.     }
  71.     else {
  72.         dir_count = dir_size/DIR_ENTRY_SIZE_EX;
  73.     }
  74.     if (dir_size % DIR_ENTRY_SIZE_EX != 0) {
  75.         print_console("dir_size % DIR_ENTRY_SIZE_EX != 0\n");
  76.     }
  77.  
  78.     return dir_count;
  79. }
  80.    
  81. /**
  82.  * Fill in the user buffer with directory entry specified by number
  83.  */    
  84. int do_readentry()
  85. {
  86.    
  87.     /* Perform readentry(numb, buffer) system call. */
  88.  
  89.     int actual_sum, extend;
  90.     offset_t pos;
  91.     inode_t *rip;
  92.     block_num_t b;
  93.     block_t *bp;
  94.     register int r;
  95.     direct_t *dir;
  96.     directex_t *direx;
  97.    
  98.     /* Get actual number of directory entries within the block. */
  99.     actual_sum = do_sum();
  100.     if (entry_number < 0 || actual_sum <= entry_number)
  101.         return FS_EINVAL;
  102.        
  103.     rip = fp->fp_workdir;
  104.     extend = rip->i_sp->s_extend;
  105.  
  106.     if (extend) {
  107.         pos = entry_number * DIR_ENTRY_SIZE_EX;
  108.     }
  109.     else {
  110.         pos = entry_number * DIR_ENTRY_SIZE;
  111.     }
  112.  
  113.     /* Get number of block within the entry is. */
  114.     b = read_map(rip, pos);
  115.     if (b == NO_BLOCK)
  116.         return 0;  
  117.    
  118.     bp = get_block(b);
  119.  
  120.     /* Copy the entry data into address space of actual consument. */
  121.     if (extend) {
  122.         direx = &bp->b.b__direx[entry_number];
  123.         memcpy(fp->buffer, (void*)direx, DIR_ENTRY_SIZE_EX);
  124.     }  
  125.     else {
  126.         dir = &bp->b.b__dir[entry_number];
  127.         memcpy(fp->buffer, (void*)dir, DIR_ENTRY_SIZE);
  128.     }
  129.  
  130.     r = (extend ? DIR_ENTRY_SIZE_EX : DIR_ENTRY_SIZE);
  131.        
  132.     return r;  
  133. }
  134.  
  135.  
  136. /**
  137.  * }
  138.  */
  139.  
  140.