2018-12-10 01:28:32 +08:00
|
|
|
/*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
#include <sys/syscall.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <error.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <fcntl.h>
|
2019-03-10 23:25:02 +08:00
|
|
|
#include <evl/proxy.h>
|
2019-10-31 20:55:28 +08:00
|
|
|
#include "helpers.h"
|
2018-12-10 01:28:32 +08:00
|
|
|
|
|
|
|
static inline int do_memfd_create(const char *name, int flags)
|
|
|
|
{
|
|
|
|
return syscall(__NR_memfd_create, name, flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
int memfd, efd, ret;
|
|
|
|
char *name;
|
|
|
|
void *p;
|
|
|
|
|
|
|
|
if (argc > 1) {
|
2019-03-10 23:25:02 +08:00
|
|
|
ret = chdir("/dev/evl/proxy");
|
2018-12-10 01:28:32 +08:00
|
|
|
(void)ret;
|
|
|
|
efd = open(argv[1], O_RDWR);
|
|
|
|
if (efd < 0)
|
2019-02-23 22:32:13 +08:00
|
|
|
error(1, errno, "%s open %s", argv[0], argv[1]);
|
2018-12-10 01:28:32 +08:00
|
|
|
p = mmap(NULL, 1024, PROT_READ|PROT_WRITE,
|
|
|
|
MAP_SHARED, efd, 0);
|
|
|
|
if (p == MAP_FAILED)
|
|
|
|
error(1, errno, "mmap child");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
memfd = do_memfd_create("evl", 0);
|
|
|
|
if (memfd < 0)
|
|
|
|
error(1, errno, "memfd_create");
|
|
|
|
|
|
|
|
ret = ftruncate(memfd, 1024);
|
|
|
|
if (ret)
|
|
|
|
error(1, errno, "ftruncate");
|
|
|
|
|
|
|
|
p = mmap(NULL, 1024, PROT_READ|PROT_WRITE,
|
|
|
|
MAP_SHARED, memfd, 0);
|
|
|
|
if (p == MAP_FAILED)
|
|
|
|
error(1, errno, "mmap");
|
|
|
|
|
|
|
|
strcpy(p, "mapfd-test");
|
|
|
|
|
lib: introduce element visibility attribute
Since core ABI 21, users can decide whether a new element should be
made public or private depending on the value of clone flags added to
the new long form of all element creation calls, i.e. evl_create_*().
All evl_new_*() calls become a shorthand for their respective long
form with reasonable default arguments, including private visibility.
As a shorthand, libevl also interprets a slash character leading the
name argument passed to these services as an implicit request for
creating a public element. In other words, this is the same as passing
EVL_CLONE_PUBLIC in the clone flags.
A public element appears as a cdev in the /dev/evl hierarchy, which
means that it is visible to other processes, which may share it. On
the contrary, a private element is only known from the process
creating it, although it does appear in the /sysfs hierarchy
regardless.
e.g.:
efd = evl_attach_self("/visible-thread");
total 0
crw-rw---- 1 root root 248, 1 Apr 17 11:59 clone
crw-rw---- 1 root root 246, 0 Apr 17 11:59 visible-thread
or,
efd = evl_attach_self("private-thread");
total 0
crw-rw---- 1 root root 248, 1 Apr 17 11:59 clone
Signed-off-by: Philippe Gerum <rpm@xenomai.org>
2020-04-17 18:24:28 +08:00
|
|
|
ret = asprintf(&name, "/proxy:%d", getpid());
|
2018-12-10 01:28:32 +08:00
|
|
|
(void)ret;
|
lib: introduce element visibility attribute
Since core ABI 21, users can decide whether a new element should be
made public or private depending on the value of clone flags added to
the new long form of all element creation calls, i.e. evl_create_*().
All evl_new_*() calls become a shorthand for their respective long
form with reasonable default arguments, including private visibility.
As a shorthand, libevl also interprets a slash character leading the
name argument passed to these services as an implicit request for
creating a public element. In other words, this is the same as passing
EVL_CLONE_PUBLIC in the clone flags.
A public element appears as a cdev in the /dev/evl hierarchy, which
means that it is visible to other processes, which may share it. On
the contrary, a private element is only known from the process
creating it, although it does appear in the /sysfs hierarchy
regardless.
e.g.:
efd = evl_attach_self("/visible-thread");
total 0
crw-rw---- 1 root root 248, 1 Apr 17 11:59 clone
crw-rw---- 1 root root 246, 0 Apr 17 11:59 visible-thread
or,
efd = evl_attach_self("private-thread");
total 0
crw-rw---- 1 root root 248, 1 Apr 17 11:59 clone
Signed-off-by: Philippe Gerum <rpm@xenomai.org>
2020-04-17 18:24:28 +08:00
|
|
|
__Tcall_assert(efd, evl_new_proxy(memfd, 0, "%s", name));
|
2018-12-10 01:28:32 +08:00
|
|
|
|
|
|
|
switch (fork()) {
|
|
|
|
case 0:
|
|
|
|
sleep(1);
|
|
|
|
return 0;
|
|
|
|
default:
|
lib: introduce element visibility attribute
Since core ABI 21, users can decide whether a new element should be
made public or private depending on the value of clone flags added to
the new long form of all element creation calls, i.e. evl_create_*().
All evl_new_*() calls become a shorthand for their respective long
form with reasonable default arguments, including private visibility.
As a shorthand, libevl also interprets a slash character leading the
name argument passed to these services as an implicit request for
creating a public element. In other words, this is the same as passing
EVL_CLONE_PUBLIC in the clone flags.
A public element appears as a cdev in the /dev/evl hierarchy, which
means that it is visible to other processes, which may share it. On
the contrary, a private element is only known from the process
creating it, although it does appear in the /sysfs hierarchy
regardless.
e.g.:
efd = evl_attach_self("/visible-thread");
total 0
crw-rw---- 1 root root 248, 1 Apr 17 11:59 clone
crw-rw---- 1 root root 246, 0 Apr 17 11:59 visible-thread
or,
efd = evl_attach_self("private-thread");
total 0
crw-rw---- 1 root root 248, 1 Apr 17 11:59 clone
Signed-off-by: Philippe Gerum <rpm@xenomai.org>
2020-04-17 18:24:28 +08:00
|
|
|
execlp(argv[0], "mapfd", name + 1, NULL);
|
2019-10-31 20:55:28 +08:00
|
|
|
return 1;
|
2018-12-10 01:28:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|