On 04.09.2014 17:36, Peter Jones wrote: > This lets us make /boot/grub2/grubenv a symlink to > /boot/efi/EFI/fedora/grubenv even though they're different mount points, > which allows /usr/bin/grub2-editenv to be the same across platforms > (i.e. UEFI vs BIOS). > > Signed-off-by: Peter Jones <pjo...@redhat.com> > Reviewed-by: Adam Jackson <a...@redhat.com> > --- > Makefile.util.def | 9 +++++++++ > util/editenv.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- > 2 files changed, 53 insertions(+), 2 deletions(-) > > diff --git a/Makefile.util.def b/Makefile.util.def > index 8f40e78..87029a1 100644 > --- a/Makefile.util.def > +++ b/Makefile.util.def > @@ -228,8 +228,17 @@ program = { > > common = util/grub-editenv.c; > common = util/editenv.c; > + common = util/grub-install-common.c; > common = grub-core/osdep/init.c; > + common = grub-core/osdep/compress.c; > + extra_dist = grub-core/osdep/unix/compress.c; > + extra_dist = grub-core/osdep/basic/compress.c; > + common = util/mkimage.c; > + common = grub-core/osdep/config.c; > + common = util/config.c; > + common = util/resolve.c; > > + ldadd = '$(LIBLZMA)'; > ldadd = libgrubmods.a; > ldadd = libgrubgcry.a; > ldadd = libgrubkern.a; > diff --git a/util/editenv.c b/util/editenv.c > index c6f8d22..d8d1dad 100644 > --- a/util/editenv.c > +++ b/util/editenv.c > @@ -37,6 +37,7 @@ grub_util_create_envblk_file (const char *name) > FILE *fp; > char *buf; > char *namenew; > + char *rename_target = xstrdup(name); > > buf = xmalloc (DEFAULT_ENVBLK_SIZE); > > @@ -59,7 +60,48 @@ grub_util_create_envblk_file (const char *name) > free (buf); > fclose (fp); > > - if (grub_util_rename (namenew, name) < 0) > - grub_util_error (_("cannot rename the file %s to %s"), namenew, name); > + ssize_t size = 1; > + while (1) > + { > + char *linkbuf; > + ssize_t retsize; > + > + linkbuf = xmalloc(size+1); > + retsize = grub_util_readlink (rename_target, linkbuf, size);
If I get this code correctly you essentially canonicalize the link manually. Why not use already available canonicalization functions? > + if (retsize < 0 && (errno == ENOENT || errno == EINVAL)) > + { > + free (linkbuf); > + break; > + } > + else if (retsize < 0) > + { > + grub_util_error (_("cannot rename the file %s to %s: %m"), namenew, > name); > + free (linkbuf); > + free (namenew); > + return; > + } > + else if (retsize == size) > + { > + free(linkbuf); > + size += 128; > + continue; > + } > + > + free (rename_target); > + linkbuf[retsize] = '\0'; > + rename_target = linkbuf; > + } > + > + int rc = grub_util_rename (namenew, rename_target); > + if (rc < 0 && errno == EXDEV) > + { > + rc = grub_install_copy_file (namenew, rename_target, 1); > + grub_util_unlink (namenew); > + } > + > + if (rc < 0) > + grub_util_error (_("cannot rename the file %s to %s: %m"), namenew, > name); > + > free (namenew); > + free (rename_target); > } >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel