Function: make-symbolic-link

make-symbolic-link is an interactive function defined in fileio.c.

Signature

(make-symbolic-link TARGET LINKNAME &optional OK-IF-ALREADY-EXISTS)

Documentation

Make a symbolic link to TARGET, named LINKNAME.

If LINKNAME is a directory name, make a like-named symbolic link under LINKNAME.

Signal a file-already-exists error if a file LINKNAME already exists unless optional third argument OK-IF-ALREADY-EXISTS is non-nil. An integer third arg means request confirmation if LINKNAME already exists, and expand leading "~" or strip leading "/:" in TARGET. This happens for interactive use with M-x.

Other relevant functions are documented in the file group.

View in manual

Probably introduced at or before Emacs version 18.

Key Bindings

Shortdoc

;; file
(make-symbolic-link "/tmp/foo" "/tmp/foosymlink")

Source Code

// Defined in /usr/src/emacs/src/fileio.c
{
  Lisp_Object handler;
  Lisp_Object encoded_target, encoded_linkname;

  CHECK_STRING (target);
  if (FIXNUMP (ok_if_already_exists))
    {
      if (SREF (target, 0) == '~')
	target = Fexpand_file_name (target, Qnil);
      else if (SREF (target, 0) == '/' && SREF (target, 1) == ':')
	target = Fsubstring_no_properties (target, make_fixnum (2), Qnil);
    }
  linkname = expand_cp_target (target, linkname);

  /* If the new link name has special constructs in it,
     call the corresponding file name handler.  */
  handler = Ffind_file_name_handler (linkname, Qmake_symbolic_link);
  if (!NILP (handler))
    return call4 (handler, Qmake_symbolic_link, target,
		  linkname, ok_if_already_exists);

  encoded_target = ENCODE_FILE (target);
  encoded_linkname = ENCODE_FILE (linkname);

  if (symlink (SSDATA (encoded_target), SSDATA (encoded_linkname)) == 0)
    return Qnil;

  if (errno == ENOSYS)
    xsignal1 (Qfile_error,
	      build_string ("Symbolic links are not supported"));

  if (errno == EEXIST)
    {
      if (NILP (ok_if_already_exists)
	  || FIXNUMP (ok_if_already_exists))
	barf_or_query_if_file_exists (linkname, true, "make it a link",
				      FIXNUMP (ok_if_already_exists), false);
      unlink (SSDATA (encoded_linkname));
      if (symlink (SSDATA (encoded_target), SSDATA (encoded_linkname)) == 0)
	return Qnil;
    }

  report_file_error ("Making symbolic link", list2 (target, linkname));
}