in tools/build_tar/buildtar.go [204:280]
func (f *tarFile) addFile(file, dest string) error {
dest = strings.TrimLeft(dest, "/")
dest = filepath.Clean(dest)
uid := f.meta.getUID(dest)
gid := f.meta.getGID(dest)
uname := f.meta.getUname(dest)
gname := f.meta.getGname(dest)
dest = filepath.Join(strings.TrimLeft(f.directory, "/"), dest)
dest = filepath.Clean(dest)
if ok := f.tryReservePath(dest); !ok {
klog.Warningf("Duplicate file in archive: %v, picking first occurence", dest)
return nil
}
info, err := os.Stat(file)
if err != nil {
return err
}
mode := f.meta.getMode(dest)
// If mode is unspecified, derive the mode from the file's mode.
if mode == 0 {
mode = os.FileMode(0644)
if info.Mode().Perm()&os.FileMode(0111) != 0 {
mode = os.FileMode(0755)
}
}
header := tar.Header{
Name: dest,
Mode: int64(mode),
Uid: uid,
Gid: gid,
Size: 0,
Uname: uname,
Gname: gname,
ModTime: f.meta.modTime,
}
if err := f.makeDirs(header); err != nil {
return err
}
switch {
case info.Mode()&os.ModeSymlink != 0:
return fmt.Errorf("addFile: didn't expect symlink: %s", file)
case info.Mode()&os.ModeNamedPipe != 0:
return fmt.Errorf("addFile: didn't expect named pipe: %s", file)
case info.Mode()&os.ModeSocket != 0:
return fmt.Errorf("addFile: didn't expect socket: %s", file)
case info.Mode()&os.ModeDevice != 0:
return fmt.Errorf("addFile: didn't expect device: %s", file)
case info.Mode()&os.ModeDir != 0:
header.Typeflag = tar.TypeDir
if err := f.tw.WriteHeader(&header); err != nil {
return err
}
default:
//regular file
header.Typeflag = tar.TypeReg
b, err := ioutil.ReadFile(file)
if err != nil {
return err
}
header.Size = int64(len(b))
if err := f.tw.WriteHeader(&header); err != nil {
return err
}
if _, err := f.tw.Write(b); err != nil {
return err
}
}
return nil
}