From 6f62d083df7bc9eb3db9532681bb37796669a1bb Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Mon, 12 Jun 2017 15:41:27 +0200 Subject: [PATCH] Remove initrd library, it has moved to moby tool As we are not using it here, makes more sense for it to go there. Moved with history in https://github.com/moby/tool/pull/78 Signed-off-by: Justin Cormack --- src/initrd/initrd.go | 180 ------------------------------------------- src/pad4/pad4.go | 46 ----------- 2 files changed, 226 deletions(-) delete mode 100644 src/initrd/initrd.go delete mode 100644 src/pad4/pad4.go diff --git a/src/initrd/initrd.go b/src/initrd/initrd.go deleted file mode 100644 index 6d83e6728..000000000 --- a/src/initrd/initrd.go +++ /dev/null @@ -1,180 +0,0 @@ -package initrd - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "errors" - "io" - "io/ioutil" - - "github.com/linuxkit/linuxkit/src/pad4" - "github.com/surma/gocpio" -) - -// Writer is an io.WriteCloser that writes to an initrd -// This is a compressed cpio archive, zero padded to 4 bytes -type Writer struct { - pw *pad4.Writer - gw *gzip.Writer - cw *cpio.Writer -} - -func typeconv(thdr *tar.Header) int64 { - switch thdr.Typeflag { - case tar.TypeReg: - return cpio.TYPE_REG - case tar.TypeRegA: - return cpio.TYPE_REG - // Currently hard links not supported very well :) - case tar.TypeLink: - thdr.Linkname = "/" + thdr.Linkname - return cpio.TYPE_SYMLINK - case tar.TypeSymlink: - return cpio.TYPE_SYMLINK - case tar.TypeChar: - return cpio.TYPE_CHAR - case tar.TypeBlock: - return cpio.TYPE_BLK - case tar.TypeDir: - return cpio.TYPE_DIR - case tar.TypeFifo: - return cpio.TYPE_FIFO - default: - return -1 - } -} - -func copyTarEntry(w *Writer, thdr *tar.Header, r *tar.Reader) (written int64, err error) { - tp := typeconv(thdr) - if tp == -1 { - return written, errors.New("cannot convert tar file") - } - size := thdr.Size - if tp == cpio.TYPE_SYMLINK { - size = int64(len(thdr.Linkname)) - } - chdr := cpio.Header{ - Mode: thdr.Mode, - Uid: thdr.Uid, - Gid: thdr.Gid, - Mtime: thdr.ModTime.Unix(), - Size: size, - Devmajor: thdr.Devmajor, - Devminor: thdr.Devminor, - Type: tp, - Name: thdr.Name, - } - err = w.WriteHeader(&chdr) - if err != nil { - return - } - var n int64 - switch tp { - case cpio.TYPE_SYMLINK: - buffer := bytes.NewBufferString(thdr.Linkname) - n, err = io.Copy(w, buffer) - case cpio.TYPE_REG: - n, err = io.Copy(w, r) - } - written += n - - return -} - -// CopyTar copies a tar stream into an initrd -func CopyTar(w *Writer, r *tar.Reader) (written int64, err error) { - for { - var thdr *tar.Header - thdr, err = r.Next() - if err == io.EOF { - return written, nil - } - if err != nil { - return - } - written, err = copyTarEntry(w, thdr, r) - if err != nil { - return - } - } -} - -// CopySplitTar copies a tar stream into an initrd, but splits out kernel and cmdline -func CopySplitTar(w *Writer, r *tar.Reader) (kernel []byte, cmdline string, err error) { - for { - var thdr *tar.Header - thdr, err = r.Next() - if err == io.EOF { - return kernel, cmdline, nil - } - if err != nil { - return - } - switch thdr.Name { - case "boot/kernel": - kernel, err = ioutil.ReadAll(r) - if err != nil { - return - } - case "boot/cmdline": - var buf []byte - buf, err = ioutil.ReadAll(r) - if err != nil { - return - } - cmdline = string(buf) - case "boot": - // skip this entry - default: - _, err = copyTarEntry(w, thdr, r) - if err != nil { - return - } - } - } -} - -// NewWriter creates a writer that will output an initrd stream -func NewWriter(w io.Writer) *Writer { - initrd := new(Writer) - initrd.pw = pad4.NewWriter(w) - initrd.gw = gzip.NewWriter(initrd.pw) - initrd.cw = cpio.NewWriter(initrd.gw) - - return initrd -} - -// WriteHeader writes a cpio header into an initrd -func (w *Writer) WriteHeader(hdr *cpio.Header) error { - return w.cw.WriteHeader(hdr) -} - -// Write writes a cpio file into an initrd -func (w *Writer) Write(b []byte) (n int, e error) { - return w.cw.Write(b) -} - -// Close closes the writer -func (w *Writer) Close() error { - err1 := w.cw.Close() - err2 := w.gw.Close() - err3 := w.pw.Close() - if err1 != nil { - return err1 - } - if err2 != nil { - return err2 - } - if err3 != nil { - return err3 - } - return nil -} - -// Copy reads a tarball in a stream and outputs a compressed init ram disk -func Copy(w *Writer, r io.Reader) (int64, error) { - tr := tar.NewReader(r) - - return CopyTar(w, tr) -} diff --git a/src/pad4/pad4.go b/src/pad4/pad4.go deleted file mode 100644 index 008153b26..000000000 --- a/src/pad4/pad4.go +++ /dev/null @@ -1,46 +0,0 @@ -package pad4 - -import ( - "bytes" - "io" -) - -// A Writer is an io.WriteCloser. Writes are padded with zeros to 4 byte boundary -type Writer struct { - w io.Writer - count int -} - -// Write writes output -func (pad Writer) Write(p []byte) (int, error) { - n, err := pad.w.Write(p) - if err != nil { - return 0, err - } - pad.count += n - return n, nil -} - -// Close adds the padding -func (pad Writer) Close() error { - mod4 := pad.count & 3 - if mod4 == 0 { - return nil - } - zero := make([]byte, 4-mod4) - buf := bytes.NewBuffer(zero) - n, err := io.Copy(pad.w, buf) - if err != nil { - return err - } - pad.count += int(n) - return nil -} - -// NewWriter provides a new io.WriteCloser that zero pads the -// output to a multiple of four bytes -func NewWriter(w io.Writer) *Writer { - pad := new(Writer) - pad.w = w - return pad -}