]>
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 | ||
2116b7a4 AB |
22 | #include "smbno.h" |
23 | #include "smb_fs.h" | |
1da177e4 LT |
24 | #include "smb_debug.h" |
25 | #include "proto.h" | |
26 | ||
27 | int smb_symlink(struct inode *inode, struct dentry *dentry, const char *oldname) | |
28 | { | |
29 | DEBUG1("create symlink %s -> %s/%s\n", oldname, DENTRY_PATH(dentry)); | |
30 | ||
31 | return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname); | |
32 | } | |
33 | ||
008b150a | 34 | static void *smb_follow_link(struct dentry *dentry, struct nameidata *nd) |
1da177e4 LT |
35 | { |
36 | char *link = __getname(); | |
37 | DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry)); | |
38 | ||
39 | if (!link) { | |
40 | link = ERR_PTR(-ENOMEM); | |
41 | } else { | |
42 | int len = smb_proc_read_link(server_from_dentry(dentry), | |
43 | dentry, link, PATH_MAX - 1); | |
44 | if (len < 0) { | |
53b27584 | 45 | __putname(link); |
1da177e4 LT |
46 | link = ERR_PTR(len); |
47 | } else { | |
48 | link[len] = 0; | |
49 | } | |
50 | } | |
51 | nd_set_link(nd, link); | |
008b150a | 52 | return NULL; |
1da177e4 LT |
53 | } |
54 | ||
008b150a | 55 | static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p) |
1da177e4 LT |
56 | { |
57 | char *s = nd_get_link(nd); | |
58 | if (!IS_ERR(s)) | |
53b27584 | 59 | __putname(s); |
1da177e4 LT |
60 | } |
61 | ||
c5ef1c42 | 62 | const struct inode_operations smb_link_inode_operations = |
1da177e4 LT |
63 | { |
64 | .readlink = generic_readlink, | |
65 | .follow_link = smb_follow_link, | |
66 | .put_link = smb_put_link, | |
67 | }; |