kvisc/vm/dv/diskdev.c

120 lines
2.1 KiB
C

// The OS/K Team licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#include <pc/device.h>
#include <dirent.h>
#define MAXOPEN 4096
typedef struct disk_t disk_t;
typedef struct dirent dirent_t;
struct disk_t
{
// disk directory
DIR *dir;
// open files
int *table[MAXOPEN];
uint opened;
};
#define GETDISK() \
disk_t *disk = (disk_t *)dev->data
//----------------------------------------------------------------------------//
long diskdev_findnext(ctx_t *ctx, dev_t *dev)
{
dirent_t *ent;
GETDISK();
for (;;)
{
ent = readdir(disk->dir);
if (ent == NULL)
{
rax = 0;
return 0;
}
if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
continue;
break;
}
rax = copystr(ctx, ax0, ax1, ent->d_name);
return 0;
}
long diskdev_findfirst(ctx_t *ctx, dev_t *dev)
{
GETDISK();
rewinddir(disk->dir);
return diskdev_findnext(ctx, dev);
}
//----------------------------------------------------------------------------//
long diskdev_poweron(ctx_t *ctx, dev_t *dev)
{
disk_t *disk = calloc(1, sizeof(disk_t));
disk->dir = opendir("fs");
if (disk->dir == NULL)
{
logerr("diskdev: couldn't open fs directory\n");
return -1;
}
dev->data = (void *)disk;
dev->fslots[16] = diskdev_findfirst;
dev->fslots[17] = diskdev_findnext;
dev->state = DEVGOOD;
return 0;
}
long diskdev_poweroff(ctx_t *ctx, dev_t *dev)
{
GETDISK();
if (disk && disk->dir)
closedir(disk->dir);
if (disk)
free(disk);
dev->data = NULL;
dev->state = DEVPWOF;
return 0;
}
//----------------------------------------------------------------------------//
dev_t diskdev =
{
.type = "disk",
.name = "disk",
.modl = "",
.vend = "The OS/K Team",
.major = KARCH_MAJOR,
.minor = KARCH_MINOR,
.revis = KARCH_REVIS,
.fpwon = diskdev_poweron,
.fpwoff = diskdev_poweroff,
};