1818package ldconfig
1919
2020import (
21+ "flag"
2122 "fmt"
2223 "os"
2324 "os/exec"
@@ -39,40 +40,63 @@ const (
3940type Ldconfig struct {
4041 ldconfigPath string
4142 inRoot string
43+ directories []string
4244}
4345
4446// NewRunner creates an exec.Cmd that can be used to run ldconfig.
4547func NewRunner (id string , ldconfigPath string , containerRoot string , additionalargs ... string ) (* exec.Cmd , error ) {
4648 args := []string {
4749 id ,
48- strings .TrimPrefix (config .NormalizeLDConfigPath ("@" + ldconfigPath ), "@" ),
49- containerRoot ,
50+ "--ldconfig-path" , strings .TrimPrefix (config .NormalizeLDConfigPath ("@" + ldconfigPath ), "@" ),
51+ "--container-root" , containerRoot ,
5052 }
5153 args = append (args , additionalargs ... )
5254
5355 return createReexecCommand (args )
5456}
5557
56- // New creates an Ldconfig struct that is used to perform operations on the
57- // ldcache and libraries in a particular root (e.g. a container).
58- func New (ldconfigPath string , inRoot string ) (* Ldconfig , error ) {
59- l := & Ldconfig {
60- ldconfigPath : ldconfigPath ,
61- inRoot : inRoot ,
62- }
63- if ldconfigPath == "" {
58+ // NewFromArgs creates an Ldconfig struct from the args passed to the Cmd
59+ // above.
60+ // This struct is used to perform operations on the ldcache and libraries in a
61+ // particular root (e.g. a container).
62+ //
63+ // args[0] is the reexec initializer function name
64+ // The following flags are required:
65+ //
66+ // --ldconfig-path=LDCONFIG_PATH the path to ldconfig on the host
67+ // --container-root=CONTAINER_ROOT the path in which ldconfig must be run
68+ //
69+ // The remaining args are folders where soname symlinks need to be created.
70+ func NewFromArgs (args ... string ) (* Ldconfig , error ) {
71+ if len (args ) < 1 {
72+ return nil , fmt .Errorf ("incorrect arguments: %v" , args )
73+ }
74+ fs := flag .NewFlagSet (args [1 ], flag .ExitOnError )
75+ ldconfigPath := fs .String ("ldconfig-path" , "" , "the path to ldconfig on the host" )
76+ containerRoot := fs .String ("container-root" , "" , "the path in which ldconfig must be run" )
77+ if err := fs .Parse (args [1 :]); err != nil {
78+ return nil , err
79+ }
80+
81+ if * ldconfigPath == "" {
6482 return nil , fmt .Errorf ("an ldconfig path must be specified" )
6583 }
66- if inRoot == "" || inRoot == "/" {
84+ if * containerRoot == "" || * containerRoot == "/" {
6785 return nil , fmt .Errorf ("ldconfig must be run in the non-system root" )
6886 }
87+
88+ l := & Ldconfig {
89+ ldconfigPath : * ldconfigPath ,
90+ inRoot : * containerRoot ,
91+ directories : fs .Args (),
92+ }
6993 return l , nil
7094}
7195
7296// CreateSonameSymlinks uses ldconfig to create the soname symlinks in the
7397// specified directories.
74- func (l * Ldconfig ) CreateSonameSymlinks (directories ... string ) error {
75- if len (directories ) == 0 {
98+ func (l * Ldconfig ) CreateSonameSymlinks () error {
99+ if len (l . directories ) == 0 {
76100 return nil
77101 }
78102 ldconfigPath , err := l .prepareRoot ()
@@ -87,12 +111,12 @@ func (l *Ldconfig) CreateSonameSymlinks(directories ...string) error {
87111 // Specify -n to only process the specified directories.
88112 "-n" ,
89113 }
90- args = append (args , directories ... )
114+ args = append (args , l . directories ... )
91115
92116 return SafeExec (ldconfigPath , args , nil )
93117}
94118
95- func (l * Ldconfig ) UpdateLDCache (directories ... string ) error {
119+ func (l * Ldconfig ) UpdateLDCache () error {
96120 ldconfigPath , err := l .prepareRoot ()
97121 if err != nil {
98122 return err
@@ -115,12 +139,12 @@ func (l *Ldconfig) UpdateLDCache(directories ...string) error {
115139 // containing the required directories, otherwise we add the specified
116140 // directories to the ldconfig command directly.
117141 if l .ldsoconfdDirectoryExists () {
118- err := createLdsoconfdFile (ldsoconfdFilenamePattern , directories ... )
142+ err := createLdsoconfdFile (ldsoconfdFilenamePattern , l . directories ... )
119143 if err != nil {
120144 return fmt .Errorf ("failed to update ld.so.conf.d: %w" , err )
121145 }
122146 } else {
123- args = append (args , directories ... )
147+ args = append (args , l . directories ... )
124148 }
125149
126150 return SafeExec (ldconfigPath , args , nil )
0 commit comments