Subversion Repositories HelenOS

Rev

Rev 2368 | 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.  
  37. /* This file contains the procedures that manipulate file descriptors. */
  38.  
  39. /*   
  40.  * Methods:
  41.  * get_fd:    look for free file descriptor and free filp slots
  42.  * get_filp:  look up the filp entry for a given file descriptor
  43.  * find_filp: find a filp slot that points to a given inode
  44.  */
  45.  
  46.  
  47. #include "fs.h"
  48. #include "file.h"
  49. #include "fproc.h"
  50. #include "inode.h"
  51.    
  52.    
  53. int get_fd(int start, int *k, filp_t **fpt)
  54. {
  55.     /* Look for a free file descriptor and a free filp slot. */
  56.    
  57.     register filp_t *f;
  58.     register int i;
  59.    
  60.     *k = -1;                      /* we need a way to tell if file desc found */
  61.    
  62.     /* Search the fproc fp_filp table for a free file descriptor. */
  63.     for (i = start; i < OPEN_MAX; i++) {
  64.         if (fp->fp_filp[i] == NIL_FILP) {
  65.                 /* A file descriptor has been located. */
  66.                 *k = i;
  67.                     break;
  68.         }
  69.     }
  70.    
  71.     /* Check to see if a file descriptor has been found. */
  72.     if (*k < 0)
  73.         return FS_EMFILE;   /* this is why we initialized k to -1 */
  74.    
  75.     /* Now that a file descriptor has been found, look for a free filp slot. */
  76.     for (f = &filp[0]; f < &filp[NR_FILPS]; f++) {
  77.         if (f->filp_count == 0) {
  78.                 f->filp_mode = R_BIT;
  79.             f->filp_pos = 0L;
  80.                     f->filp_flags = 0;
  81.                     *fpt = f;
  82.                     return OK;
  83.             }
  84.     }
  85.    
  86.     /* If control passes here, the filp table must be full.  Report that back. */
  87.     return FS_ENFILE;
  88. }
  89.    
  90.    
  91. filp_t *get_filp(int fild)
  92. {
  93.    
  94.     /* See if 'fild' refers to a valid file descr.  If so, return its filp ptr. */
  95.    
  96.     err_code = FS_EBADF;
  97.     if (fild < 0 || fild >= OPEN_MAX )
  98.         return NIL_FILP;
  99.      
  100.     return(fp->fp_filp[fild]);    /* may also be NIL_FILP */
  101. }
  102.    
  103.    
  104. filp_t *find_filp(register inode_t *rip)
  105. {
  106.    
  107.     /* Find a filp slot that refers to the inode 'rip' in a way as described.
  108.      * Used for determining whether somebody is still interested in.
  109.      * Like 'get_fd' it performs its job by linear search through the filp table.
  110.      */
  111.    
  112.     register filp_t *f;
  113.    
  114.     for (f = &filp[0]; f < &filp[NR_FILPS]; f++) {
  115.         if (f->filp_count != 0 && f->filp_ino == rip){
  116.                 return f;
  117.             }
  118.     }
  119.    
  120.     /* If control passes here, the filp wasn't there.  Report that back. */
  121.     return NIL_FILP;
  122. }
  123.  
  124.