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 (char *path)
38 ABS_PATH (path, NULL);
41 r = readlink (path, link, sizeof link);
44 reply_with_perror ("readlink");
48 ret = strndup (link, r);
50 reply_with_perror ("strndup");
54 return ret; /* caller frees */
58 _link (const char *flag, int symbolic, const char *target, const char *linkname)
66 ABS_PATH (linkname, -1);
67 /* but target does not need to be absolute */
69 /* Prefix linkname with sysroot. */
70 buf_linkname = sysroot_path (linkname);
72 reply_with_perror ("malloc");
76 /* Only prefix target if it's _not_ a symbolic link, and if
77 * the target is absolute. Note that the resulting link will
78 * always be "broken" from the p.o.v. of the appliance, ie:
79 * /a -> /b but the path as seen here is /sysroot/b
82 if (!symbolic && target[0] == '/') {
83 buf_target = sysroot_path (target);
85 reply_with_perror ("malloc");
92 r = command (NULL, &err,
93 "ln", flag, "--", /* target could begin with '-' */
94 buf_target ? : target, buf_linkname, NULL);
96 r = command (NULL, &err,
98 buf_target ? : target, buf_linkname, NULL);
102 reply_with_error ("ln%s%s: %s: %s: %s",
105 target, linkname, err);
116 do_ln (char *target, char *linkname)
118 return _link (NULL, 0, target, linkname);
122 do_ln_f (char *target, char *linkname)
124 return _link ("-f", 0, target, linkname);
128 do_ln_s (char *target, char *linkname)
130 return _link ("-s", 1, target, linkname);
134 do_ln_sf (char *target, char *linkname)
136 return _link ("-sf", 1, target, linkname);