OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [udf/] [symlink.c] - Blame information for rev 82

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * symlink.c
3
 *
4
 * PURPOSE
5
 *      Symlink handling routines for the OSTA-UDF(tm) filesystem.
6
 *
7
 * COPYRIGHT
8
 *      This file is distributed under the terms of the GNU General Public
9
 *      License (GPL). Copies of the GPL can be obtained from:
10
 *              ftp://prep.ai.mit.edu/pub/gnu/GPL
11
 *      Each contributing author retains all rights to their own work.
12
 *
13
 *  (C) 1998-2001 Ben Fennema
14
 *  (C) 1999 Stelias Computing Inc
15
 *
16
 * HISTORY
17
 *
18
 *  04/16/99 blf  Created.
19
 *
20
 */
21
 
22
#include "udfdecl.h"
23
#include <asm/uaccess.h>
24
#include <linux/errno.h>
25
#include <linux/fs.h>
26
#include <linux/udf_fs.h>
27
#include <linux/time.h>
28
#include <linux/mm.h>
29
#include <linux/stat.h>
30
#include <linux/slab.h>
31
#include <linux/pagemap.h>
32
#include <linux/smp_lock.h>
33
#include <linux/buffer_head.h>
34
#include "udf_i.h"
35
 
36
static void udf_pc_to_char(struct super_block *sb, char *from, int fromlen, char *to)
37
{
38
        struct pathComponent *pc;
39
        int elen = 0;
40
        char *p = to;
41
 
42
        while (elen < fromlen) {
43
                pc = (struct pathComponent *)(from + elen);
44
                switch (pc->componentType) {
45
                case 1:
46
                        if (pc->lengthComponentIdent == 0) {
47
                                p = to;
48
                                *p++ = '/';
49
                        }
50
                        break;
51
                case 3:
52
                        memcpy(p, "../", 3);
53
                        p += 3;
54
                        break;
55
                case 4:
56
                        memcpy(p, "./", 2);
57
                        p += 2;
58
                        /* that would be . - just ignore */
59
                        break;
60
                case 5:
61
                        p += udf_get_filename(sb, pc->componentIdent, p,
62
                                              pc->lengthComponentIdent);
63
                        *p++ = '/';
64
                        break;
65
                }
66
                elen += sizeof(struct pathComponent) + pc->lengthComponentIdent;
67
        }
68
        if (p > to + 1)
69
                p[-1] = '\0';
70
        else
71
                p[0] = '\0';
72
}
73
 
74
static int udf_symlink_filler(struct file *file, struct page *page)
75
{
76
        struct inode *inode = page->mapping->host;
77
        struct buffer_head *bh = NULL;
78
        char *symlink;
79
        int err = -EIO;
80
        char *p = kmap(page);
81
 
82
        lock_kernel();
83
        if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) {
84
                symlink = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode);
85
        } else {
86
                bh = sb_bread(inode->i_sb, udf_block_map(inode, 0));
87
 
88
                if (!bh)
89
                        goto out;
90
 
91
                symlink = bh->b_data;
92
        }
93
 
94
        udf_pc_to_char(inode->i_sb, symlink, inode->i_size, p);
95
        brelse(bh);
96
 
97
        unlock_kernel();
98
        SetPageUptodate(page);
99
        kunmap(page);
100
        unlock_page(page);
101
        return 0;
102
 
103
out:
104
        unlock_kernel();
105
        SetPageError(page);
106
        kunmap(page);
107
        unlock_page(page);
108
        return err;
109
}
110
 
111
/*
112
 * symlinks can't do much...
113
 */
114
const struct address_space_operations udf_symlink_aops = {
115
        .readpage               = udf_symlink_filler,
116
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.