slkern/drives.h

77 lines
2.7 KiB
C

/* NEW CODE implementing a simple system like "drive letters" but longer names,
* Copyright (C) 2024 Zak Fenton
* NO WARRANTY USE AT YOUR OWN RISK etc. under terms of UNLICENSE or MIT license
*/
#ifndef _DRIVES_H
#define _DRIVES_H
// The logic for managing filesystem instances themselves is separate
// to the management of the drives structure, but the drives system acts
// as a convenience wrapper over the filesystem logic.
#include "fsinstance.h"
#include "syscdefs.h"
#define DRIVES_HANDLER_NONE 0
#define DRIVES_HANDLER_FS 1
/* The maximum number of drives. */
#define DRIVES_MAX 10
/* The maximum length of a drive name. */
#define DRIVES_NAMEMAX 24
/* An entry for a single drive. */
struct drives_entry {
int handler;
int nusers;
void* handlerdata;
char name[DRIVES_NAMEMAX];
};
/* The drives structure. */
struct drives {
sched_spinlock_t lock;
struct drives_entry entries[DRIVES_MAX];
};
/* Allocates and initialises a new drives structure. Note that functions for
* dealing with multiple drives structures will be dealt with later!
*/
struct drives* drives_alloc();
/* Allocates a drive in the drives structure with the given data, returning the
* drive number on success or -1 on failure.
*/
int drives_setup(struct drives* drives, int handlertype, void* handlerdata, const char* name);
/* Finds the corresponding drive and retrieves the fields. This should lock the
* structure while operating, incrementing nusers before releasing the lock.
*
* Returns the drive number on success or -1 on failure.
*/
int drives_open(struct drives* drives, const char* name, int* handlertype, void** handlerdata);
/* Safely decrements the user count of the given drive number, returning -1. */
int drives_close(struct drives* drives, int driven);
/* Safely increments the user count of the given drive number, returning the number. */
int drives_dup(struct drives* drives, int driven);
/* Looks up the (filesystem-specific) inode structure for a given path, storing
* the filesystem type in a variable at the given pointer (0 on failure).
*/
void* drives_fsnode(struct drives* drives, int hint, char* path, int* fstypevar);
void* drives_fsparent(struct drives* drives, int hint, char* path, int* fstypevar, char* namevar, int namelen);
/* Begin/end a filesystem operation, also returning the appropriate fsinstance for the hint drive and/or path. */
fsinstance_t* drives_fsbegin(struct drives* drives, int hint, char* path);
void drives_fsend(struct drives* drives, fsinstance_t* instance);
/* Gets information about a drive, filling a structure with information about the drive. */
int drives_getinfo(struct drives* drives, int drivenumber, struct __syscdefs_driveinfo* structure);
/* From ifndef at top of file: */
#endif