L4Re/departure

libfsserver/lib/files/opener_context_resource.cc

266:34d664a89803
2022-02-25 Paul Boddie Added support for the stat operation.
     1 /*     2  * A context resource offering support for opening files.     3  *     4  * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk>     5  *     6  * This program is free software; you can redistribute it and/or     7  * modify it under the terms of the GNU General Public License as     8  * published by the Free Software Foundation; either version 2 of     9  * the License, or (at your option) any later version.    10  *    11  * This program is distributed in the hope that it will be useful,    12  * but WITHOUT ANY WARRANTY; without even the implied warranty of    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    14  * GNU General Public License for more details.    15  *    16  * You should have received a copy of the GNU General Public License    17  * along with this program; if not, write to the Free Software    18  * Foundation, Inc., 51 Franklin Street, Fifth Floor,    19  * Boston, MA  02110-1301, USA    20  */    21     22 #include <ipc/cap_alloc.h>    23     24 #include "opener_context_resource.h"    25 #include "opener_context_object_server.h"    26 #include "opener_resource.h"    27     28 #include <string.h>    29     30     31     32 /* Support for providing access to files. */    33     34 OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory)    35 : SimplePager(memory), _opener(opener)    36 {    37 }    38     39 int OpenerContextResource::expected_items()    40 {    41     return OpenerContextObject_expected_items;    42 }    43     44 ipc_server_handler_type OpenerContextResource::handler()    45 {    46     return (ipc_server_handler_type) handle_OpenerContextObject;    47 }    48     49     50     51 /* Data access methods. */    52     53 char *OpenerContextResource::get_path(offset_t offset)    54 {    55     char *buffer = _region->read(offset);    56     offset_t size = _region->size();    57     58     /* Confine the path to the limit of the buffer. */    59     60     if ((buffer != NULL) && (strnlen(buffer, size) < size))    61         return buffer;    62     else    63         return NULL;    64 }    65     66     67     68 /* Opener context interface methods. */    69     70 long OpenerContextResource::open(flags_t flags, offset_t *size,    71                                  l4_cap_idx_t *file, object_flags_t *object_flags)    72 {    73     char *path = get_path();    74     75     if (path == NULL)    76         return -L4_EINVAL;    77     78     return _opener->open(path, flags, size, file, object_flags);    79 }    80     81 long OpenerContextResource::remove()    82 {    83     char *path = get_path();    84     85     if (path == NULL)    86         return -L4_EINVAL;    87     88     return _opener->remove(path);    89 }    90     91 long OpenerContextResource::rename()    92 {    93     char *source, *target;    94     95     source = get_path();    96     97     if (source == NULL)    98         return -L4_EINVAL;    99    100     target = get_path(strlen(source) + 1);   101    102     if (target == NULL)   103         return -L4_EINVAL;   104    105     return _opener->rename(source, target);   106 }   107    108 long OpenerContextResource::stat()   109 {   110     char *path = get_path();   111    112     if (path == NULL)   113         return -L4_EINVAL;   114    115     return _opener->stat(path, (void *) _region->start, _region->size());   116 }   117    118 // vim: tabstop=4 expandtab shiftwidth=4