source: svn/trunk/newcon3bcm2_21bu/BSEAV/lib/bfile/bfile_util.c @ 8

Last change on this file since 8 was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 3.6 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2007-2010, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: bfile_util.c $
11 * $brcm_Revision: 2 $
12 * $brcm_Date: 6/23/10 2:22p $
13 *
14 * Module Description:
15 *
16 * Block based cached file I/O
17 *
18 * Revision History:
19 *
20 * $brcm_Log: /BSEAV/lib/bfile/bfile_util.c $
21 *
22 * 2   6/23/10 2:22p gmohile
23 * SW3548-2975 : Return correct offset in b_file_correct_offset
24 *
25 * 1   6/21/10 1:32p vsilyaev
26 * SW3548-2975: File utilities
27 *
28 *
29 *******************************************************************************/
30#include "bstd.h"
31#include "bkni.h"
32#include "bfile_util.h"
33
34BDBG_MODULE(bfile_util);
35
36BDBG_OBJECT_ID(bfile_read_offset);
37struct bfile_read_offset {
38        struct bfile_io_read ops; /* shall be the first member */
39    off_t source_offset;
40    bfile_io_read_t source;
41        BDBG_OBJECT(bfile_read_offset)
42};
43
44
45static ssize_t 
46b_file_read_offset_read(bfile_io_read_t fd, void *buf, size_t length)
47{
48        struct bfile_read_offset *f=(void *)fd;
49        BDBG_OBJECT_ASSERT(f, bfile_read_offset);
50    BDBG_MSG(("b_file_read_offset_read: %#lx %u", (unsigned long)fd, (unsigned)length));
51    return f->source->read(f->source, buf, length);
52}
53
54static off_t
55b_file_correct_offset(const struct bfile_read_offset *f, off_t offset)
56{
57    if(offset>=f->source_offset) {
58        offset -= f->source_offset;
59    } else {
60        offset = 0;
61    }   
62    return offset;
63}
64
65static off_t 
66b_file_read_offset_seek(bfile_io_read_t fd, off_t offset, int whence)
67{
68        struct bfile_read_offset *f=(void *)fd;
69        off_t rc;
70        BDBG_OBJECT_ASSERT(f, bfile_read_offset);
71
72    BDBG_MSG(("b_file_read_offset_seek: %#lx %lu:%d", (unsigned long)fd, (unsigned long)offset, whence));
73    if(whence==SEEK_SET) {
74        offset +=  f->source_offset;
75    }
76    rc = f->source->seek(f->source, offset, whence);
77    if(rc>=0 && rc<f->source_offset) { /* if seeked behind source_offset, seek back */
78        rc = f->source->seek(f->source, f->source_offset, SEEK_SET);
79    }
80    if(rc>=0) { /* correct  returned offset */
81        rc = b_file_correct_offset(f, rc);
82    }
83    return rc;
84}
85
86static int 
87b_file_read_offset_bounds(bfile_io_read_t fd, off_t *first, off_t *last)
88{
89    off_t source_first=0, source_last=0;
90        struct bfile_read_offset *f=(void *)fd;
91    int rc;
92        BDBG_OBJECT_ASSERT(f, bfile_read_offset);
93
94    rc = f->source->bounds(f->source, &source_first, &source_last);
95    source_first = b_file_correct_offset(f, source_first);
96    source_last = b_file_correct_offset(f, source_last);
97    if(first) {
98        *first = source_first;
99    }
100    if(last) {
101        *last = source_last;
102    }
103        return rc;
104}
105
106static const struct bfile_io_read b_file_read_offset_read_ops = {
107        b_file_read_offset_read,
108        b_file_read_offset_seek,
109        b_file_read_offset_bounds,
110        BIO_DEFAULT_PRIORITY
111};
112
113bfile_io_read_t
114bfile_read_offset_attach(bfile_io_read_t source, off_t offset)
115{
116        struct bfile_read_offset *f;
117        f=BKNI_Malloc(sizeof(*f));
118        if (!f) { return NULL; }
119        BDBG_OBJECT_INIT(f, bfile_read_offset);
120        f->ops = b_file_read_offset_read_ops;
121        f->source = source;
122    f->source_offset = offset;
123        return &f->ops;
124}
125
126void 
127bfile_read_offset_detach(bfile_io_read_t file)
128{
129        struct bfile_read_offset *f=(void *)file;
130        BDBG_OBJECT_ASSERT(f, bfile_read_offset);
131
132        BDBG_OBJECT_DESTROY(f, bfile_read_offset);
133        BKNI_Free(f);
134
135        return;
136}
137
138
Note: See TracBrowser for help on using the repository browser.