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