Changeset bada2f7 in rtems-libbsd


Ignore:
Timestamp:
Oct 15, 2013, 12:05:50 PM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
Children:
6ffb9b9
Parents:
609df33
git-author:
Sebastian Huber <sebastian.huber@…> (10/15/13 12:05:50)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:47)
Message:

Add socket fstat() support

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/kern/sys_socket.c

    r609df33 rbada2f7  
    241241        return (sopoll(so, events, fp->f_cred, td));
    242242}
    243 
     243#endif /* __rtems__ */
     244
     245#ifndef __rtems__
    244246int
    245247soo_stat(struct file *fp, struct stat *ub, struct ucred *active_cred,
     
    247249{
    248250        struct socket *so = fp->f_data;
     251#else /* __rtems__ */
     252static int
     253soo_stat(struct socket *so, struct stat *ub)
     254{
     255#endif /* __rtems__ */
    249256#ifdef MAC
    250257        int error;
    251258#endif
    252259
     260#ifndef __rtems__
    253261        bzero((caddr_t)ub, sizeof (*ub));
     262#endif /* __rtems__ */
    254263        ub->st_mode = S_IFSOCK;
    255264#ifdef MAC
     
    271280        if ((so->so_snd.sb_state & SBS_CANTSENDMORE) == 0)
    272281                ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
     282#ifndef __rtems__
    273283        ub->st_uid = so->so_cred->cr_uid;
    274284        ub->st_gid = so->so_cred->cr_gid;
     285#else /* __rtems__ */
     286        ub->st_uid = BSD_DEFAULT_UID;
     287        ub->st_gid = BSD_DEFAULT_GID;
     288#endif /* __rtems__ */
    275289        return (*so->so_proto->pr_usrreqs->pru_sense)(so, ub);
     290}
     291#ifdef __rtems__
     292static int
     293rtems_bsd_soo_stat(
     294        const rtems_filesystem_location_info_t *loc,
     295        struct stat *buf
     296)
     297{
     298        struct socket *so = rtems_bsd_loc_to_f_data(loc);
     299        int error = soo_stat(so, buf);
     300
     301        return rtems_bsd_error_to_status_and_errno(error);
    276302}
    277303#endif /* __rtems__ */
     
    322348        .ioctl_h = rtems_filesystem_default_ioctl,
    323349        .lseek_h = rtems_filesystem_default_lseek,
    324         .fstat_h = rtems_filesystem_default_fstat,
     350        .fstat_h = rtems_bsd_soo_stat,
    325351        .ftruncate_h = rtems_filesystem_default_ftruncate,
    326352        .fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
  • testsuite/syscalls01/test_main.c

    r609df33 rbada2f7  
    3232#include <sys/cdefs.h>
    3333#include <sys/types.h>
     34#include <sys/stat.h>
    3435#include <sys/socket.h>
    3536#include <netinet/in.h>
     
    4647
    4748#define TEST_NAME "LIBBSD SYSCALLS 1"
     49
     50typedef void (*no_mem_test_body)(int fd);
     51
     52typedef struct {
     53        no_mem_test_body body;
     54        int fd;
     55        rtems_id master_task;
     56} no_mem_test;
    4857
    4958typedef struct {
     
    209218
    210219static void
     220no_mem_task(rtems_task_argument arg)
     221{
     222        const no_mem_test *self = (const no_mem_test *) arg;
     223        rtems_status_code sc;
     224        void *greedy;
     225
     226        assert(rtems_configuration_get_unified_work_area());
     227
     228        greedy = rtems_workspace_greedy_allocate(NULL, 0);
     229        (*self->body)(self->fd);
     230        rtems_workspace_greedy_free(greedy);
     231
     232        sc = rtems_event_transient_send(self->master_task);
     233        assert(sc == RTEMS_SUCCESSFUL);
     234
     235        sc = rtems_task_suspend(RTEMS_SELF);
     236        assert(sc == RTEMS_SUCCESSFUL);
     237}
     238
     239static void
     240do_no_mem_test(no_mem_test_body body, int fd)
     241{
     242        no_mem_test test = {
     243                .body = body,
     244                .fd = fd,
     245                .master_task = rtems_task_self()
     246        };
     247        rtems_status_code sc;
     248        rtems_id id;
     249        rtems_resource_snapshot snapshot;
     250
     251        rtems_resource_snapshot_take(&snapshot);
     252
     253        sc = rtems_task_create(
     254                rtems_build_name('N', 'M', 'E', 'M'),
     255                RTEMS_MINIMUM_PRIORITY,
     256                RTEMS_MINIMUM_STACK_SIZE,
     257                RTEMS_DEFAULT_MODES,
     258                RTEMS_DEFAULT_ATTRIBUTES,
     259                &id
     260        );
     261        assert(sc == RTEMS_SUCCESSFUL);
     262
     263        sc = rtems_task_start(id, no_mem_task, (rtems_task_argument) &test);
     264        assert(sc == RTEMS_SUCCESSFUL);
     265
     266        sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
     267        assert(sc == RTEMS_SUCCESSFUL);
     268
     269        sc = rtems_task_delete(id);
     270        assert(sc == RTEMS_SUCCESSFUL);
     271
     272        assert(rtems_resource_snapshot_check(&snapshot));
     273}
     274
     275static void
    211276test_socket(const socket_test *st)
    212277{
     
    295360}
    296361
     362static void
     363no_mem_socket_fstat(int fd)
     364{
     365        struct stat st;
     366        int rv;
     367
     368        rv = fstat(fd, &st);
     369        assert(rv == 0);
     370}
     371
     372static void
     373test_socket_fstat(void)
     374{
     375        mode_t canrecv = S_IRUSR | S_IRGRP | S_IROTH;
     376        mode_t cansend = S_IWUSR | S_IWGRP | S_IWOTH;
     377        rtems_resource_snapshot snapshot;
     378        struct stat st;
     379        int sd;
     380        int rv;
     381
     382        puts("test socket fstat");
     383
     384        rtems_resource_snapshot_take(&snapshot);
     385
     386        sd = socket(PF_INET, SOCK_DGRAM, 0);
     387        assert(sd >= 0);
     388
     389        do_no_mem_test(no_mem_socket_fstat, sd);
     390
     391        rv = fstat(sd, &st);
     392        assert(rv == 0);
     393        assert(st.st_mode == (S_IFSOCK | canrecv | cansend));
     394
     395        rv = close(sd);
     396        assert(rv == 0);
     397
     398        assert(rtems_resource_snapshot_check(&snapshot));
     399}
    297400
    298401static void
     
    303406
    304407        test_socket_unsupported_ops();
     408        test_socket_fstat();
    305409
    306410        puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset for help on using the changeset viewer.