@@ -4,22 +4,23 @@ import (
44 "fmt"
55 "os"
66 "path/filepath"
7+ "strings"
78)
89
910type FileSystemManager struct {
10- instanceDir string
11- firmwareDirPathFile string
12- firmwareDir string
13- createdDirs []string
11+ instanceDir string
12+ customFirmwareLoadPathFile string
13+ defaultFirmwareDir string
14+ createdDirs []string
1415}
1516
1617func NewFileSystemManager (rootDir string , index uint ) * FileSystemManager {
1718 instanceName := fmt .Sprintf ("remoteproc%d" , index )
1819 return & FileSystemManager {
19- instanceDir : filepath .Join (rootDir , "sys" , "class" , "remoteproc" , instanceName ),
20- firmwareDirPathFile : filepath .Join (rootDir , "sys" , "module" , "firmware_class" , "parameters" , "path" ),
21- firmwareDir : filepath .Join (rootDir , "firmware" ),
22- createdDirs : []string {},
20+ instanceDir : filepath .Join (rootDir , "sys" , "class" , "remoteproc" , instanceName ),
21+ customFirmwareLoadPathFile : filepath .Join (rootDir , "sys" , "module" , "firmware_class" , "parameters" , "path" ),
22+ defaultFirmwareDir : filepath .Join (rootDir , "lib" , "firmware" ),
23+ createdDirs : []string {},
2324 }
2425}
2526
@@ -32,27 +33,26 @@ func (fs *FileSystemManager) BootstrapDirectories() error {
3233 fs .createdDirs = append (fs .createdDirs , createdInstancePath )
3334 }
3435
35- createdFirmwareDirSpecPath , err := mkfile ( fs .firmwareDirPathFile , 0755 )
36+ createdParametersDir , err := mkdirAll ( filepath . Dir ( fs .customFirmwareLoadPathFile ) , 0755 )
3637 if err != nil {
3738 fs .Cleanup ()
38- return fmt .Errorf ("failed to create firmware path directory: %w" , err )
39+ return fmt .Errorf ("failed to create parameters directory: %w" , err )
3940 }
40- if createdFirmwareDirSpecPath != "" {
41- fs .createdDirs = append (fs .createdDirs , createdFirmwareDirSpecPath )
41+ if createdParametersDir != "" {
42+ fs .createdDirs = append (fs .createdDirs , createdParametersDir )
4243 }
43-
44- if err := os .WriteFile (fs .firmwareDirPathFile , []byte (fs .firmwareDir ), 0644 ); err != nil {
44+ if err := os .WriteFile (fs .customFirmwareLoadPathFile , []byte ("" ), 0644 ); err != nil {
4545 fs .Cleanup ()
46- return fmt .Errorf ("failed to write firmware path file: %w" , err )
46+ return fmt .Errorf ("failed to create empty fimware search path file; %w" , err )
4747 }
4848
49- createdFirmwareDir , err := mkdirAll (fs .firmwareDir , 0755 )
49+ createdDefaultFirmwareDir , err := mkdirAll (fs .defaultFirmwareDir , 0755 )
5050 if err != nil {
5151 fs .Cleanup ()
5252 return fmt .Errorf ("failed to create firmware directory: %w" , err )
5353 }
54- if createdFirmwareDir != "" {
55- fs .createdDirs = append (fs .createdDirs , createdFirmwareDir )
54+ if createdDefaultFirmwareDir != "" {
55+ fs .createdDirs = append (fs .createdDirs , createdDefaultFirmwareDir )
5656 }
5757
5858 return nil
@@ -67,18 +67,38 @@ func (fs *FileSystemManager) WriteInstanceFile(filename, content string) error {
6767 return nil
6868}
6969
70- func (fs * FileSystemManager ) FirmwareExists (firmwareName string ) bool {
71- path := filepath .Join (fs .firmwareDir , firmwareName )
72- _ , err := os .Stat (path )
73- return ! os .IsNotExist (err )
70+ func (fs * FileSystemManager ) CheckFirmwareExists (firmwareName string ) error {
71+ lookupPaths := []string {}
72+
73+ customFirmwareDir := fs .customFirmwareDir ()
74+ if customFirmwareDir != "" {
75+ firmwareExistsInCustomPath := fileExists (filepath .Join (customFirmwareDir , firmwareName ))
76+ if firmwareExistsInCustomPath {
77+ return nil
78+ }
79+ lookupPaths = append (lookupPaths , customFirmwareDir )
80+ }
81+
82+ defaultFirmwareDir := fs .defaultFirmwareDir
83+ firmwareExistsInDefaultDir := fileExists (filepath .Join (defaultFirmwareDir , firmwareName ))
84+ if firmwareExistsInDefaultDir {
85+ return nil
86+ }
87+ lookupPaths = append (lookupPaths , defaultFirmwareDir )
88+
89+ return fmt .Errorf ("firmware file %s not found, checked in %s" , firmwareName , strings .Join (lookupPaths , " and " ))
7490}
7591
76- func (fs * FileSystemManager ) InstanceDir () string {
77- return fs .instanceDir
92+ func (fs * FileSystemManager ) customFirmwareDir () string {
93+ customFirmwareLoadPath , err := os .ReadFile (fs .customFirmwareLoadPathFile )
94+ if err != nil {
95+ return ""
96+ }
97+ return strings .TrimSpace (string (customFirmwareLoadPath ))
7898}
7999
80- func (fs * FileSystemManager ) FirmwareDir () string {
81- return fs .firmwareDir
100+ func (fs * FileSystemManager ) InstanceDir () string {
101+ return fs .instanceDir
82102}
83103
84104func (fs * FileSystemManager ) Cleanup () error {
@@ -91,24 +111,6 @@ func (fs *FileSystemManager) Cleanup() error {
91111 return nil
92112}
93113
94- func mkfile (path string , perm os.FileMode ) (string , error ) {
95- dir , err := mkdirAll (filepath .Dir (path ), perm )
96- if err != nil {
97- return "" , err
98- }
99- file , err := os .OpenFile (path , os .O_CREATE | os .O_RDWR , perm )
100- if err != nil {
101- return "" , err
102- }
103- defer file .Close ()
104- if dir == "" {
105- return path , nil
106- } else {
107- return dir , nil
108- }
109-
110- }
111-
112114func mkdirAll (path string , perm os.FileMode ) (string , error ) {
113115 current := path
114116 var topmostMissing string
@@ -136,3 +138,8 @@ func mkdirAll(path string, perm os.FileMode) (string, error) {
136138
137139 return topmostMissing , nil
138140}
141+
142+ func fileExists (path string ) bool {
143+ _ , err := os .Stat (path )
144+ return ! os .IsNotExist (err )
145+ }
0 commit comments