All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alexis Lothoré via buildroot" <buildroot@buildroot.org>
To: buildroot@buildroot.org
Cc: Bernd Kuhls <bernd@kuhls.net>,
	Nicolas Carrier <nicolas.carrier@nav-timing.safrangroup.com>,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: [Buildroot] [PATCH 2/3] package/pppd: add mkdir recursive
Date: Fri, 29 Mar 2024 15:31:37 +0100	[thread overview]
Message-ID: <20240329143138.214780-3-alexis.lothore@bootlin.com> (raw)
In-Reply-To: <20240329143138.214780-1-alexis.lothore@bootlin.com>

From: Alexis Lothoré <alexis.lothore@bootlin.com>

pppd fails to start on buildroot 2024.02, because of non-existing directory
pppd in /var/run. This intermediate patch is needed to bring the second
part of the upstream fix

Upstream: https://github.com/ppp-project/ppp/commit/b0e7307b3569a5dad0f2606d2736cc8317851598
Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
---
Backport to: 2024.02.x
---
 .../pppd/0006-utils-add-mkdir_recursive.patch | 292 ++++++++++++++++++
 1 file changed, 292 insertions(+)
 create mode 100644 package/pppd/0006-utils-add-mkdir_recursive.patch

diff --git a/package/pppd/0006-utils-add-mkdir_recursive.patch b/package/pppd/0006-utils-add-mkdir_recursive.patch
new file mode 100644
index 000000000000..293d913d8301
--- /dev/null
+++ b/package/pppd/0006-utils-add-mkdir_recursive.patch
@@ -0,0 +1,292 @@
+From b0e7307b3569a5dad0f2606d2736cc8317851598 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Alexis=20Lothor=C3=A9?= <alexis.lothore@bootlin.com>
+Date: Wed, 30 Aug 2023 11:46:01 +0900
+Subject: [PATCH 2/3] utils: add mkdir_recursive
+
+From: Dominique Martinet <dominique.martinet@atmark-techno.com>
+
+This will be used in the next commit.
+
+A test file for utils has also been added to check mkdir works as
+intended.
+
+Upstream: https://github.com/ppp-project/ppp/commit/b0e7307b3569a5dad0f2606d2736cc8317851598
+Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
+---
+ pppd/Makefile.am    |   6 ++
+ pppd/pppd-private.h |   1 +
+ pppd/utils.c        |  82 ++++++++++++++++++++++++++
+ pppd/utils_utest.c  | 139 ++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 228 insertions(+)
+ create mode 100644 pppd/utils_utest.c
+
+diff --git a/pppd/Makefile.am b/pppd/Makefile.am
+index 7cb30053322e..c5fe10776ede 100644
+--- a/pppd/Makefile.am
++++ b/pppd/Makefile.am
+@@ -20,6 +20,12 @@ utest_pppcrypt_LDFLAGS =
+ 
+ check_PROGRAMS += utest_crypto
+ 
++utest_utils_SOURCES = utils.c utils_utest.c
++utest_utils_CPPFLAGS = -DUNIT_TEST
++utest_utils_LDFLAGS =
++
++check_PROGRAMS += utest_utils
++
+ if WITH_SRP
+ sbin_PROGRAMS += srp-entry
+ dist_man8_MANS += srp-entry.8
+diff --git a/pppd/pppd-private.h b/pppd/pppd-private.h
+index 2883e4622acb..46ce0c8bdceb 100644
+--- a/pppd/pppd-private.h
++++ b/pppd/pppd-private.h
+@@ -437,6 +437,7 @@ int  sifproxyarp(int, u_int32_t);
+ int  cifproxyarp(int, u_int32_t);
+ 				/* Delete proxy ARP entry for peer */
+ u_int32_t GetMask(u_int32_t); /* Get appropriate netmask for address */
++int  mkdir_recursive(const char *); /* Recursively create directory */
+ int  lock(char *);	/* Create lock file for device */
+ int  relock(int);		/* Rewrite lock file with new pid */
+ void unlock(void);	/* Delete previously-created lock file */
+diff --git a/pppd/utils.c b/pppd/utils.c
+index c1bdbbbfe4e5..c47192e67fef 100644
+--- a/pppd/utils.c
++++ b/pppd/utils.c
+@@ -781,6 +781,88 @@ complete_read(int fd, void *buf, size_t count)
+ }
+ #endif
+ 
++/*
++ * mkdir_check - helper for mkdir_recursive, creates a directory
++ * but do not error on EEXIST if and only if entry is a directory
++ * The caller must check for errno == ENOENT if appropriate.
++ */
++static int
++mkdir_check(const char *path)
++{
++    struct stat statbuf;
++
++    if (mkdir(path, 0755) >= 0)
++	return 0;
++
++    if (errno == EEXIST) {
++	if (stat(path, &statbuf) < 0)
++	    /* got raced? */
++	    return -1;
++
++	if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
++	    return 0;
++
++	/* already exists but not a dir, treat as failure */
++	errno = EEXIST;
++	return -1;
++    }
++
++    return -1;
++}
++
++/*
++ * mkdir_parent - helper for mkdir_recursive, modifies the string in place
++ * Assumes mkdir(path) already failed, so it first creates the parent then
++ * full path again.
++ */
++static int
++mkdir_parent(char *path)
++{
++    char *slash;
++    int rc;
++
++    slash = strrchr(path, '/');
++    if (!slash)
++	return -1;
++
++    *slash = 0;
++    if (mkdir_check(path) < 0) {
++	if (errno != ENOENT) {
++	    *slash = '/';
++	    return -1;
++	}
++	if (mkdir_parent(path) < 0) {
++	    *slash = '/';
++	    return -1;
++	}
++    }
++    *slash = '/';
++
++    return mkdir_check(path);
++}
++
++/*
++ * mkdir_recursive - recursively create directory if it didn't exist
++ */
++int
++mkdir_recursive(const char *path)
++{
++    char *copy;
++    int rc;
++
++    // optimistically try on full path first to avoid allocation
++    if (mkdir_check(path) == 0)
++	return 0;
++
++    copy = strdup(path);
++    if (!copy)
++	return -1;
++
++    rc = mkdir_parent(copy);
++    free(copy);
++    return rc;
++}
++
+ /* Procedures for locking the serial device using a lock file. */
+ static char lock_file[MAXPATHLEN];
+ 
+diff --git a/pppd/utils_utest.c b/pppd/utils_utest.c
+new file mode 100644
+index 000000000000..cdca97e6d025
+--- /dev/null
++++ b/pppd/utils_utest.c
+@@ -0,0 +1,139 @@
++#include <fcntl.h>
++#include <string.h>
++#include <sys/stat.h>
++#include <unistd.h>
++
++#include "pppd-private.h"
++
++/* globals used in test.c... */
++int debug = 1;
++int error_count;
++int unsuccess;
++
++/* check if path exists and returns its type */
++static int
++file_type(char *path)
++{
++    struct stat statbuf;
++
++    if (stat(path, &statbuf) < 0)
++	return -1;
++
++    return statbuf.st_mode & S_IFMT;
++}
++
++int
++test_simple() {
++    if (mkdir_recursive("dir"))
++	return -1;
++
++    if (file_type("dir") != S_IFDIR)
++	return -1;
++
++    rmdir("dir");
++    return 0;
++}
++
++int
++test_recurse() {
++    if (mkdir_recursive("dir/subdir/subsubdir"))
++	return -1;
++
++    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
++	return -1;
++
++    rmdir("dir/subdir/subsubdir");
++
++    /* try again with partial existence */
++    if (mkdir_recursive("dir/subdir/subsubdir"))
++	return -1;
++
++    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
++	return -1;
++
++    rmdir("dir/subdir/subsubdir");
++    rmdir("dir/subdir");
++    rmdir("dir");
++    return 0;
++}
++
++int
++test_recurse_multislash() {
++    if (mkdir_recursive("dir/subdir///subsubdir"))
++	return -1;
++
++    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
++	return -1;
++
++    rmdir("dir/subdir/subsubdir");
++    rmdir("dir/subdir");
++
++    /* try again with partial existence */
++    if (mkdir_recursive("dir/subdir/subsubdir///"))
++	return -1;
++
++    if (file_type("dir/subdir/subsubdir") != S_IFDIR)
++	return -1;
++
++    rmdir("dir/subdir/subsubdir");
++    rmdir("dir/subdir");
++    rmdir("dir");
++    return 0;
++}
++
++int
++test_parent_notdir() {
++    int fd = open("file", O_CREAT, 0600);
++    if (fd < 0)
++	return -1;
++    close(fd);
++
++    if (mkdir_recursive("file") == 0)
++	return -1;
++    if (mkdir_recursive("file/dir") == 0)
++	return -1;
++
++    unlink("file");
++    return 0;
++}
++
++int
++main()
++{
++    char *base_dir = strdup("/tmp/ppp_utils_utest.XXXXXX");
++    int failure = 0;
++
++    if (mkdtemp(base_dir) == NULL) {
++	printf("Could not create test directory, aborting\n");
++	return 1;
++    }
++
++    if (chdir(base_dir) < 0) {
++	printf("Could not enter newly created test dir, aborting\n");
++	return 1;
++    }
++
++    if (test_simple()) {
++	printf("Could not create simple directory\n");
++	failure++;
++    }
++
++    if (test_recurse()) {
++	printf("Could not create recursive directory\n");
++	failure++;
++    }
++
++    if (test_recurse_multislash()) {
++	printf("Could not create recursive directory with multiple slashes\n");
++	failure++;
++    }
++
++    if (test_parent_notdir()) {
++	printf("Creating over a file appeared to work?\n");
++	failure++;
++    }
++
++    rmdir(base_dir);
++    free(base_dir);
++    return failure;
++}
+-- 
+2.43.1
+
-- 
2.43.1

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

  parent reply	other threads:[~2024-03-29 14:39 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-29 14:31 [Buildroot] [PATCH 0/3] package/pppd: fix pppd startup with upstream patches Alexis Lothoré via buildroot
2024-03-29 14:31 ` [Buildroot] [PATCH 1/3] package/pppd: revert lock path Alexis Lothoré via buildroot
2024-03-29 14:31 ` Alexis Lothoré via buildroot [this message]
2024-03-29 14:31 ` [Buildroot] [PATCH 3/3] package/pppd: create rundir when it is missing Alexis Lothoré via buildroot
2024-04-10 21:20 ` [Buildroot] [PATCH 0/3] package/pppd: fix pppd startup with upstream patches Thomas Petazzoni via buildroot
2024-04-11  8:49   ` Alexis Lothoré via buildroot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240329143138.214780-3-alexis.lothore@bootlin.com \
    --to=buildroot@buildroot.org \
    --cc=alexis.lothore@bootlin.com \
    --cc=bernd@kuhls.net \
    --cc=nicolas.carrier@nav-timing.safrangroup.com \
    --cc=thomas.petazzoni@bootlin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.