source: rtems/cpukit/libfs/src/dosfs/msdos_initsupp.c @ ae55da72

4.115
Last change on this file since ae55da72 was 9b4422a2, checked in by Joel Sherrill <joel.sherrill@…>, on 05/03/12 at 15:09:24

Remove All CVS Id Strings Possible Using a Script

Script does what is expected and tries to do it as
smartly as possible.

+ remove occurrences of two blank comment lines

next to each other after Id string line removed.

+ remove entire comment blocks which only exited to

contain CVS Ids

+ If the processing left a blank line at the top of

a file, it was removed.

  • Property mode set to 100644
File size: 4.1 KB
Line 
1/*
2 *  MSDOS Initialization support routine implementation
3 *
4 *  Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
5 *  Author: Eugeny S. Mints <Eugeny.Mints@oktet.ru>
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.rtems.com/license/LICENSE.
10 */
11
12#if HAVE_CONFIG_H
13#include "config.h"
14#endif
15
16#include <sys/types.h>
17#include <fcntl.h>
18#include <unistd.h>
19#include <stdlib.h>
20#include <stdio.h>
21
22#include <rtems.h>
23#include <rtems/libio_.h>
24
25#include "fat.h"
26#include "fat_fat_operations.h"
27#include "fat_file.h"
28
29#include "msdos.h"
30
31/* msdos_initialize_support --
32 *     MSDOS filesystem initialization
33 *
34 * PARAMETERS:
35 *     temp_mt_entry      - mount table entry
36 *     op_table           - filesystem operations table
37 *     file_handlers      - file operations table
38 *     directory_handlers - directory operations table
39 *
40 * RETURNS:
41 *     RC_OK and filled temp_mt_entry on success, or -1 if error occured
42 *     (errno set apropriately)
43 *
44 */
45int
46msdos_initialize_support(
47    rtems_filesystem_mount_table_entry_t    *temp_mt_entry,
48    const rtems_filesystem_operations_table *op_table,
49    const rtems_filesystem_file_handlers_r  *file_handlers,
50    const rtems_filesystem_file_handlers_r  *directory_handlers
51    )
52{
53    int                rc = RC_OK;
54    rtems_status_code  sc = RTEMS_SUCCESSFUL;
55    msdos_fs_info_t   *fs_info = NULL;
56    fat_file_fd_t     *fat_fd = NULL;
57    fat_dir_pos_t      root_pos;
58    uint32_t           cl_buf_size;
59
60    fs_info = (msdos_fs_info_t *)calloc(1, sizeof(msdos_fs_info_t));
61    if (!fs_info)
62        rtems_set_errno_and_return_minus_one(ENOMEM);
63
64    temp_mt_entry->fs_info = fs_info;
65
66    rc = fat_init_volume_info(temp_mt_entry);
67    if (rc != RC_OK)
68    {
69        free(fs_info);
70        return rc;
71    }
72
73    fs_info->file_handlers      = file_handlers;
74    fs_info->directory_handlers = directory_handlers;
75
76    /*
77     * open fat-file which correspondes to  root directory
78     * (so inode number 0x00000010 is always used for root directory)
79     */
80    fat_dir_pos_init(&root_pos);
81    root_pos.sname.cln = FAT_ROOTDIR_CLUSTER_NUM;
82    rc = fat_file_open(temp_mt_entry, &root_pos, &fat_fd);
83    if (rc != RC_OK)
84    {
85        fat_shutdown_drive(temp_mt_entry);
86        free(fs_info);
87        return rc;
88    }
89
90    /* again: unfortunately "fat-file" is just almost fat file :( */
91    fat_fd->fat_file_type = FAT_DIRECTORY;
92    fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
93    fat_fd->cln = fs_info->fat.vol.rdir_cl;
94
95    fat_fd->map.file_cln = 0;
96    fat_fd->map.disk_cln = fat_fd->cln;
97
98    /* if we have FAT12/16 */
99    if ( fat_fd->cln == 0 )
100    {
101        fat_fd->fat_file_size = fs_info->fat.vol.rdir_size;
102        cl_buf_size = (fs_info->fat.vol.bpc > fs_info->fat.vol.rdir_size) ?
103                      fs_info->fat.vol.bpc                                :
104                      fs_info->fat.vol.rdir_size;
105    }
106    else
107    {
108        rc = fat_file_size(temp_mt_entry, fat_fd);
109        if ( rc != RC_OK )
110        {
111            fat_file_close(temp_mt_entry, fat_fd);
112            fat_shutdown_drive(temp_mt_entry);
113            free(fs_info);
114            return rc;
115        }
116        cl_buf_size = fs_info->fat.vol.bpc;
117    }
118
119    fs_info->cl_buf = (uint8_t *)calloc(cl_buf_size, sizeof(char));
120    if (fs_info->cl_buf == NULL)
121    {
122        fat_file_close(temp_mt_entry, fat_fd);
123        fat_shutdown_drive(temp_mt_entry);
124        free(fs_info);
125        rtems_set_errno_and_return_minus_one(ENOMEM);
126    }
127
128    sc = rtems_semaphore_create(3,
129                                1,
130                                RTEMS_BINARY_SEMAPHORE | RTEMS_FIFO,
131                                0,
132                                &fs_info->vol_sema);
133    if (sc != RTEMS_SUCCESSFUL)
134    {
135        fat_file_close(temp_mt_entry, fat_fd);
136        fat_shutdown_drive(temp_mt_entry);
137        free(fs_info->cl_buf);
138        free(fs_info);
139        rtems_set_errno_and_return_minus_one( EIO );
140    }
141
142    temp_mt_entry->mt_fs_root->location.node_access = fat_fd;
143    temp_mt_entry->mt_fs_root->location.handlers = directory_handlers;
144    temp_mt_entry->mt_fs_root->location.ops = op_table;
145
146    return rc;
147}
Note: See TracBrowser for help on using the repository browser.