-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial commit of Crossmeta 2.0 FUSE
- Loading branch information
0 parents
commit 1794a77
Showing
115 changed files
with
20,798 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
CVS/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# | ||
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source | ||
# file to this component. This file merely indirects to the real make file | ||
# that is shared by all the components of NT OS/2 | ||
# | ||
!INCLUDE $(NTMAKEENV)\makefile.def |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
!IF 0 | ||
Fuse program info build file | ||
|
||
!ENDIF | ||
|
||
TARGETNAME=hello | ||
TARGETPATH=$(VFS_LIB_TARGET) | ||
TARGETTYPE=PROGRAM | ||
|
||
TARGETLIBS=$(SDK_LIB_PATH)\ntdll.lib | ||
LINKLIBS=$(VFS_LIB_PATH)\libfuse.lib \ | ||
$(VFS_LIB_PATH)\cxfuse.lib | ||
|
||
|
||
USE_MSVCRT=1 | ||
386_STDCALL=0 | ||
|
||
INCLUDES=..\include;..\sys | ||
C_DEFINES=-D__STDC__=1 | ||
|
||
UMTYPE=console | ||
UMBASE=0x1000000 | ||
|
||
SOURCES= hello.c | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/* | ||
FUSE: Filesystem in Userspace | ||
Copyright (C) 2001-2007 Miklos Szeredi <[email protected]> | ||
This program can be distributed under the terms of the GNU GPL. | ||
See the file COPYING. | ||
gcc -Wall `pkg-config fuse --cflags --libs` hello.c -o hello | ||
*/ | ||
|
||
#define FUSE_USE_VERSION 26 | ||
|
||
#include <fuse.h> | ||
#include <stdio.h> | ||
#include <string.h> | ||
#include <errno.h> | ||
#include <fcntl.h> | ||
|
||
static const char *hello_str = "Hello World!\n"; | ||
static const char *hello_path = "/hello"; | ||
|
||
static int hello_getattr(const char *path, struct stat *stbuf) | ||
{ | ||
int res = 0; | ||
|
||
memset(stbuf, 0, sizeof(struct stat)); | ||
if (strcmp(path, "/") == 0) { | ||
stbuf->st_mode = S_IFDIR | 0755; | ||
stbuf->st_nlink = 2; | ||
} else if (strcmp(path, hello_path) == 0) { | ||
stbuf->st_mode = S_IFREG | 0444; | ||
stbuf->st_nlink = 1; | ||
stbuf->st_size = strlen(hello_str); | ||
} else | ||
res = -ENOENT; | ||
|
||
return res; | ||
} | ||
|
||
static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler, | ||
off_t offset, struct fuse_file_info *fi) | ||
{ | ||
(void) offset; | ||
(void) fi; | ||
|
||
if (strcmp(path, "/") != 0) | ||
return -ENOENT; | ||
|
||
filler(buf, ".", NULL, 0); | ||
filler(buf, "..", NULL, 0); | ||
filler(buf, hello_path + 1, NULL, 0); | ||
|
||
return 0; | ||
} | ||
|
||
static int hello_open(const char *path, struct fuse_file_info *fi) | ||
{ | ||
if (strcmp(path, hello_path) != 0) | ||
return -ENOENT; | ||
|
||
if ((fi->flags & 3) != O_RDONLY) | ||
return -EACCES; | ||
|
||
return 0; | ||
} | ||
|
||
static int hello_read(const char *path, char *buf, size_t size, off_t offset, | ||
struct fuse_file_info *fi) | ||
{ | ||
size_t len; | ||
(void) fi; | ||
if(strcmp(path, hello_path) != 0) | ||
return -ENOENT; | ||
|
||
len = strlen(hello_str); | ||
if (offset < len) { | ||
if (offset + size > len) | ||
size = len - offset; | ||
memcpy(buf, hello_str + offset, size); | ||
} else | ||
size = 0; | ||
|
||
return size; | ||
} | ||
|
||
static struct fuse_operations hello_oper = { | ||
#if 0 | ||
.getattr = hello_getattr, | ||
.readdir = hello_readdir, | ||
.open = hello_open, | ||
.read = hello_read, | ||
#endif | ||
0 | ||
}; | ||
|
||
int main(int argc, char *argv[]) | ||
{ | ||
hello_oper.getattr = hello_getattr; | ||
hello_oper.readdir = hello_readdir; | ||
hello_oper.open = hello_open; | ||
hello_oper.read = hello_read; | ||
return fuse_main(argc, argv, &hello_oper, NULL); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# | ||
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source | ||
# file to this component. This file merely indirects to the real make file | ||
# that is shared by all the components of NT OS/2 | ||
# | ||
!INCLUDE $(NTMAKEENV)\makefile.def |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
!IF 0 | ||
hello_ll a lowlevel fuse example program build file | ||
|
||
!ENDIF | ||
|
||
TARGETNAME=hello_ll | ||
TARGETPATH=$(VFS_LIB_TARGET) | ||
TARGETTYPE=PROGRAM | ||
|
||
TARGETLIBS=$(SDK_LIB_PATH)\ntdll.lib | ||
|
||
LINKLIBS=$(VFS_LIB_PATH)\libfuse.lib \ | ||
$(VFS_LIB_PATH)\cxfuse.lib | ||
|
||
USE_MSVCRT=0 | ||
386_STDCALL=0 | ||
|
||
INCLUDES=..\include;..\sys | ||
C_DEFINES=-D__STDC__=1 | ||
|
||
UMTYPE=console | ||
UMBASE=0x1000000 | ||
|
||
SOURCES= hello_ll.c | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,190 @@ | ||
/* | ||
FUSE: Filesystem in Userspace | ||
Copyright (C) 2001-2007 Miklos Szeredi <[email protected]> | ||
This program can be distributed under the terms of the GNU GPL. | ||
See the file COPYING. | ||
gcc -Wall `pkg-config fuse --cflags --libs` hello_ll.c -o hello_ll | ||
*/ | ||
|
||
#define FUSE_USE_VERSION 26 | ||
|
||
#include <fuse_lowlevel.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <errno.h> | ||
#include <fcntl.h> | ||
#include <unistd.h> | ||
#include <assert.h> | ||
|
||
static const char *hello_str = "Hello World!\n"; | ||
static const char *hello_name = "hello"; | ||
|
||
static int hello_stat(fuse_ino_t ino, struct stat *stbuf) | ||
{ | ||
stbuf->st_ino = ino; | ||
switch (ino) { | ||
case 1: | ||
stbuf->st_mode = S_IFDIR | 0755; | ||
stbuf->st_nlink = 2; | ||
break; | ||
|
||
case 2: | ||
stbuf->st_mode = S_IFREG | 0444; | ||
stbuf->st_nlink = 1; | ||
stbuf->st_size = strlen(hello_str); | ||
break; | ||
|
||
default: | ||
return -1; | ||
} | ||
return 0; | ||
} | ||
|
||
static void hello_ll_getattr(fuse_req_t req, fuse_ino_t ino, | ||
struct fuse_file_info *fi) | ||
{ | ||
struct stat stbuf; | ||
|
||
(void) fi; | ||
|
||
memset(&stbuf, 0, sizeof(stbuf)); | ||
if (hello_stat(ino, &stbuf) == -1) | ||
fuse_reply_err(req, ENOENT); | ||
else | ||
fuse_reply_attr(req, &stbuf, 1.0); | ||
} | ||
|
||
static void hello_ll_lookup(fuse_req_t req, fuse_ino_t parent, const char *name) | ||
{ | ||
struct fuse_entry_param e; | ||
|
||
if (parent != 1 || strcmp(name, hello_name) != 0) | ||
fuse_reply_err(req, ENOENT); | ||
else { | ||
memset(&e, 0, sizeof(e)); | ||
e.ino = 2; | ||
e.attr_timeout = 1.0; | ||
e.entry_timeout = 1.0; | ||
hello_stat(e.ino, &e.attr); | ||
|
||
fuse_reply_entry(req, &e); | ||
} | ||
} | ||
|
||
struct dirbuf { | ||
char *p; | ||
size_t size; | ||
}; | ||
|
||
static void dirbuf_add(fuse_req_t req, struct dirbuf *b, const char *name, | ||
fuse_ino_t ino) | ||
{ | ||
struct stat stbuf; | ||
size_t oldsize = b->size; | ||
b->size += fuse_add_direntry(req, NULL, 0, name, NULL, 0); | ||
b->p = (char *) realloc(b->p, b->size); | ||
memset(&stbuf, 0, sizeof(stbuf)); | ||
stbuf.st_ino = ino; | ||
fuse_add_direntry(req, b->p + oldsize, b->size - oldsize, name, &stbuf, | ||
b->size); | ||
} | ||
|
||
#define min(x, y) ((x) < (y) ? (x) : (y)) | ||
|
||
static int reply_buf_limited(fuse_req_t req, const char *buf, size_t bufsize, | ||
off_t off, size_t maxsize) | ||
{ | ||
if (off < bufsize) | ||
return fuse_reply_buf(req, buf + off, | ||
min(bufsize - off, maxsize)); | ||
else | ||
return fuse_reply_buf(req, NULL, 0); | ||
} | ||
|
||
static void hello_ll_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, | ||
off_t off, struct fuse_file_info *fi) | ||
{ | ||
(void) fi; | ||
|
||
if (ino != 1) | ||
fuse_reply_err(req, ENOTDIR); | ||
else { | ||
struct dirbuf b; | ||
|
||
memset(&b, 0, sizeof(b)); | ||
dirbuf_add(req, &b, ".", 1); | ||
dirbuf_add(req, &b, "..", 1); | ||
dirbuf_add(req, &b, hello_name, 2); | ||
reply_buf_limited(req, b.p, b.size, off, size); | ||
free(b.p); | ||
} | ||
} | ||
|
||
static void hello_ll_open(fuse_req_t req, fuse_ino_t ino, | ||
struct fuse_file_info *fi) | ||
{ | ||
if (ino != 2) | ||
fuse_reply_err(req, EISDIR); | ||
else if ((fi->flags & 3) != O_RDONLY) | ||
fuse_reply_err(req, EACCES); | ||
else | ||
fuse_reply_open(req, fi); | ||
} | ||
|
||
static void hello_ll_read(fuse_req_t req, fuse_ino_t ino, size_t size, | ||
off_t off, struct fuse_file_info *fi) | ||
{ | ||
(void) fi; | ||
|
||
assert(ino == 2); | ||
reply_buf_limited(req, hello_str, strlen(hello_str), off, size); | ||
} | ||
|
||
static struct fuse_lowlevel_ops hello_ll_oper = { | ||
0 | ||
#if 0 | ||
.lookup = hello_ll_lookup, | ||
.getattr = hello_ll_getattr, | ||
.readdir = hello_ll_readdir, | ||
.open = hello_ll_open, | ||
.read = hello_ll_read, | ||
#endif | ||
}; | ||
|
||
int main(int argc, char *argv[]) | ||
{ | ||
struct fuse_args args = FUSE_ARGS_INIT(argc, argv); | ||
struct fuse_chan *ch; | ||
char *mountpoint; | ||
int err = -1; | ||
|
||
hello_ll_oper.lookup = hello_ll_lookup; | ||
hello_ll_oper.getattr = hello_ll_getattr; | ||
hello_ll_oper.readdir = hello_ll_readdir; | ||
hello_ll_oper.open = hello_ll_open; | ||
hello_ll_oper.read = hello_ll_read; | ||
|
||
if (fuse_parse_cmdline(&args, &mountpoint, NULL, NULL) != -1 && | ||
(ch = fuse_mount(mountpoint, &args)) != NULL) { | ||
struct fuse_session *se; | ||
|
||
se = fuse_lowlevel_new(&args, &hello_ll_oper, | ||
sizeof(hello_ll_oper), NULL); | ||
if (se != NULL) { | ||
if (fuse_set_signal_handlers(se) != -1) { | ||
fuse_session_add_chan(se, ch); | ||
err = fuse_session_loop(se); | ||
fuse_remove_signal_handlers(se); | ||
fuse_session_remove_chan(ch); | ||
} | ||
fuse_session_destroy(se); | ||
} | ||
fuse_unmount(mountpoint, ch); | ||
} | ||
fuse_opt_free_args(&args); | ||
|
||
return err ? 1 : 0; | ||
} |
Oops, something went wrong.