@@ -53,7 +53,6 @@ State :: struct {
5353
5454deinit_state :: proc (self: ^State, allocator: mem.Allocator) {
5555 for key, value in self.packages {
56- delete (key, allocator)
5756 delete (value.version, allocator)
5857 delete (value.checksum, allocator)
5958 }
@@ -78,7 +77,6 @@ main :: proc() {
7877 defer delete (backing)
7978 allocator := mem.arena_allocator (&arena)
8079 context .allocator = allocator
81-
8280 args := os.args[1 :]
8381 if len (args) < 3 {
8482 output_error (allocator, .InvalidArgs, " Usage: backend [install|remove|verify] <package> <path> [checksum]" )
@@ -91,27 +89,26 @@ main :: proc() {
9189 if len (args) > 3 {
9290 checksum = args[3 ]
9391 }
94-
9592 switch command {
96- case " install" :
97- install (allocator, package_name, path, checksum)
98- case " remove" :
99- remove (allocator, package_name, path)
100- case " verify" :
101- if checksum == nil {
102- output_error (allocator, .InvalidArgs, " Checksum required for verify" )
103- return
104- }
105- verify (allocator, path, checksum.?)
106- payload := struct { success: bool }{true }
107- output, merr := json.marshal (payload)
108- if merr != nil {
109- panic (" JSON marshal failed" )
110- }
111- defer delete (output)
112- os.write (os.stdout, output)
113- case :
114- output_error (allocator, .UnknownCommand, " Unknown command" )
93+ case " install" :
94+ install (allocator, package_name, path, checksum)
95+ case " remove" :
96+ remove (allocator, package_name, path)
97+ case " verify" :
98+ if checksum == nil {
99+ output_error (allocator, .InvalidArgs, " Checksum required for verify" )
100+ return
101+ }
102+ verify (allocator, path, checksum.?)
103+ payload := struct { success: bool }{true }
104+ output, merr := json.marshal (payload)
105+ if merr != nil {
106+ panic (" JSON marshal failed" )
107+ }
108+ defer delete (output)
109+ os.write (os.stdout, output)
110+ case :
111+ output_error (allocator, .UnknownCommand, " Unknown command" )
115112 }
116113}
117114
@@ -140,7 +137,7 @@ load_manifest :: proc(allocator: mem.Allocator, path: string) -> Manifest {
140137 }
141138 defer delete (data)
142139 manifest: Manifest
143- err := json.unmarshal (data, &manifest, { allocator = allocator} )
140+ err := json.unmarshal (data, &manifest, allocator = allocator)
144141 if err != nil {
145142 panic (" Failed to parse manifest" )
146143 }
@@ -151,37 +148,33 @@ install :: proc(allocator: mem.Allocator, package_name: string, path: string, ch
151148 tmp_path := fmt.aprintf (" {}.tmp" , path)
152149 defer delete (tmp_path)
153150 merr := os.make_directory (tmp_path)
154- if merr != os.Errno (0 ) && merr != os.Errno (linux.EEXIST) {
155- panic (" Failed to create tmp directory" )
151+ if merr != nil {
152+ ge, ok := merr.(os.General_Error)
153+ if !(ok && ge == .Exist) {
154+ panic (" Failed to create tmp directory" )
155+ }
156156 }
157-
158157 manifest := load_manifest (allocator, tmp_path)
159158 defer deinit_manifest (&manifest, allocator)
160-
161159 if manifest.deps != nil && len (manifest.deps) > 0 {
162160 for dep in manifest.deps {
163161 // TODO: Full DAG, cycle detection
164162 fmt.eprintf (" Installing dep: {}\n " , dep)
165163 }
166164 }
167-
168165 setup_sandbox (allocator, package_name, tmp_path, &manifest)
169-
170166 if chk, ok := checksum.?; ok {
171167 verify (allocator, tmp_path, chk)
172168 }
173-
174169 rerr := os.rename (tmp_path, path)
175- if rerr != os. Errno ( 0 ) {
170+ if rerr != nil {
176171 panic (" Rename failed" )
177172 }
178-
179173 checksum_str := " none"
180174 if c, ok := checksum.?; ok {
181175 checksum_str = c
182176 }
183177 update_state (allocator, package_name, manifest.version, checksum_str)
184-
185178 payload := struct { success: bool , package_name: string }{true , package_name}
186179 output, merr2 := json.marshal (payload)
187180 if merr2 != nil {
@@ -194,19 +187,16 @@ install :: proc(allocator: mem.Allocator, package_name: string, path: string, ch
194187remove :: proc (allocator: mem.Allocator, package_name: string , path: string ) {
195188 manifest := load_manifest (allocator, path)
196189 defer deinit_manifest (&manifest, allocator)
197-
198190 if manifest.bins != nil && len (manifest.bins) > 0 {
199191 for bin in manifest.bins {
200192 bin_path := fmt.aprintf (" /usr/bin/{}" , bin)
201193 defer delete (bin_path)
202194 _ = os.remove (bin_path)
203195 }
204196 }
205-
206- if err := delete_tree (path); err != os.Errno (0 ) {
197+ if err := delete_tree (path); err != nil {
207198 panic (" Delete tree failed" )
208199 }
209-
210200 state := load_state (allocator)
211201 defer deinit_state (&state, allocator)
212202 if pi, found := state.packages[package_name]; found {
@@ -215,7 +205,6 @@ remove :: proc(allocator: mem.Allocator, package_name: string, path: string) {
215205 delete_key (&state.packages, package_name)
216206 }
217207 save_state (&state)
218-
219208 payload := struct { success: bool , package_name: string }{true , package_name}
220209 output, merr := json.marshal (payload)
221210 if merr != nil {
@@ -233,21 +222,18 @@ verify :: proc(allocator: mem.Allocator, path: string, checksum: string) {
233222 panic (" Failed to read manifest for verify" )
234223 }
235224 defer delete (data)
236-
237225 ctx: sha2.Context_256
238226 sha2.init_256 (&ctx)
239227 sha2.update (&ctx, data)
240228 hash: [sha2.DIGEST_SIZE_256]u8
241229 sha2.final (&ctx, hash[:])
242-
243230 computed_builder: strings.Builder
244231 strings.builder_init (&computed_builder, allocator)
245232 defer strings.builder_destroy (&computed_builder)
246233 for b in hash {
247234 fmt.sbprintf (&computed_builder, " {:02x}" , b)
248235 }
249236 computed := strings.to_string (computed_builder)
250-
251237 if computed != checksum {
252238 output_error (allocator, .VerificationFailed, " Checksum mismatch" )
253239 }
@@ -265,7 +251,6 @@ setup_sandbox :: proc(allocator: mem.Allocator, package_name: string, path: stri
265251 append (&args, " --bind" , path, " /app" )
266252 append (&args, " --chdir" , " /app" )
267253 append (&args, " --unshare-all" )
268-
269254 if !manifest.sandbox.network {
270255 append (&args, " --unshare-net" )
271256 } else {
@@ -277,23 +262,20 @@ setup_sandbox :: proc(allocator: mem.Allocator, package_name: string, path: stri
277262 }
278263 }
279264 append (&args, " --" , " sh" , " -c" , " echo Isolated install complete" ) // Replace with actual
280-
281265 code := run_command (args[:])
282266 delete (args)
283-
284267 if code != 0 {
285268 output_error (allocator, .InstallFailed, " Sandbox failed" )
286269 }
287270}
288271
289272run_command :: proc (argv: []string ) -> i32 {
290- pid := linux.fork ()
291- if pid < 0 {
273+ pid, ferr := linux.fork ()
274+ if ferr != .NONE {
292275 panic (" Fork failed" )
293276 }
294277 if pid == 0 {
295- c_argv := make ([]cstring , len (argv) + 1 )
296- defer delete (c_argv)
278+ c_argv := make ([]cstring , len (argv) + 1 , context .temp_allocator)
297279 for arg, i in argv {
298280 c_argv[i] = strings.clone_to_cstring (arg, context .temp_allocator)
299281 }
@@ -304,7 +286,7 @@ run_command :: proc(argv: []string) -> i32 {
304286 }
305287 status: u32
306288 _, werr := linux.waitpid (pid, &status, {}, nil )
307- if werr != os. Errno ( 0 ) {
289+ if werr != .NONE {
308290 return -1
309291 }
310292 if linux.WIFEXITED (status) {
@@ -313,15 +295,14 @@ run_command :: proc(argv: []string) -> i32 {
313295 return -1
314296}
315297
316- delete_tree :: proc (path: string ) -> os.Errno {
298+ delete_tree :: proc (path: string ) -> os.Error {
317299 dir, open_err := os.open (path, os.O_RDONLY)
318- if open_err != os. Errno ( 0 ) {
300+ if open_err != nil {
319301 return open_err
320302 }
321303 defer os.close (dir)
322-
323304 entries, read_err := os.read_dir (dir, -1 )
324- if read_err != os. Errno ( 0 ) {
305+ if read_err != nil {
325306 return read_err
326307 }
327308 defer {
@@ -330,21 +311,19 @@ delete_tree :: proc(path: string) -> os.Errno {
330311 }
331312 delete (entries)
332313 }
333-
334314 for entry in entries {
335315 full_path := fmt.tprintf (" %s/%s" , path, entry.name)
336316 defer delete (full_path)
337317 if entry.is_dir {
338- if del_err := delete_tree (full_path); del_err != os. Errno ( 0 ) {
318+ if del_err := delete_tree (full_path); del_err != nil {
339319 return del_err
340320 }
341321 } else {
342- if rem_err := os.remove (full_path); rem_err != os. Errno ( 0 ) {
322+ if rem_err := os.remove (full_path); rem_err != nil {
343323 return rem_err
344324 }
345325 }
346326 }
347-
348327 return os.remove_directory (path)
349328}
350329
@@ -357,7 +336,7 @@ load_state :: proc(allocator: mem.Allocator) -> State {
357336 }
358337 defer delete (data)
359338 state: State
360- err := json.unmarshal (data, &state, { allocator = allocator} )
339+ err := json.unmarshal (data, &state, allocator = allocator)
361340 if err != nil {
362341 panic (" Failed to parse state" )
363342 }
@@ -366,7 +345,7 @@ load_state :: proc(allocator: mem.Allocator) -> State {
366345
367346save_state :: proc (state: ^State) {
368347 file, open_err := os.open (STATE_PATH, os.O_CREATE | os.O_WRONLY | os.O_TRUNC)
369- if open_err != os. Errno ( 0 ) {
348+ if open_err != nil {
370349 panic (" Failed to open state file" )
371350 }
372351 defer os.close (file)
@@ -376,7 +355,7 @@ save_state :: proc(state: ^State) {
376355 }
377356 defer delete (data)
378357 _, write_err := os.write (file, data)
379- if write_err != os. Errno ( 0 ) {
358+ if write_err != nil {
380359 panic (" Failed to write state file" )
381360 }
382361}
0 commit comments