aboutsummaryrefslogtreecommitdiffstats
path: root/usr/stat.h
blob: 10acc54d07ba8b207889ed5e67250a29f8dde28e (plain) (blame)
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
#ifndef STAT_H
#define STAT_H
/* stat.h - file metadata and filesystem totals. Header-only (one copy per
   program), like sock.h: the request block has to live in the caller's RAM.
   The kernel trap needs HL for its dispatch table, so a call with both a path
   and an output buffer passes a request block rather than two pointers. */
#include "gbos.h"

#define ST_FILE 1
#define ST_DIR  2

struct gstat {
    unsigned char type; /* ST_FILE / ST_DIR */
    unsigned char nlink;
    unsigned int size; /* bytes */
    unsigned char ino;
};

static unsigned char _sreq[7]; /* path ptr, then type/nlink/size/ino */

/* -> 1 on success, 0 if the path does not exist */
static unsigned char gstat(const char *path, struct gstat *st) {
    _sreq[0] = (unsigned char)(unsigned int)path;
    _sreq[1] = (unsigned char)(((unsigned int)path) >> 8);
    if (sys_stat(_sreq) != 0) return 0;
    st->type = _sreq[2];
    st->nlink = _sreq[3];
    st->size = (unsigned int)_sreq[4] | ((unsigned int)_sreq[5] << 8);
    st->ino = _sreq[6];
    return 1;
}

/* out[] = { blocks total, blocks free, inodes total, inodes free } */
static void gfsstat(unsigned char *out) { sys_fsstat(out); }

#endif