forked from pisan430/p5-bfs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bio.c
49 lines (35 loc) · 1.53 KB
/
bio.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// ============================================================================
// bio.c - low level Block IO functions
// ============================================================================
#include "bfs.h"
#include "bio.h"
// ============================================================================
// Read 512 bytes from block number 'dbn' in the BFS disk into buffer 'buf'
// ============================================================================
i32 bioRead(i32 dbn, void* buf) {
if (dbn < 0) FATAL(EBADDBN);
if (dbn > BLOCKSPERDISK) FATAL(EBADDBN);
FILE* fp = fopen(BFSDISK, "rb+");
if (fp == NULL) FATAL(ENODISK);
i32 boff = dbn * BYTESPERBLOCK;
i32 ret = fseek(fp, boff, SEEK_SET);
if (ret != 0) { fclose(fp); FATAL(ret); }
i32 numb = fread(buf, 1, BYTESPERBLOCK, fp);
if (numb != BYTESPERBLOCK) { fclose(fp); FATAL(EBADREAD); }
fclose(fp);
return 0;
}
// ============================================================================
// Write 512 bytes from 'buf' into block number 'dbn' of the BFS disk
// ============================================================================
i32 bioWrite(i32 dbn, void* buf) {
FILE* fp = fopen(BFSDISK, "rb+");
if (fp == NULL) FATAL(ENODISK);
i32 boff = dbn * BYTESPERBLOCK;
i32 ret = fseek(fp, boff, SEEK_SET);
if (ret != 0) { fclose(fp); FATAL(ret); }
i32 numb = fwrite(buf, 1, BYTESPERBLOCK, fp);
if (numb != BYTESPERBLOCK) { fclose(fp); FATAL(EBADWRITE); }
fclose(fp);
return 0;
}