github.com/apptainer/singularity@v3.1.1+incompatible/internal/app/starter/stage.go (about) 1 // Copyright (c) 2018, Sylabs Inc. All rights reserved. 2 // This software is licensed under a 3-clause BSD license. Please consult the 3 // LICENSE.md file distributed with the sources of this project regarding your 4 // rights to use or distribute this software. 5 6 package starter 7 8 import ( 9 "net" 10 "os" 11 12 "github.com/sylabs/singularity/internal/pkg/runtime/engines" 13 sarterConfig "github.com/sylabs/singularity/internal/pkg/runtime/engines/config/starter" 14 "github.com/sylabs/singularity/internal/pkg/sylog" 15 ) 16 17 // Stage performs container startup. 18 func Stage(stage, masterSocket int, sconfig *sarterConfig.Config, engine *engines.Engine) { 19 var conn net.Conn 20 var err error 21 22 if masterSocket != -1 { 23 comm := os.NewFile(uintptr(masterSocket), "master-socket") 24 conn, err = net.FileConn(comm) 25 if err != nil { 26 sylog.Fatalf("failed to copy master unix socket descriptor: %s", err) 27 return 28 } 29 comm.Close() 30 } else { 31 conn = nil 32 } 33 34 if stage == 1 { 35 sylog.Debugf("Entering stage 1\n") 36 if err := engine.PrepareConfig(sconfig); err != nil { 37 sylog.Fatalf("%s\n", err) 38 } 39 if err := sconfig.Write(engine.Common); err != nil { 40 sylog.Fatalf("%s", err) 41 } 42 os.Exit(0) 43 } else { 44 sylog.Debugf("Entering stage 2\n") 45 if err := engine.StartProcess(conn); err != nil { 46 // write data to just tell master to not execute PostStartProcess 47 // in case of failure 48 if _, err := conn.Write([]byte("f")); err != nil { 49 sylog.Errorf("fail to send data to master: %s", err) 50 } 51 sylog.Fatalf("%s\n", err) 52 } 53 } 54 }