1 /* libguestfs - the guestfsd daemon
2 * Copyright (C) 2009 Red Hat Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 do_readlink (const char *path)
38 r = readlink (path, link, sizeof link);
41 reply_with_perror ("readlink");
45 ret = strndup (link, r);
47 reply_with_perror ("strndup");
51 return ret; /* caller frees */
55 _link (const char *flag, int symbolic, const char *target, const char *linkname)
62 /* Prefix linkname with sysroot. */
63 buf_linkname = sysroot_path (linkname);
65 reply_with_perror ("malloc");
69 /* Only prefix target if it's _not_ a symbolic link, and if
70 * the target is absolute. Note that the resulting link will
71 * always be "broken" from the p.o.v. of the appliance, ie:
72 * /a -> /b but the path as seen here is /sysroot/b
75 if (!symbolic && target[0] == '/') {
76 buf_target = sysroot_path (target);
78 reply_with_perror ("malloc");
85 r = command (NULL, &err,
86 "ln", flag, "--", /* target could begin with '-' */
87 buf_target ? : target, buf_linkname, NULL);
89 r = command (NULL, &err,
91 buf_target ? : target, buf_linkname, NULL);
95 reply_with_error ("ln%s%s: %s: %s: %s",
98 target, linkname, err);
109 do_ln (const char *target, const char *linkname)
111 return _link (NULL, 0, target, linkname);
115 do_ln_f (const char *target, const char *linkname)
117 return _link ("-f", 0, target, linkname);
121 do_ln_s (const char *target, const char *linkname)
123 return _link ("-s", 1, target, linkname);
127 do_ln_sf (const char *target, const char *linkname)
129 return _link ("-sf", 1, target, linkname);