Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add The Linux Programming Interface under examples #2806

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions examples/tlpi/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/tlpi
57 changes: 57 additions & 0 deletions examples/tlpi/0001-add-ename.c.inc.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
From 57d210aa51e9706c3e21156d873bf356527be8c7 Mon Sep 17 00:00:00 2001
From: chenzhijia <[email protected]>
Date: Tue, 19 Mar 2024 11:26:27 +0800
Subject: [PATCH] Linux case base:add ename.c.inc

add source code ename.c.inc

Change-Id: Ie31e2ac3908ce46cfb22102d8cc18fa1b961deb4
Signed-off-by: chenzhijia <[email protected]>
---

diff --git a/lib/ename.c.inc b/lib/ename.c.inc
new file mode 100644
index 0000000..42642e1
--- /dev/null
+++ b/lib/ename.c.inc
@@ -0,0 +1,39 @@
+/* ename.c.inc
+
+ Built on GNU/Linux x86_64 with glibc 2.38
+*/
+static char *ename[] = {
+ /* 0 */ "",
+ /* 1 */ "EPERM", "ENOENT", "ESRCH", "EINTR", "EIO", "ENXIO",
+ /* 7 */ "E2BIG", "ENOEXEC", "EBADF", "ECHILD",
+ /* 11 */ "EAGAIN/EWOULDBLOCK", "ENOMEM", "EACCES", "EFAULT",
+ /* 15 */ "ENOTBLK", "EBUSY", "EEXIST", "EXDEV", "ENODEV",
+ /* 20 */ "ENOTDIR", "EISDIR", "EINVAL", "ENFILE", "EMFILE",
+ /* 25 */ "ENOTTY", "ETXTBSY", "EFBIG", "ENOSPC", "ESPIPE",
+ /* 30 */ "EROFS", "EMLINK", "EPIPE", "EDOM", "ERANGE",
+ /* 35 */ "EDEADLK/EDEADLOCK", "ENAMETOOLONG", "ENOLCK", "ENOSYS",
+ /* 39 */ "ENOTEMPTY", "ELOOP", "", "ENOMSG", "EIDRM", "ECHRNG",
+ /* 45 */ "EL2NSYNC", "EL3HLT", "EL3RST", "ELNRNG", "EUNATCH",
+ /* 50 */ "ENOCSI", "EL2HLT", "EBADE", "EBADR", "EXFULL", "ENOANO",
+ /* 56 */ "EBADRQC", "EBADSLT", "", "EBFONT", "ENOSTR", "ENODATA",
+ /* 62 */ "ETIME", "ENOSR", "ENONET", "ENOPKG", "EREMOTE",
+ /* 67 */ "ENOLINK", "EADV", "ESRMNT", "ECOMM", "EPROTO",
+ /* 72 */ "EMULTIHOP", "EDOTDOT", "EBADMSG", "EOVERFLOW",
+ /* 76 */ "ENOTUNIQ", "EBADFD", "EREMCHG", "ELIBACC", "ELIBBAD",
+ /* 81 */ "ELIBSCN", "ELIBMAX", "ELIBEXEC", "EILSEQ", "ERESTART",
+ /* 86 */ "ESTRPIPE", "EUSERS", "ENOTSOCK", "EDESTADDRREQ",
+ /* 90 */ "EMSGSIZE", "EPROTOTYPE", "ENOPROTOOPT",
+ /* 93 */ "EPROTONOSUPPORT", "ESOCKTNOSUPPORT",
+ /* 95 */ "EOPNOTSUPP/ENOTSUP", "EPFNOSUPPORT", "EAFNOSUPPORT",
+ /* 98 */ "EADDRINUSE", "EADDRNOTAVAIL", "ENETDOWN", "ENETUNREACH",
+ /* 102 */ "ENETRESET", "ECONNABORTED", "ECONNRESET", "ENOBUFS",
+ /* 106 */ "EISCONN", "ENOTCONN", "ESHUTDOWN", "ETOOMANYREFS",
+ /* 110 */ "ETIMEDOUT", "ECONNREFUSED", "EHOSTDOWN", "EHOSTUNREACH",
+ /* 114 */ "EALREADY", "EINPROGRESS", "ESTALE", "EUCLEAN",
+ /* 118 */ "ENOTNAM", "ENAVAIL", "EISNAM", "EREMOTEIO", "EDQUOT",
+ /* 123 */ "ENOMEDIUM", "EMEDIUMTYPE", "ECANCELED", "ENOKEY",
+ /* 127 */ "EKEYEXPIRED", "EKEYREVOKED", "EKEYREJECTED",
+ /* 130 */ "EOWNERDEAD", "ENOTRECOVERABLE", "ERFKILL", "EHWPOISON"
+};
+
+#define MAX_ENAME 133
\ No newline at end of file
111 changes: 111 additions & 0 deletions examples/tlpi/0002-fix-setenv-compilation-error.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
From f1154cd6558b99aa5827ac98b20a20753dabd865 Mon Sep 17 00:00:00 2001
From: chenzhijia <[email protected]>
Date: Tue, 18 Jun 2024 18:19:18 +0800
Subject: [PATCH] tlpi/proc:fix setenv case

Remove duplicate functions and invalid commands

Change-Id: I59d84511356f6da7313844bfad63ac466fd3075f
Signed-off-by: chenzhijia <[email protected]>
---

diff --git a/proc/setenv.c b/proc/setenv.c
index d396628..d75ae35 100644
--- a/proc/setenv.c
+++ b/proc/setenv.c
@@ -21,92 +21,25 @@
#include <errno.h>

int
-unsetenv(const char *name)
-{
- extern char **environ;
- char **ep, **sp;
- size_t len;
-
- if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL) {
- errno = EINVAL;
- return -1;
- }
-
- len = strlen(name);
-
- for (ep = environ; *ep != NULL; )
- if (strncmp(*ep, name, len) == 0 && (*ep)[len] == '=') {
-
- /* Remove found entry by shifting all successive entries
- back one element */
-
- for (sp = ep; *sp != NULL; sp++)
- *sp = *(sp + 1);
-
- /* Continue around the loop to further instances of 'name' */
-
- } else {
- ep++;
- }
-
- return 0;
-}
-
-int
-setenv(const char *name, const char *value, int overwrite)
-{
- char *es;
-
- if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL ||
- value == NULL) {
- errno = EINVAL;
- return -1;
- }
-
- if (getenv(name) != NULL && overwrite == 0)
- return 0;
-
- unsetenv(name); /* Remove all occurrences */
-
- es = malloc(strlen(name) + strlen(value) + 2);
- /* +2 for '=' and null terminator */
- if (es == NULL)
- return -1;
-
- strcpy(es, name);
- strcat(es, "=");
- strcat(es, value);
-
- return (putenv(es) != 0) ? -1 : 0;
-}
-
-#ifdef TEST_IT
-
-int
main()
{
if (putenv("TT=xxxxx") != 0)
perror("putenv");

system("echo '***** Environment before unsetenv(TT)'; "
- "printenv | grep ^TT");
- system("echo 'Total lines from printenv:' `printenv | wc -l`");
+ "env");

unsetenv("TT");

system("echo '***** Environment after unsetenv(TT)'; "
- "printenv | grep ^TT");
- system("echo 'Total lines from printenv:' `printenv | wc -l`");
+ "env");

setenv("xyz", "one", 1);
setenv("xyz", "two", 0);
setenv("xyz2", "222", 0);

system("echo '***** Environment after setenv() calls'; "
- "printenv | grep ^x");
- system("echo 'Total lines from printenv:' `printenv | wc -l`");
+ "env");

exit(EXIT_SUCCESS);
}
-
-#endif
66 changes: 66 additions & 0 deletions examples/tlpi/0003-fix-memoryleak-in-check_password.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
From 03445e7bf9916a58a4b80d7062d577f38ed2b279 Mon Sep 17 00:00:00 2001
From: chenzhijia <[email protected]>
Date: Tue, 14 May 2024 16:40:28 +0800
Subject: [PATCH] tlpi/users_groups:Fix memory leak in check_password

free memory before program exits

Change-Id: I28789b5ceaec4aaa45bb13f66cb3f61de1111841
Signed-off-by: chenzhijia <[email protected]>
---

diff --git a/users_groups/check_password.c b/users_groups/check_password.c
index c142ac7..a70cbb6 100644
--- a/users_groups/check_password.c
+++ b/users_groups/check_password.c
@@ -30,6 +30,22 @@
#include <shadow.h>
#include "tlpi_hdr.h"

+#define fatal(msg) \
+ do \
+ { \
+ free(username); \
+ fatal(msg); \
+ } \
+ while (0)
+
+#define errExit(msg) \
+ do \
+ { \
+ free(username); \
+ errExit(msg); \
+ } \
+ while (0)
+
int
main(int argc, char *argv[])
{
@@ -53,7 +69,7 @@
printf("Username: ");
fflush(stdout);
if (fgets(username, lnmax, stdin) == NULL)
- exit(EXIT_FAILURE); /* Exit on EOF */
+ goto err; /* Exit on EOF */

len = strlen(username);
if (username[len - 1] == '\n')
@@ -85,12 +101,17 @@
authOk = strcmp(encrypted, pwd->pw_passwd) == 0;
if (!authOk) {
printf("Incorrect password\n");
- exit(EXIT_FAILURE);
+ goto err;
}

printf("Successfully authenticated: UID=%ld\n", (long) pwd->pw_uid);

/* Now do authenticated work... */

+ free(username);
exit(EXIT_SUCCESS);
+
+err:
+ free(username);
+ exit(EXIT_FAILURE);
}
37 changes: 37 additions & 0 deletions examples/tlpi/0004-fix-compilation-error.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
From 65230c70d69b253028c0f912dcd1ae0cb7446015 Mon Sep 17 00:00:00 2001
From: chenzhijia <[email protected]>
Date: Wed, 30 Oct 2024 10:52:48 +0800
Subject: [PATCH] tlpi/sockets:Fix compilation error

Fix compilation error in qemu

Change-Id: I854ed64d163398807a07fa697bdea89bfab77236
Signed-off-by: chenzhijia <[email protected]>
---

diff --git a/sockets/list_host_addresses.c b/sockets/list_host_addresses.c
index 4db58f6..e1864c8 100644
--- a/sockets/list_host_addresses.c
+++ b/sockets/list_host_addresses.c
@@ -23,7 +23,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
-#include <linux/if_link.h>
+//#include <linux/if_link.h>

int
main(int argc, char *argv[])
diff --git a/sockets/sendfile.c b/sockets/sendfile.c
index 54549d7..3697099 100644
--- a/sockets/sendfile.c
+++ b/sockets/sendfile.c
@@ -17,7 +17,7 @@
#include "tlpi_hdr.h"
#define BUF_SIZE 8192

-ssize_t
+static ssize_t
sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
{
off_t orig;
22 changes: 22 additions & 0 deletions examples/tlpi/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

config EXAMPLES_TLPI
tristate "The Linux Programming Interface Example"
default n
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

depends on ALLOW_GPL_COMPONENTS

---help---
Enable the tlpi

if EXAMPLES_TLPI

config EXAMPLES_TLPI_PRIORITY
int "Task priority"
default 100

config EXAMPLES_TLPI_STACKSIZE
int "Stack size"
default DEFAULT_TASK_STACKSIZE

endif
23 changes: 23 additions & 0 deletions examples/tlpi/Make.defs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
############################################################################
# apps/examples/tlpi/Make.defs
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################

ifneq ($(CONFIG_EXAMPLES_TLPI),)
CONFIGURED_APPS += $(APPDIR)/examples/tlpi
endif
Loading
Loading