mirror of
https://github.com/containerd/containerd.git
synced 2026-11-06 21:37:23 +00:00
Calling link(2) with a symlink as the target will cause FreeBSD to attempt to create a new hard link pointing to the target of the symlink rather than a hardlink to the symlink itself. By contrast, Linux creates a hardlink to the symlink. Use linkat(2) instead, which accepts a flag controlling this behavior. If linkat(2) is called with AT_SYMLINK_FOLLOW, it will behave the same as link(2). If linkat(2) is called without AT_SYMLINK_FOLLOW, it will behave the same as Linux's link(2) instead. See FreeBSD's implementation of ln(1), which uses linkat(2) and controls this behavior by way of the -P and -L flags: https://github.com/freebsd/freebsd-src/blob/30031172534c22695ab7b26a9420bda7b20b0824/bin/ln/ln.c#L342-L343 Signed-off-by: Samuel Karp <me@samuelkarp.com>
26 lines
726 B
Go
26 lines
726 B
Go
//go:build !freebsd
|
|
|
|
/*
|
|
Copyright The containerd Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package archive
|
|
|
|
import "os"
|
|
|
|
func link(oldname, newname string) error {
|
|
return os.Link(oldname, newname)
|
|
}
|