# vfs.c

Go to the documentation of this file.

    00001 /*****************************************************************************************
    00002  Copyright (c) 2002-2004 The UbixOS Project
    00003  All rights reserved.
    00004
    00005  Redistribution and use in source and binary forms, with or without modification, are
    00006  permitted provided that the following conditions are met:
    00007
    00008  Redistributions of source code must retain the above copyright notice, this list of
    00009  conditions, the following disclaimer and the list of authors.  Redistributions in binary
    00010  form must reproduce the above copyright notice, this list of conditions, the following
    00011  disclaimer and the list of authors in the documentation and/or other materials provided
    00012  with the distribution. Neither the name of the UbixOS Project nor the names of its
    00013  contributors may be used to endorse or promote products derived from this software
    00014  without specific prior written permission.
    00015
    00016  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
    00017  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    00018  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
    00019  THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    00020  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
    00021  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00022  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
    00023  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    00024  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    00025
    00026  $Id: vfs_8c-source.html 88 2016-01-12 00:11:29Z reddawg $
    00027
    00028 *****************************************************************************************/
    00029
    00030 #include <vfs/vfs.h>
    00031 #include <ubixos/vitals.h>
    00032 #include <lib/kmalloc.h>
    00033 #include <lib/kprintf.h>
    00034 #include <lib/string.h>
    00035 #include <sys/kern_descrip.h>
    00036
    00037 /************************************************************************
    00038
    00039 Function: void vfs_init();
    00040
    00041 Description: This Function Initializes The VFS Layer
    00042
    00043 Notes:
    00044
    00045 02/20/2004 - Approved for quality
    00046
    00047 ************************************************************************/
    00048 int vfs_init() {
    00049   /* Set up default fileSystems list */
    00050   systemVitals->fileSystems = 0x0;
    00051
    00052   /* Print information */
    00053   kprintf("vfs0: loaded at address: [0x%X]\n",systemVitals->fileSystems);
    00054
    00055   /* Return so we know things went well */
    00056   return(0x0);
    00057   }
    00058
    00059 struct fileSystem *vfsFindFS(int vfsType) {
    00060   struct fileSystem *tmp = 0x0;
    00061
    00062   /* Search For File System */
    00063   for (tmp=systemVitals->fileSystems;tmp;tmp=tmp->next) {
    00064     /* If Found Return File System */
    00065     if (tmp->vfsType == vfsType) {
    00066       return(tmp);
    00067       }
    00068     }
    00069
    00070   /* If FS Not Found Return NULL */
    00071   return(0x0);
    00072   }
    00073
    00081 int vfsRegisterFS(struct fileSystem newFS) {
    00082 /*
    00083 int vfsType,
    00084 void *vfsInitFS,
    00085 void *vfsRead,
    00086 void *vfsWrite,
    00087 void *vfsOpenFile,
    00088 void *vfsUnlink,
    00089 void *vfsMakeDir,
    00090 void *vfsRemDir,
    00091 void *vfsSync) {
    00092  */
    00093   struct fileSystem *tmpFs = 0x0;
    00094
    00095   if (vfsFindFS(newFS.vfsType) != 0x0) {
    00096     kprintf("FS Is already Registered\n");
    00097     return(0x1);
    00098     }
    00099
    00100   /* Allocate Memory */
    00101   tmpFs = (struct fileSystem *)kmalloc(sizeof(struct fileSystem));
    00102   if (tmpFs == NULL) {
    00103         kprintf("vfsRegisterFS: memory allocation failed\n");
    00104     /* Memory Allocation Failed */
    00105     return(0x1);
    00106     }
    00107
    00108   /* Set Up FS Defaults */
    00109
    00110 /* 2004 7-16-2004 mji
    00111  * Old method:
    00112  * tmpFs->vfsType       = newFS.vfsType;
    00113  * tmpFs->vfsInitFS     = newFS.vfsInitFS;
    00114  * tmpFs->vfsRead       = newFS.vfsRead;
    00115  * tmpFs->vfsWrite      = newFS.vfsWrite;
    00116  * tmpFs->vfsOpenFile   = newFS.vfsOpenFile;
    00117  * tmpFs->vfsUnlink     = newFS.vfsUnlink;
    00118  * tmpFs->vfsMakeDir    = newFS.vfsMakeDir;
    00119  * tmpFs->vfsRemDir     = newFS.vfsRemDir;
    00120  * tmpFs->vfsSync       = newFS.vfsSync;
    00121  */
    00122  /* new method: */
    00123
    00124   memcpy(tmpFs, &newFS, sizeof(struct fileSystem));
    00125   if (!systemVitals->fileSystems) {
    00126     tmpFs->prev               = 0x0;
    00127     tmpFs->next               = 0x0;
    00128     systemVitals->fileSystems = tmpFs;
    00129     }
    00130   else {
    00131     tmpFs->prev                     = 0x0;
    00132     tmpFs->next                     = systemVitals->fileSystems;
    00133     systemVitals->fileSystems->prev = tmpFs;
    00134     systemVitals->fileSystems       = tmpFs;
    00135     }
    00136
    00137   return(0x0);
    00138   }
    00139
    00148 int sys_open(struct thread *td, struct open_args *uap) {
    00149   int          error = 0x0;
    00150   int          index = 0x0;
    00151   struct file *nfp   = 0x0;
    00152
    00153   error = falloc(td,&nfp,&index);
    00154
    00155   if (error)
    00156      return(error);
    00157
    00158   strcpy(nfp->path,uap->path);
    00159
    00160   nfp->fd = fopen(uap->path,"r");
    00161   if (nfp->fd == 0x0)
    00162     td->td_retval[0] = -1;
    00163   else
    00164     td->td_retval[0] = index;
    00165   return (error);
    00166   }
    00167
    00168
    00169 /***
    00170  END
    00171  ***/
    00172