/** * kernfs_create_link - create a symlink * @parent: directory to create the symlink in * @name: name of the symlink * @target: target node for the symlink to point to * * Return: the created node on success, ERR_PTR() value on error. * Ownership of the link matches ownership of the target.
*/ struct kernfs_node *kernfs_create_link(struct kernfs_node *parent, constchar *name, struct kernfs_node *target)
{ struct kernfs_node *kn; int error;
kuid_t uid = GLOBAL_ROOT_UID;
kgid_t gid = GLOBAL_ROOT_GID;
if (target->iattr) {
uid = target->iattr->ia_uid;
gid = target->iattr->ia_gid;
}
/* go up to the root, stop at the base */
base = parent; while (kernfs_parent(base)) {
kn = kernfs_parent(target); while (kernfs_parent(kn) && base != kn)
kn = kernfs_parent(kn);
if (base == kn) break;
if ((s - path) + 3 >= PATH_MAX) return -ENAMETOOLONG;
strcpy(s, "../");
s += 3;
base = kernfs_parent(base);
}
/* determine end of target string for reverse fillup */
kn = target; while (kernfs_parent(kn) && kn != base) {
len += strlen(kernfs_rcu_name(kn)) + 1;
kn = kernfs_parent(kn);
}
/* check limits */ if (len < 2) return -EINVAL;
len--; if ((s - path) + len >= PATH_MAX) return -ENAMETOOLONG;
/* reverse fillup of target string from target to base */
kn = target; while (kernfs_parent(kn) && kn != base) { constchar *name = kernfs_rcu_name(kn); int slen = strlen(name);
len -= slen;
memcpy(s + len, name, slen); if (len)
s[--len] = '/';
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.