| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package pkgsvr |
| |
| import ( |
| "flag" |
| "log" |
| |
| "syscall/zx" |
| "syscall/zx/mxruntime" |
| |
| "fuchsia.googlesource.com/pmd/amberer" |
| "fuchsia.googlesource.com/pmd/pkgfs" |
| ) |
| |
| // Main starts a package server program |
| func Main() { |
| var ( |
| blob = flag.String("blob", "/blob", "Path at which to store blobs") |
| index = flag.String("index", "/data/pkgfs_index", "Path at which to store package index") |
| ) |
| |
| log.SetPrefix("pkgsvr: ") |
| log.SetFlags(0) // no time required |
| flag.Parse() |
| |
| sysPkg := flag.Arg(0) |
| |
| // TODO(raggi): Reading from the index should be delayed until after verified boot completion |
| fs, err := pkgfs.New(*index, *blob, amberer.NewAmberClient()) |
| if err != nil { |
| log.Fatalf("pkgfs: initialization failed: %s", err) |
| } |
| |
| h := mxruntime.GetStartupHandle(mxruntime.HandleInfo{Type: mxruntime.HandleUser0, Arg: 0}) |
| if h == zx.HandleInvalid { |
| log.Fatalf("pkgfs: mount failed, no serving handle supplied in startup arguments") |
| } |
| |
| if sysPkg != "" { |
| var err error |
| |
| if err = fs.SetSystemRoot(sysPkg); err != nil { |
| log.Printf("system: failed to set system root from blob %q: %s", sysPkg, err) |
| } |
| log.Printf("system: will be served from %s", sysPkg) |
| |
| // In the case of an error, we don't signal fshost for fuchsia_start, as system won't be readable. |
| if err == nil { |
| if err := zx.ProcHandle.Signal(zx.SignalNone, zx.SignalUser0); err != nil { |
| log.Printf("system: failed to SignalUser0 on ProcHandle, fuchsia may not start: %s", err) |
| } |
| } |
| } else { |
| log.Printf("system: no system package blob supplied") |
| } |
| |
| log.Printf("pkgfs serving index %s from blobfs %s", *index, *blob) |
| if err := fs.Serve(zx.Channel(h)); err != nil { |
| log.Fatalf("pkgfs: serve failed on startup handle: %s", err) |
| } |
| } |