Mikael Lund Jepsen, ICCC wrote:
Joakim Tjernlund wrote:
+ /* skip opening slash */
+ if (*name == '/')
+ ++name;
I think skipping all leading '/' is better:
for (; *name == '/'; ++name);
I took the newlib code verbatim to keep the number of different
implementations down,
but if we are making changes I think we should adopt the glibc code in
this case:
/* Construct the filename. */
while (name[0] == '/')
++name;
Thanks,
Mikael
Jocke
Hi all,
I've changed the patch as suggested by Joakim, but taking the glibc
variant instead as explained previously.
Also, the line in docs/uClibc_vs_SuSv3.txt stating that these functions
are not implemented should be changed as well I think.
I have not included that in the patch as I was not quite sure that it
was ok to simply delete the line.
The test app is unchanged, but attached again for convenience.
Any takers on adding these to cvs?
Thanks,
Mikael
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/wait.h>
char Commonname[] = "MyTestMem";
int TestData[11] = {0,1,2,3,4,5,6,7,8,9,10};
int main(void) {
int pfds[2];
pid_t pid;
int hCommon;
int TestdataFails = 0;
char *pTestData;
unsigned int i;
char buf[30];
int rv;
pipe(pfds);
switch(pid = fork()) {
case -1:
perror("fork");
exit(1); // parent exits
case 0:
// Child
// wait for parent
read(pfds[0], buf, 5);
hCommon = shm_open(Commonname, O_RDWR, DEFFILEMODE);
if (hCommon == -1) {
perror("CHILD - shm_open(existing):");
exit(1);
} else {
pTestData = mmap(0, sizeof(TestData), PROT_READ +
PROT_WRITE, MAP_SHARED, hCommon, 0);
if (pTestData != MAP_FAILED) {
for (i=0; i < sizeof(TestData); i++) {
if (pTestData[i] != TestData[i]) {
printf("%-40s: Offset %d, local
%d, shm %d", "Compare memory error", i, TestData[i], pTestData[i]);
TestdataFails++;
}
}
if (TestdataFails == 0)
printf("%-40s: %s\n", "Compare memory",
"Success");
munmap(pTestData, sizeof(TestData));
}
}
exit(0);
default:
// Parent
hCommon = shm_open(Commonname, O_RDWR+O_CREAT+O_EXCL,
DEFFILEMODE );
if (hCommon == -1) {
perror("PARENT - shm_open(create):");
} else {
if ((ftruncate(hCommon, sizeof(TestData))) == -1)
{
printf("%-40s: %s", "ftruncate",
strerror(errno));
shm_unlink(Commonname);
return 0;
}
pTestData = mmap(0, sizeof(TestData), PROT_READ +
PROT_WRITE, MAP_SHARED, hCommon, 0);
if (pTestData == MAP_FAILED)
{
perror("PARENT - mmap:");
if (shm_unlink(Commonname) == -1) {
perror("PARENT - shm_unklink:");
}
return 0;
}
for (i=0; i <sizeof(TestData); i++)
pTestData[i] = TestData[i];
// signal child
write(pfds[1], "rdy", 5);
// wait for child
wait(&rv);
// Cleanup
munmap(pTestData, sizeof(TestData));
if (shm_unlink(Commonname) == -1) {
perror("PARENT - shm_unklink:");
}
}
}
return 0;
}
diff --git a/librt/shm_open.c b/librt/shm_open.c
new file mode 100644
index 0000000..cb92c3a
--- /dev/null
+++ b/librt/shm_open.c
@@ -0,0 +1,48 @@
+/* shm_open - open a shared memory file */
+
+/* Copyright 2002, Red Hat Inc. */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <limits.h>
+
+int
+shm_open (const char *name, int oflag, mode_t mode)
+{
+ int fd;
+ char shm_name[PATH_MAX+20] = "/dev/shm/";
+
+ /* Construct the filename. */
+ while (name[0] == '/')
+ ++name;
+
+ /* create special shared memory file name and leave enough space to
+ cause a path/name error if name is too long */
+ strlcpy (shm_name + 9, name, PATH_MAX + 10);
+
+ fd = open (shm_name, oflag, mode);
+
+ if (fd != -1)
+ {
+ /* once open we must add FD_CLOEXEC flag to file descriptor */
+ int flags = fcntl (fd, F_GETFD, 0);
+
+ if (flags >= 0)
+ {
+ flags |= FD_CLOEXEC;
+ flags = fcntl (fd, F_SETFD, flags);
+ }
+
+ /* on failure, just close file and give up */
+ if (flags == -1)
+ {
+ close (fd);
+ fd = -1;
+ }
+ }
+
+ return fd;
+}
diff --git a/librt/shm_unlink.c b/librt/shm_unlink.c
new file mode 100644
index 0000000..cf259c6
--- /dev/null
+++ b/librt/shm_unlink.c
@@ -0,0 +1,28 @@
+/* shm_unlink - remove a shared memory file */
+
+/* Copyright 2002, Red Hat Inc. */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+
+int
+shm_unlink (const char *name)
+{
+ int rc;
+ char shm_name[PATH_MAX+20] = "/dev/shm/";
+
+ /* Construct the filename. */
+ while (name[0] == '/')
+ ++name;
+
+ /* create special shared memory file name and leave enough space to
+ cause a path/name error if name is too long */
+ strlcpy (shm_name + 9, name, PATH_MAX + 10);
+
+ rc = unlink (shm_name);
+
+ return rc;
+}
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc