Skip to content

Commit 052fe90

Browse files
authored
Update main.odin
1 parent 397f770 commit 052fe90

1 file changed

Lines changed: 39 additions & 60 deletions

File tree

source-code/backend/main.odin

Lines changed: 39 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ State :: struct {
5353

5454
deinit_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
194187
remove :: 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

289272
run_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

367346
save_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

Comments
 (0)