2
0
Fork 0
ibcs/sysfs.c.old
1994-04-22 11:24:23 +00:00

113 lines
2.3 KiB
C

/*
* linux/ibcs/sysfs.c
*
* Copyright (C) 1994 Mike Jagdis (jaggy@purplet.demon.co.uk)
*
* $Id: sysfs.c.old,v 1.1 1994/04/22 11:24:17 mike Exp $
* $Source: /nfs4/sophia/home/mjagdis/src/ibcs.cvs/ibcs/Attic/sysfs.c.old,v $
*/
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/segment.h>
#include <linux/ptrace.h>
#include <linux/config.h>
#include <linux/fcntl.h>
#include <asm/segment.h>
#include <asm/system.h>
#include <linux/fs.h>
#include <linux/sys.h>
#include <linux/string.h>
#include <ibcs/ibcs.h>
#ifdef IBCS_TRACE
#include <ibcs/trace.h>
#endif
/* Declared in linux/fs/filesystems.c.
* We rely on the table of filesystems being statically allocate as an
* array at compile time. When (and if) we go to a modular system we will
* have to change this code appropriately.
*/
extern struct file_system_type file_systems[];
#define GETFSIND 1
#define GETFSTYP 2
#define GETNFSTYP 3
int ibcs_sysfs(struct pt_regs * regs) {
int cmd;
struct file_system_type *fs;
int error;
int n_fs;
cmd = get_fs_long(((unsigned long *) regs->esp) + 1);
if (cmd == GETFSIND) {
char *fsname, *kfsname;
fsname = (char *)get_fs_long(((unsigned long *) regs->esp) + 2);
error = getname(fsname, &kfsname);
if (error)
return (error);
n_fs = 1;
for (fs=file_systems; fs->name; fs++,n_fs++)
if (!strcmp(fs->name, kfsname)) {
putname(kfsname);
return (n_fs);
}
putname(kfsname);
return (-EINVAL);
}
n_fs = 0;
for (fs=file_systems; fs->name; fs++,n_fs++);
if (cmd == GETNFSTYP) {
return (n_fs);
}
if (cmd == GETFSTYP) {
int fs_ind;
char *buf;
char *p;
fs_ind = get_fs_long(((unsigned long *) regs->esp) + 2) - 1;
if (fs_ind < 0 || fs_ind >= n_fs
|| !file_systems[fs_ind].name)
return (-EINVAL);
buf = (char *)get_fs_long(((unsigned long *) regs->esp) + 3);
error = verify_area(VERIFY_WRITE, buf,
strlen(file_systems[fs_ind].name));
if (error)
return error;
p = file_systems[fs_ind].name;
do {
put_fs_byte(*p, buf++);
} while (*p++);
return (0);
}
#ifdef IBCS_TRACE
if ((ibcs_trace & TRACE_API) || ibcs_func_p->trace) {
printk(KERN_DEBUG "iBCS2 unsupported sysfs call %d\n", cmd);
}
#endif
return -EINVAL;
}