]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * symlink.c | |
3 | * | |
4 | * Copyright (C) 2002 by John Newbigin | |
5 | * | |
6 | * Please add a note about your changes to smbfs in the ChangeLog file. | |
7 | */ | |
8 | ||
1da177e4 LT |
9 | #include <linux/kernel.h> |
10 | #include <linux/errno.h> | |
11 | #include <linux/fcntl.h> | |
12 | #include <linux/stat.h> | |
13 | #include <linux/mm.h> | |
14 | #include <linux/slab.h> | |
15 | #include <linux/pagemap.h> | |
1da177e4 LT |
16 | #include <linux/net.h> |
17 | #include <linux/namei.h> | |
18 | ||
19 | #include <asm/uaccess.h> | |
20 | #include <asm/system.h> | |
21 | ||
22 | #include <linux/smbno.h> | |
23 | #include <linux/smb_fs.h> | |
24 | ||
25 | #include "smb_debug.h" | |
26 | #include "proto.h" | |
27 | ||
28 | int smb_symlink(struct inode *inode, struct dentry *dentry, const char *oldname) | |
29 | { | |
30 | DEBUG1("create symlink %s -> %s/%s\n", oldname, DENTRY_PATH(dentry)); | |
31 | ||
32 | return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname); | |
33 | } | |
34 | ||
008b150a | 35 | static void *smb_follow_link(struct dentry *dentry, struct nameidata *nd) |
1da177e4 LT |
36 | { |
37 | char *link = __getname(); | |
38 | DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry)); | |
39 | ||
40 | if (!link) { | |
41 | link = ERR_PTR(-ENOMEM); | |
42 | } else { | |
43 | int len = smb_proc_read_link(server_from_dentry(dentry), | |
44 | dentry, link, PATH_MAX - 1); | |
45 | if (len < 0) { | |
53b27584 | 46 | __putname(link); |
1da177e4 LT |
47 | link = ERR_PTR(len); |
48 | } else { | |
49 | link[len] = 0; | |
50 | } | |
51 | } | |
52 | nd_set_link(nd, link); | |
008b150a | 53 | return NULL; |
1da177e4 LT |
54 | } |
55 | ||
008b150a | 56 | static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p) |
1da177e4 LT |
57 | { |
58 | char *s = nd_get_link(nd); | |
59 | if (!IS_ERR(s)) | |
53b27584 | 60 | __putname(s); |
1da177e4 LT |
61 | } |
62 | ||
c5ef1c42 | 63 | const struct inode_operations smb_link_inode_operations = |
1da177e4 LT |
64 | { |
65 | .readlink = generic_readlink, | |
66 | .follow_link = smb_follow_link, | |
67 | .put_link = smb_put_link, | |
68 | }; |