func containerFilePut(c container, path string, r *http.Request) Response { // Extract file ownership and mode from headers uid, gid, mode := shared.ParseLXDFileHeaders(r.Header) // Write file content to a tempfile temp, err := ioutil.TempFile("", "lxd_forkputfile_") if err != nil { return InternalError(err) } defer func() { temp.Close() os.Remove(temp.Name()) }() _, err = io.Copy(temp, r.Body) if err != nil { return InternalError(err) } // Transfer the file into the container err = c.FilePush(temp.Name(), path, uid, gid, mode) if err != nil { return InternalError(err) } return EmptySyncResponse }
func (c *Client) PullFile(container string, p string) (int, int, os.FileMode, io.ReadCloser, error) { uri := c.url(shared.APIVersion, "containers", container, "files") query := url.Values{"path": []string{p}} r, err := c.getRaw(uri + "?" + query.Encode()) if err != nil { return 0, 0, 0, nil, err } uid, gid, mode := shared.ParseLXDFileHeaders(r.Header) return uid, gid, mode, r.Body, nil }
func containerFilePut(pid int, r *http.Request, p string, idmapset *shared.IdmapSet) Response { uid, gid, mode, err := shared.ParseLXDFileHeaders(r.Header) if err != nil { return BadRequest(err) } uid, gid = idmapset.ShiftIntoNs(uid, gid) if uid == -1 || gid == -1 { return BadRequest(fmt.Errorf("unmapped uid or gid specified")) } temp, err := ioutil.TempFile("", "lxd_forkputfile_") if err != nil { return InternalError(err) } defer func() { temp.Close() os.Remove(temp.Name()) }() _, err = io.Copy(temp, r.Body) if err != nil { return InternalError(err) } cmd := exec.Command( os.Args[0], "forkputfile", temp.Name(), fmt.Sprintf("%d", pid), p, fmt.Sprintf("%d", uid), fmt.Sprintf("%d", gid), fmt.Sprintf("%d", mode&os.ModePerm), ) out, err := cmd.CombinedOutput() if err != nil { return InternalError(fmt.Errorf("%s: %s", err.Error(), string(out))) } return EmptySyncResponse }
func containerFilePut(d *Daemon, pid int, r *http.Request, p string, idmapset *shared.IdmapSet) Response { uid, gid, mode := shared.ParseLXDFileHeaders(r.Header) if idmapset != nil { uid, gid = idmapset.ShiftIntoNs(uid, gid) } temp, err := ioutil.TempFile("", "lxd_forkputfile_") if err != nil { return InternalError(err) } defer func() { temp.Close() os.Remove(temp.Name()) }() _, err = io.Copy(temp, r.Body) if err != nil { return InternalError(err) } cmd := exec.Command( d.execPath, "forkputfile", temp.Name(), fmt.Sprintf("%d", pid), p, fmt.Sprintf("%d", uid), fmt.Sprintf("%d", gid), fmt.Sprintf("%d", mode&os.ModePerm), ) out, err := cmd.CombinedOutput() if err != nil { return InternalError(fmt.Errorf(strings.TrimRight(string(out), "\n"))) } return EmptySyncResponse }