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