The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/fs/smbfs/symlink.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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/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>
   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 
   35 static void *smb_follow_link(struct dentry *dentry, struct nameidata *nd)
   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) {
   46                         __putname(link);
   47                         link = ERR_PTR(len);
   48                 } else {
   49                         link[len] = 0;
   50                 }
   51         }
   52         nd_set_link(nd, link);
   53         return NULL;
   54 }
   55 
   56 static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
   57 {
   58         char *s = nd_get_link(nd);
   59         if (!IS_ERR(s))
   60                 __putname(s);
   61 }
   62 
   63 const struct inode_operations smb_link_inode_operations =
   64 {
   65         .readlink       = generic_readlink,
   66         .follow_link    = smb_follow_link,
   67         .put_link       = smb_put_link,
   68 };

Cache object: 4f1a6de2c3d219b9daa956783a6efdff


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.