diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-03-20 22:27:44 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-03-20 22:27:44 +0100 |
commit | 0da2914ac9d9321cca2d402b2c505881e436c725 (patch) | |
tree | 56d77172f8126e4b4324e53dfbed36fade48110f | |
parent | 03f8e9b08a9d4f5034ea1a27c3a8e86d9b147306 (diff) |
pflocal: Add support for access() on pipes
bash's '<(' helper creates a pipe and gives /dev/fd/63 to the program, and
gcc would then run access() on it. So we actually need to support at least
some FS operations on pipes.
* pflocal/fs.c: New file.
* pflocal/mig-mutate.h (FILE_INTRAN, FILE_INTRAN_PAYLOAD, FILE_DESTRUCTOR,
FILE_IMPORTS): New macros.
* pflocal/sserver.c: Include "fs_S.h".
(sock_demuxer): Call fs_server_routine.
* pflocal/Makefile (SRCS): Add fs.c.
(MIGSTUBS): Add fsServer.o.
-rw-r--r-- | pflocal/Makefile | 4 | ||||
-rw-r--r-- | pflocal/fs.c | 308 | ||||
-rw-r--r-- | pflocal/mig-mutate.h | 6 | ||||
-rw-r--r-- | pflocal/sserver.c | 2 |
4 files changed, 318 insertions, 2 deletions
diff --git a/pflocal/Makefile b/pflocal/Makefile index 0d9341f1..3a079753 100644 --- a/pflocal/Makefile +++ b/pflocal/Makefile @@ -21,9 +21,9 @@ makemode := server target = pflocal -SRCS = connq.c io.c pflocal.c socket.c pf.c sock.c sserver.c +SRCS = connq.c io.c fs.c pflocal.c socket.c pf.c sock.c sserver.c -MIGSTUBS = ioServer.o socketServer.o +MIGSTUBS = ioServer.o fsServer.o socketServer.o OBJS = $(SRCS:.c=.o) $(MIGSTUBS) HURDLIBS = pipe trivfs iohelp fshelp ports ihash shouldbeinlibc LDLIBS = -lpthread diff --git a/pflocal/fs.c b/pflocal/fs.c new file mode 100644 index 00000000..d77f00b4 --- /dev/null +++ b/pflocal/fs.c @@ -0,0 +1,308 @@ +/* Socket I/O operations + + Copyright (C) 2016 Free Software Foundation, Inc. + + Written by Miles Bader <miles@gnu.org> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include <fcntl.h> + +#include "sock.h" +#include "sserver.h" + +#include "fs_S.h" + +error_t +S_dir_notice_changes (struct sock_user *cred, + mach_port_t notify) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_link (struct sock_user *dircred, + struct sock_user *filecred, + char *name, + int excl) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_lookup (struct sock_user *dircred, + char *path, + int flags, + mode_t mode, + enum retry_type *retry, + char *retryname, + file_t *returned_port, + mach_msg_type_name_t *returned_port_poly) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_mkdir (struct sock_user *dircred, + char *name, + mode_t mode) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_mkfile (struct sock_user *cred, + int flags, + mode_t mode, + mach_port_t *newnode, + mach_msg_type_name_t *newnodetype) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_readdir (struct sock_user *cred, + char **data, + size_t *datacnt, + boolean_t *data_dealloc, + int entry, + int nentries, + vm_size_t bufsiz, + int *amt) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_rename (struct sock_user *fromcred, + char *fromname, + struct sock_user *tocred, + char *toname, + int excl) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_rmdir (struct sock_user *dircred, + char *name) +{ + return EOPNOTSUPP; +} + +error_t +S_dir_unlink (struct sock_user *dircred, + char *name) +{ + return EOPNOTSUPP; +} + +error_t +S_file_chauthor (struct sock_user *user, + uid_t author) +{ + return EOPNOTSUPP; +} + +error_t +S_file_check_access (struct sock_user *cred, int *type) +{ + if (!cred) + return EOPNOTSUPP; + + *type = 0; + if (cred->sock->read_pipe) + *type |= O_READ; + if (cred->sock->write_pipe) + *type |= O_WRITE; + + return 0; +} + +error_t +S_file_chflags (struct sock_user *cred, int flags) +{ + return EOPNOTSUPP; +} + +error_t +S_file_notice_changes (struct sock_user *cred, mach_port_t notify) +{ + return EOPNOTSUPP; +} + +error_t +S_file_chmod (struct sock_user *cred, mode_t mode) +{ + return EOPNOTSUPP; +} + +error_t +S_file_chown (struct sock_user *cred, uid_t uid, gid_t gid) +{ + return EOPNOTSUPP; +} + +error_t +S_file_exec (struct sock_user *cred, + task_t task, + int flags, + char *argv, + size_t argvlen, + char *envp, + size_t envplen, + mach_port_t *fds, + size_t fdslen, + mach_port_t *portarray, + size_t portarraylen, + int *intarray, + size_t intarraylen, + mach_port_t *deallocnames, + size_t deallocnameslen, + mach_port_t *destroynames, + size_t destroynameslen) +{ + return EOPNOTSUPP; +} + +error_t +S_file_get_children (struct sock_user *cred, + char **children, + mach_msg_type_number_t *children_len) +{ + return EOPNOTSUPP; +} + +error_t +S_file_getcontrol (struct sock_user *cred, + mach_port_t *control, + mach_msg_type_name_t *controltype) +{ + return EOPNOTSUPP; +} + +error_t +S_file_getfh (struct sock_user *cred, char **fh, size_t *fh_len) +{ + return EOPNOTSUPP; +} + +error_t +S_file_get_fs_options (struct sock_user *cred, char **data, size_t *data_len) +{ + return EOPNOTSUPP; +} + +error_t +S_file_getlinknode (struct sock_user *cred, + file_t *port, + mach_msg_type_name_t *portpoly) +{ + return EOPNOTSUPP; +} + +error_t +S_file_get_source (struct sock_user *cred, char *source) +{ + return EOPNOTSUPP; +} + +error_t +S_file_get_storage_info (struct sock_user *cred, + mach_port_t **ports, + mach_msg_type_name_t *ports_type, + mach_msg_type_number_t *num_ports, + int **ints, mach_msg_type_number_t *num_ints, + off_t **offsets, + mach_msg_type_number_t *num_offsets, + char **data, mach_msg_type_number_t *data_len) +{ + return EOPNOTSUPP; +} + +error_t +S_file_get_translator (struct sock_user *cred, char **trans, size_t *translen) +{ + return EOPNOTSUPP; +} + +error_t +S_file_get_translator_cntl (struct sock_user *cred, + mach_port_t *ctl, + mach_msg_type_name_t *ctltype) +{ + return EOPNOTSUPP; +} + +error_t +S_file_lock (struct sock_user *cred, int flags) +{ + return EOPNOTSUPP; +} + +error_t +S_file_lock_stat (struct sock_user *cred, int *mystatus, int *otherstatus) +{ + return EOPNOTSUPP; +} + +error_t +S_file_reparent (struct sock_user *cred, mach_port_t parent, + mach_port_t *new, mach_msg_type_name_t *new_type) +{ + return EOPNOTSUPP; +} + +error_t +S_file_set_size (struct sock_user *cred, off_t size) +{ + return EOPNOTSUPP; +} + +error_t +S_file_set_translator (struct sock_user *cred, + int passive_flags, + int active_flags, + int killtrans_flags, + char *passive, + size_t passivelen, + fsys_t active) +{ + return EOPNOTSUPP; +} + +error_t +S_file_statfs (struct sock_user *file, fsys_statfsbuf_t *statbuf) +{ + return EOPNOTSUPP; +} + +error_t +S_file_sync (struct sock_user *cred, int wait, int omitmetadata) +{ + return EOPNOTSUPP; +} + +error_t +S_file_syncfs (struct sock_user *cred, int wait, int dochildren) +{ + return EOPNOTSUPP; +} + +error_t +S_file_utimes (struct sock_user *cred, time_value_t atime, time_value_t mtime) +{ + return EOPNOTSUPP; +} diff --git a/pflocal/mig-mutate.h b/pflocal/mig-mutate.h index 238c806b..0743f336 100644 --- a/pflocal/mig-mutate.h +++ b/pflocal/mig-mutate.h @@ -26,6 +26,12 @@ #define IO_IMPORTS import "mig-decls.h"; +#define FILE_INTRAN sock_user_t begin_using_sock_user_port (io_t) +#define FILE_INTRAN_PAYLOAD sock_user_t begin_using_sock_user_payload +#define FILE_DESTRUCTOR end_using_sock_user_port (sock_user_t) + +#define FILE_IMPORTS import "mig-decls.h"; + #define SOCKET_INTRAN sock_user_t begin_using_sock_user_port (socket_t) #define SOCKET_INTRAN_PAYLOAD sock_user_t begin_using_sock_user_payload #define SOCKET_DESTRUCTOR end_using_sock_user_port (sock_user_t) diff --git a/pflocal/sserver.c b/pflocal/sserver.c index 7df69a41..e500a75f 100644 --- a/pflocal/sserver.c +++ b/pflocal/sserver.c @@ -33,6 +33,7 @@ static int sock_server_active = 0; static pthread_spinlock_t sock_server_active_lock = PTHREAD_SPINLOCK_INITIALIZER; #include "io_S.h" +#include "fs_S.h" #include "socket_S.h" #include "../libports/interrupt_S.h" #include "../libports/notify_S.h" @@ -43,6 +44,7 @@ sock_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) { mig_routine_t routine; if ((routine = io_server_routine (inp)) || + (routine = fs_server_routine (inp)) || (routine = socket_server_routine (inp)) || (routine = ports_interrupt_server_routine (inp)) || (routine = ports_notify_server_routine (inp))) |