* [LTP] [PATCH v3 01/12] Refactor setpgid01 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 02/12] Add SAFE_PTSNAME macro Andrea Cervesato
` (10 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Test used to fail when running inside an executor that is setting a
new session via setsid(). By using the new LTP library, we fix this
issue since it forks parent first, then execute it, enabling any
setsid() to be run in the main process before execution.
Fixes: https://github.com/linux-test-project/kirk/issues/28
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
testcases/kernel/syscalls/setpgid/setpgid01.c | 152 +++++---------------------
1 file changed, 25 insertions(+), 127 deletions(-)
diff --git a/testcases/kernel/syscalls/setpgid/setpgid01.c b/testcases/kernel/syscalls/setpgid/setpgid01.c
index 60034e01660d5c3aebe8ca960ff64c03f2b539e5..c976c3a5138ce7bca9f92a7d624797a9f2a08154 100644
--- a/testcases/kernel/syscalls/setpgid/setpgid01.c
+++ b/testcases/kernel/syscalls/setpgid/setpgid01.c
@@ -1,150 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
*/
-/* $Id: setpgid01.c,v 1.7 2009/11/02 13:57:18 subrata_modak Exp $ */
-/*
- * Description:
- * Verify that:
- * 1. Basic functionality test for setpgid(2).
- * 2. Check functioning of setpgid(2) with pid = 0 and pgid = 0.
+/*\
+ * [Description]
+ *
+ * Verify basic setpgid() functionality, re-setting group ID inside both parent
+ * and child. In the first case, we obtain getpgrp() and set it. In the second
+ * case, we use setpgid(0, 0).
*/
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <sys/wait.h>
-#include "test.h"
-
-static void setup(void);
-static void cleanup(void);
-
-char *TCID = "setpgid01";
-
-static void setpgid_test1(void);
-static void setpgid_test2(void);
-static void (*testfunc[])(void) = { setpgid_test1, setpgid_test2};
-int TST_TOTAL = ARRAY_SIZE(testfunc);
-
-int main(int ac, char **av)
-{
- int i, lc;
-
- tst_parse_opts(ac, av, NULL, NULL);
-
- setup();
-
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
-
- for (i = 0; i < TST_TOTAL; i++)
- (*testfunc[i])();
- }
-
- cleanup();
- tst_exit();
-}
+#include "tst_test.h"
static void setpgid_test1(void)
{
pid_t pgid, pid;
- pgid = getpgrp();
- pid = getpid();
+ pgid = TST_EXP_PID(getpgrp());
+ pid = TST_EXP_PID(getpid());
- TEST(setpgid(pid, pgid));
- if (TEST_RETURN == -1 || getpgrp() != pgid) {
- tst_resm(TFAIL | TTERRNO, "test setpgid(%d, %d) fail",
- pid, pgid);
- } else {
- tst_resm(TPASS, "test setpgid(%d, %d) success", pid, pgid);
- }
-}
-
-static int wait4child(pid_t child)
-{
- int status;
-
- if (waitpid(child, &status, 0) == -1)
- tst_resm(TBROK|TERRNO, "waitpid");
- if (WIFEXITED(status))
- return WEXITSTATUS(status);
- else
- return status;
+ TST_EXP_PASS(setpgid(pid, pgid));
+ TST_EXP_EQ_LI(pgid, getpgrp());
}
static void setpgid_test2(void)
{
- int ret;
- pid_t pgid, pid;
+ pid_t pgid;
- pid = tst_fork();
- if (pid == -1)
- tst_brkm(TBROK | TERRNO, cleanup, "fork()");
-
- if (pid != 0) {
- ret = wait4child(pid);
- } else {
- pid = getpid();
- TEST(setpgid(0, 0));
- pgid = getpgrp();
- if (TEST_RETURN == -1) {
- fprintf(stderr, "setpgid(0, 0) fails in "
- "child process: %s\n", strerror(TEST_ERRNO));
- exit(1);
- } else if (pgid != pid) {
- fprintf(stderr, "setpgid(0, 0) fails to make PGID"
- "equal to PID\n");
- exit(1);
- } else {
- exit(0);
- }
+ if (!SAFE_FORK()) {
+ pgid = TST_EXP_PID(getpid());
+ TST_EXP_PASS(setpgid(0, 0));
+ TST_EXP_EQ_LI(pgid, getpgrp());
}
-
- if (ret == 0)
- tst_resm(TPASS, "test setpgid(0, 0) success");
- else
- tst_resm(TFAIL, "test setpgid(0, 0) fail");
}
-
-static void setup(void)
+static void run(void)
{
- tst_sig(FORK, DEF_HANDLER, cleanup);
-
- TEST_PAUSE;
+ setpgid_test1();
+ setpgid_test2();
}
-static void cleanup(void)
-{
-}
+static struct tst_test test = {
+ .test_all = run,
+ .forks_child = 1,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 02/12] Add SAFE_PTSNAME macro
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 01/12] Refactor setpgid01 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 03/12] Refactor ptem01 test Andrea Cervesato
` (9 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
include/tst_safe_macros.h | 4 ++++
lib/tst_safe_macros.c | 14 ++++++++++++++
2 files changed, 18 insertions(+)
diff --git a/include/tst_safe_macros.h b/include/tst_safe_macros.h
index a9fa7dbe128f17eace381fdf9f2795684e55969b..6985aa4bd80af2ff8a7c606fdba9830bb5ccd195 100644
--- a/include/tst_safe_macros.h
+++ b/include/tst_safe_macros.h
@@ -528,4 +528,8 @@ ssize_t safe_writev(const char *file, const int lineno, char len_strict,
safe_writev(__FILE__, __LINE__, (len_strict), (fildes), \
(iov), (iovcnt))
+char *safe_ptsname(const char *const file, const int lineno, int masterfd);
+#define SAFE_PTSNAME(masterfd) \
+ safe_ptsname(__FILE__, __LINE__, (masterfd))
+
#endif /* TST_SAFE_MACROS_H__ */
diff --git a/lib/tst_safe_macros.c b/lib/tst_safe_macros.c
index 633b00404a56aafce6322e43bd614070d085e643..ba095a6215a8a053ad7397b4a541b26f02439b0f 100644
--- a/lib/tst_safe_macros.c
+++ b/lib/tst_safe_macros.c
@@ -796,3 +796,17 @@ ssize_t safe_writev(const char *file, const int lineno, char len_strict,
return rval;
}
+
+char *safe_ptsname(const char *const file, const int lineno, int masterfd)
+{
+ char *name;
+
+ name = ptsname(masterfd);
+
+ if (!name) {
+ tst_brk_(file, lineno, TBROK | TERRNO,
+ "ptsname(%d) failed", masterfd);
+ }
+
+ return name;
+}
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 03/12] Refactor ptem01 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 01/12] Refactor setpgid01 test Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 02/12] Add SAFE_PTSNAME macro Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 04/12] Add ptem02 test Andrea Cervesato
` (8 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Fix test failure when running inside a new session via setsid() and
start spliting its internal tests cases implementations into multiple
files.
Fixes: https://github.com/linux-test-project/kirk/issues/28
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
testcases/kernel/pty/common.h | 68 +++++++
testcases/kernel/pty/ptem01.c | 456 ++++--------------------------------------
2 files changed, 105 insertions(+), 419 deletions(-)
diff --git a/testcases/kernel/pty/common.h b/testcases/kernel/pty/common.h
new file mode 100644
index 0000000000000000000000000000000000000000..51760b1d39fa0518f3e7c4ece2281286e056cc48
--- /dev/null
+++ b/testcases/kernel/pty/common.h
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+#ifndef PTEM_H
+#define PTEM_H
+
+#define _GNU_SOURCE
+
+#include "tst_test.h"
+
+#define MASTERCLONE "/dev/ptmx"
+
+static inline int open_master(void)
+{
+ int masterfd;
+
+ if (access(MASTERCLONE, F_OK))
+ tst_brk(TCONF, "%s device doesn't exist", MASTERCLONE);
+
+ tst_res(TINFO, "opening master %s", MASTERCLONE);
+
+ masterfd = SAFE_OPEN(MASTERCLONE, O_RDWR);
+
+ if (grantpt(masterfd) == -1)
+ tst_brk(TBROK | TERRNO, "grantpt() error");
+
+ if (unlockpt(masterfd) == -1)
+ tst_brk(TBROK | TERRNO, "unlockpt() error");
+
+ return masterfd;
+}
+
+static inline int open_slave(const int masterfd)
+{
+ int slavefd;
+ char *slavename;
+
+ slavename = SAFE_PTSNAME(masterfd);
+
+ tst_res(TINFO, "opening slave %s", slavename);
+
+#ifndef __BIONIC__
+ /* grantpt() is a no-op in bionic. */
+ struct stat st;
+
+ SAFE_STAT(slavename, &st);
+
+ uid_t uid = getuid();
+
+ if (st.st_uid != uid) {
+ tst_brk(TBROK, "uid mismatch st.st_uid(%d) != getuid(%d)",
+ st.st_uid, uid);
+ }
+
+ if (st.st_mode != (S_IFCHR | 0620)) {
+ tst_brk(TBROK, "unexpected slave device permission: %o",
+ st.st_mode);
+ }
+#endif
+
+ slavefd = SAFE_OPEN(slavename, O_RDWR);
+
+ return slavefd;
+}
+
+#endif
diff --git a/testcases/kernel/pty/ptem01.c b/testcases/kernel/pty/ptem01.c
index 20ef5d0a739a55262c1c32ec03e57885dfe09787..b14e247c8ba53e098d44a3904621f8f2ec21fd1a 100644
--- a/testcases/kernel/pty/ptem01.c
+++ b/testcases/kernel/pty/ptem01.c
@@ -1,441 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
/*
- * Copyright (c) International Business Machines Corp., 2002
- * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
*/
-/* 12/23/2002 Port to LTP robbiew@us.ibm.com */
-/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */
+/*\
+ * [Description]
+ *
+ * Verify that it's possible to open a pseudo-terminal via /dev/ptmx, obtain a
+ * slave device and configure termos/termios ioctls.
+ */
#define _GNU_SOURCE
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/poll.h>
-#include <sys/types.h>
-
-#include "test.h"
-#include "safe_macros.h"
-#include "lapi/ioctl.h"
-char *TCID = "ptem01"; /* Test program identifier. */
-int TST_TOTAL = 6; /* Total number of test cases. */
-/**************/
-
-/*
- * pty master clone device
- */
-#define MASTERCLONE "/dev/ptmx"
+#include <termio.h>
+#include <termios.h>
+#include "common.h"
-#define BUFSZ 4096
+static int masterfd = -1;
-/*
- * test termio/termios ioctls
- */
-int test1(void)
+static void run(void)
{
- int masterfd, slavefd;
- char *slavename;
+ int slavefd;
struct termio termio;
struct termios termios;
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
- }
-
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
- }
-
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "unlockpt() call failed");
- }
-
- if ((slavefd = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TFAIL, NULL, "Could not open %s", slavename);
- }
-
- if (ioctl(slavefd, TCGETS, &termios) != 0) {
- tst_brkm(TFAIL, NULL, "TCGETS");
- }
-
- if (ioctl(slavefd, TCSETS, &termios) != 0) {
- tst_brkm(TFAIL, NULL, "TCSETS");
- }
-
- if (ioctl(slavefd, TCSETSW, &termios) != 0) {
- tst_brkm(TFAIL, NULL, "TCSETSW");
- }
-
- if (ioctl(slavefd, TCSETSF, &termios) != 0) {
- tst_brkm(TFAIL, NULL, "TCSETSF");
- }
-
- if (ioctl(slavefd, TCSETS, &termios) != 0) {
- tst_brkm(TFAIL, NULL, "TCSETS");
- }
-
- if (ioctl(slavefd, TCGETA, &termio) != 0) {
- tst_brkm(TFAIL, NULL, "TCGETA");
- }
-
- if (ioctl(slavefd, TCSETA, &termio) != 0) {
- tst_brkm(TFAIL, NULL, "TCSETA");
- }
-
- if (ioctl(slavefd, TCSETAW, &termio) != 0) {
- tst_brkm(TFAIL, NULL, "TCSETAW");
- }
-
- if (ioctl(slavefd, TCSETAF, &termio) != 0) {
- tst_brkm(TFAIL, NULL, "TCSETAF");
- }
-
- if (close(slavefd) != 0) {
- tst_brkm(TBROK, NULL, "close slave");
- }
-
- if (close(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "close master");
- }
- tst_resm(TPASS, "test1");
-
- /** NOT REACHED **/
- return 0;
-}
-
-/*
- * test window size setting and getting
- */
-int test2(void)
-{
- int masterfd, slavefd;
- char *slavename;
- struct winsize wsz;
- struct winsize wsz1 = { 24, 80, 5, 10 };
- struct winsize wsz2 = { 60, 100, 11, 777 };
-
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
- }
-
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
- }
-
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "unlockpt() call failed");
- }
-
- if ((slavefd = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TBROK, NULL, "Could not open %s", slavename);
- }
-
- if (ioctl(masterfd, TIOCSWINSZ, &wsz1) != 0) {
- tst_brkm(TFAIL, NULL, "TIOCSWINSZ");
- }
-
- if (ioctl(slavefd, TIOCGWINSZ, &wsz) != 0) {
- tst_brkm(TFAIL, NULL, "TIOCGWINSZ");
- }
-
- if (wsz.ws_row != wsz1.ws_row || wsz.ws_col != wsz1.ws_col ||
- wsz.ws_xpixel != wsz1.ws_xpixel ||
- wsz.ws_ypixel != wsz1.ws_ypixel) {
- tst_brkm(TFAIL, NULL, "unexpected window size returned");
- }
-
- if (ioctl(masterfd, TIOCGWINSZ, &wsz) != 0) {
- tst_brkm(TFAIL, NULL, "TIOCGWINSZ");
- }
-
- if (wsz.ws_row != wsz1.ws_row || wsz.ws_col != wsz1.ws_col ||
- wsz.ws_xpixel != wsz1.ws_xpixel ||
- wsz.ws_ypixel != wsz1.ws_ypixel) {
- tst_brkm(TFAIL, NULL, "unexpected window size returned");
- }
-
- if (ioctl(slavefd, TIOCSWINSZ, &wsz2) != 0) {
- tst_brkm(TFAIL, NULL, "TIOCSWINSZ");
- }
-
- if (ioctl(slavefd, TIOCGWINSZ, &wsz) != 0) {
- tst_brkm(TFAIL, NULL, "TIOCGWINSZ");
- }
-
- if (wsz.ws_row != wsz2.ws_row || wsz.ws_col != wsz2.ws_col ||
- wsz.ws_xpixel != wsz2.ws_xpixel ||
- wsz.ws_ypixel != wsz2.ws_ypixel) {
- tst_brkm(TFAIL, NULL, "unexpected window size returned");
- }
-
- if (close(slavefd) != 0) {
- tst_brkm(TBROK, NULL, "close");
- }
-
- if (close(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "close");
- }
- tst_resm(TPASS, "test2");
-
- /** NOT REACHED **/
- return 0;
-}
-
-/*
- * test sending a break
- */
-int test3(void)
-{
- int masterfd, slavefd;
- char *slavename;
-
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
- }
-
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
- }
-
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "unlockpt() call failed");
- }
-
- if ((slavefd = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TBROK, NULL, "Could not open %s", slavename);
- }
-
- if (tcsendbreak(masterfd, 10) != 0) {
- tst_brkm(TFAIL, NULL, "tcsendbreak");
- }
-
- if (tcsendbreak(slavefd, 10) != 0) {
- tst_brkm(TFAIL, NULL, "tcsendbreak");
- }
-
- if (close(slavefd) != 0) {
- tst_brkm(TBROK, NULL, "close slave");
- }
-
- if (close(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "close master");
- }
- tst_resm(TPASS, "test3");
-
- /** NOT REACHED **/
- return 0;
-}
-
-/*
- * test multiple opens of slave side
- */
-int test4(void)
-{
- int masterfd, slavefd, slavefd2, slavefd3;
- char *slavename;
-
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
- }
+ slavefd = open_slave(masterfd);
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
- }
+ TST_EXP_PASS(ioctl(slavefd, TCGETS, &termios));
+ TST_EXP_PASS(ioctl(slavefd, TCSETS, &termios));
+ TST_EXP_PASS(ioctl(slavefd, TCSETSW, &termios));
+ TST_EXP_PASS(ioctl(slavefd, TCSETSF, &termios));
+ TST_EXP_PASS(ioctl(slavefd, TCSETS, &termios));
+ TST_EXP_PASS(ioctl(slavefd, TCGETA, &termio));
+ TST_EXP_PASS(ioctl(slavefd, TCSETA, &termio));
+ TST_EXP_PASS(ioctl(slavefd, TCSETAW, &termio));
+ TST_EXP_PASS(ioctl(slavefd, TCSETAF, &termio));
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "unlockpt() call failed");
- }
-
- if ((slavefd = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TBROK, NULL, "Could not open %s", slavename);
- }
-
- if ((slavefd2 = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TFAIL, NULL, "Could not open %s (again)", slavename);
- }
-
- if ((slavefd3 = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TFAIL, NULL, "Could not open %s (once more)",
- slavename);
- }
-
- if (close(slavefd) != 0) {
- tst_brkm(TBROK, NULL, "close slave");
- }
- if (close(slavefd2) != 0) {
- tst_brkm(TBROK, NULL, "close slave again");
- }
- if (close(slavefd3) != 0) {
- tst_brkm(TBROK, NULL, "close slave once more");
- }
- if (close(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "close master");
- }
- tst_resm(TPASS, "test4");
-
- /** NOT REACHED **/
- return 0;
+ SAFE_CLOSE(slavefd);
}
-#define NUMOPENS 6
-
-/*
- * test several simultaneous opens
- */
-int test5(void)
+static void setup(void)
{
- static int masterfd[NUMOPENS];
- static int slavefd[NUMOPENS];
- char *slavename;
- int i;
-
- for (i = 0; i < NUMOPENS; ++i) {
- masterfd[i] = open(MASTERCLONE, O_RDWR);
- if (masterfd[i] < 0) {
- tst_resm(TBROK, "%s", MASTERCLONE);
- tst_resm(TBROK, "out of ptys");
- for (i = 0; i < NUMOPENS; ++i) {
- if (masterfd[i] != 0) {
- (void)close(masterfd[i]);
- }
- if (slavefd[i] != 0) {
- (void)close(slavefd[i]);
- }
- }
- tst_exit();
- }
-
- slavename = ptsname(masterfd[i]);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL,
- "ptsname() call failed");
- }
-
- if (grantpt(masterfd[i]) != 0) {
- tst_brkm(TBROK | TERRNO, NULL,
- "grantpt() call failed");
- }
-
- if (unlockpt(masterfd[i]) != 0) {
- tst_brkm(TBROK, NULL, "unlockpt() call failed");
- }
-
- if ((slavefd[i] = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TFAIL, NULL,
- "Iteration %d: Could not open %s", i,
- slavename);
- }
-
- }
-
- for (i = 0; i < NUMOPENS; ++i) {
- if (close(slavefd[i]) != 0) {
- tst_brkm(TBROK, NULL, "Iteration %d: close slave", i);
- }
- if (close(masterfd[i]) != 0) {
- tst_brkm(TBROK, NULL, "close master");
- }
- }
- tst_resm(TPASS, "test5");
-
- /** NOT REACHED **/
- return 0;
+ masterfd = open_master();
}
-/*
- * test hangup semantics
- */
-int test6(void)
+static void cleanup(void)
{
- static int masterfd;
- static int slavefd;
- char *slavename;
- struct termios termios;
-
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
- }
-
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
- }
-
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "unlockpt() call failed");
- }
-
- if ((slavefd = open(slavename, O_RDWR)) < 0) {
- tst_brkm(TBROK, NULL, "Could not open %s", slavename);
- }
-
- if (ioctl(slavefd, TCGETS, &termios) != 0) {
- tst_brkm(TFAIL, NULL, "TCGETS");
- }
-
- termios.c_cflag &= ~CBAUD;
- termios.c_cflag |= B0 & CBAUD;
- if (ioctl(slavefd, TCSETS, &termios) != 0) {
- tst_brkm(TFAIL, NULL, "TCGETS");
- }
-
- if (close(slavefd) != 0) {
- tst_brkm(TBROK, NULL, "close");
- }
- if (close(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "close");
- }
- tst_resm(TPASS, "test6");
-
- /** NOT REACHED **/
- return 0;
+ if (masterfd != -1)
+ SAFE_CLOSE(masterfd);
}
-/*
- * main test driver
- */
-int main(void)
-{
- test1();
- test2();
- test3();
- test4();
- test5();
- test6();
- /*
- * all done
- */
- tst_exit();
-}
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 04/12] Add ptem02 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (2 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 03/12] Refactor ptem01 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 05/12] Add ptem03 test Andrea Cervesato
` (7 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Verify that it's possible to open a pseudo-terminal via /dev/ptmx,
obtain a slave device and set/get window size.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
runtest/pty | 1 +
testcases/kernel/pty/.gitignore | 1 +
testcases/kernel/pty/ptem02.c | 71 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 73 insertions(+)
diff --git a/runtest/pty b/runtest/pty
index df2074153c2ac01038a0ef0ce5ad8938960ae53d..3ce7160e2776e58973def5893fc269ed035376c0 100644
--- a/runtest/pty
+++ b/runtest/pty
@@ -7,5 +7,6 @@ pty05 pty05
pty06 pty06
pty07 pty07
ptem01 ptem01
+ptem02 ptem02
hangup01 hangup01
diff --git a/testcases/kernel/pty/.gitignore b/testcases/kernel/pty/.gitignore
index acca3db9a1786f243b31f1fc4a8833d6ed8751a6..e638413a127fad65ed2f58c24dc1ae718219e518 100644
--- a/testcases/kernel/pty/.gitignore
+++ b/testcases/kernel/pty/.gitignore
@@ -1,5 +1,6 @@
/hangup01
/ptem01
+/ptem02
/pty01
/pty02
/pty03
diff --git a/testcases/kernel/pty/ptem02.c b/testcases/kernel/pty/ptem02.c
new file mode 100644
index 0000000000000000000000000000000000000000..0fc69aa1d8d487fba9c6022d77254660b678c6e0
--- /dev/null
+++ b/testcases/kernel/pty/ptem02.c
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that it's possible to open a pseudo-terminal via /dev/ptmx, obtain a
+ * slave device and set/get window size.
+ */
+
+#define _GNU_SOURCE
+
+#include "common.h"
+
+static int masterfd = -1;
+
+static void run(void)
+{
+ int slavefd;
+ struct winsize wsz;
+ struct winsize wsz1 = { 24, 80, 5, 10 };
+ struct winsize wsz2 = { 60, 100, 11, 777 };
+
+ slavefd = open_slave(masterfd);
+
+ TST_EXP_PASS(ioctl(masterfd, TIOCSWINSZ, &wsz1));
+ TST_EXP_PASS(ioctl(slavefd, TIOCGWINSZ, &wsz));
+
+ TST_EXP_EQ_LI(wsz.ws_row, wsz1.ws_row);
+ TST_EXP_EQ_LI(wsz.ws_col, wsz1.ws_col);
+ TST_EXP_EQ_LI(wsz.ws_xpixel, wsz1.ws_xpixel);
+ TST_EXP_EQ_LI(wsz.ws_ypixel, wsz1.ws_ypixel);
+
+ TST_EXP_PASS(ioctl(masterfd, TIOCGWINSZ, &wsz));
+
+ TST_EXP_EQ_LI(wsz.ws_row, wsz1.ws_row);
+ TST_EXP_EQ_LI(wsz.ws_col, wsz1.ws_col);
+ TST_EXP_EQ_LI(wsz.ws_xpixel, wsz1.ws_xpixel);
+ TST_EXP_EQ_LI(wsz.ws_ypixel, wsz1.ws_ypixel);
+
+ TST_EXP_PASS(ioctl(slavefd, TIOCSWINSZ, &wsz2));
+ TST_EXP_PASS(ioctl(slavefd, TIOCGWINSZ, &wsz));
+
+ TST_EXP_EQ_LI(wsz.ws_row, wsz2.ws_row);
+ TST_EXP_EQ_LI(wsz.ws_col, wsz2.ws_col);
+ TST_EXP_EQ_LI(wsz.ws_xpixel, wsz2.ws_xpixel);
+ TST_EXP_EQ_LI(wsz.ws_ypixel, wsz2.ws_ypixel);
+
+ SAFE_CLOSE(slavefd);
+}
+
+static void setup(void)
+{
+ masterfd = open_master();
+}
+
+static void cleanup(void)
+{
+ if (masterfd != -1)
+ SAFE_CLOSE(masterfd);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 05/12] Add ptem03 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (3 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 04/12] Add ptem02 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 06/12] Add ptem04 test Andrea Cervesato
` (6 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Verify that it's possible to open a pseudo-terminal via /dev/ptmx,
obtain a slave device and to send a break to both master and slave.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
runtest/pty | 1 +
testcases/kernel/pty/.gitignore | 1 +
testcases/kernel/pty/ptem03.c | 49 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 51 insertions(+)
diff --git a/runtest/pty b/runtest/pty
index 3ce7160e2776e58973def5893fc269ed035376c0..329cc84cdc107ab8e814fea72a8088ea62d5ad25 100644
--- a/runtest/pty
+++ b/runtest/pty
@@ -8,5 +8,6 @@ pty06 pty06
pty07 pty07
ptem01 ptem01
ptem02 ptem02
+ptem03 ptem03
hangup01 hangup01
diff --git a/testcases/kernel/pty/.gitignore b/testcases/kernel/pty/.gitignore
index e638413a127fad65ed2f58c24dc1ae718219e518..61fec1ddae3ea39d20e97123e34888708050c25c 100644
--- a/testcases/kernel/pty/.gitignore
+++ b/testcases/kernel/pty/.gitignore
@@ -1,6 +1,7 @@
/hangup01
/ptem01
/ptem02
+/ptem03
/pty01
/pty02
/pty03
diff --git a/testcases/kernel/pty/ptem03.c b/testcases/kernel/pty/ptem03.c
new file mode 100644
index 0000000000000000000000000000000000000000..fb0fdf6612d94a35728bed773fd7dd363922f454
--- /dev/null
+++ b/testcases/kernel/pty/ptem03.c
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that it's possible to open a pseudo-terminal via /dev/ptmx, obtain a
+ * slave device and to send a break to both master and slave.
+ */
+
+#define _GNU_SOURCE
+
+#include <termios.h>
+#include "common.h"
+
+static int masterfd = -1;
+
+static void run(void)
+{
+ int slavefd;
+
+ slavefd = open_slave(masterfd);
+
+ TST_EXP_PASS(tcsendbreak(masterfd, 10));
+ TST_EXP_PASS(tcsendbreak(slavefd, 10));
+
+ SAFE_CLOSE(slavefd);
+}
+
+static void setup(void)
+{
+ masterfd = open_master();
+}
+
+static void cleanup(void)
+{
+ if (masterfd != -1)
+ SAFE_CLOSE(masterfd);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 06/12] Add ptem04 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (4 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 05/12] Add ptem03 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 07/12] Add ptem05 test Andrea Cervesato
` (5 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Verify that it's possible to open a pseudo-terminal via /dev/ptmx,
obtain a slave device and to check if it's possible to open it
multiple times.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
runtest/pty | 1 +
testcases/kernel/pty/.gitignore | 1 +
testcases/kernel/pty/ptem04.c | 49 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 51 insertions(+)
diff --git a/runtest/pty b/runtest/pty
index 329cc84cdc107ab8e814fea72a8088ea62d5ad25..63d927eca07aa3dbd312d5c5cc6b6681dbf3627d 100644
--- a/runtest/pty
+++ b/runtest/pty
@@ -9,5 +9,6 @@ pty07 pty07
ptem01 ptem01
ptem02 ptem02
ptem03 ptem03
+ptem04 ptem04
hangup01 hangup01
diff --git a/testcases/kernel/pty/.gitignore b/testcases/kernel/pty/.gitignore
index 61fec1ddae3ea39d20e97123e34888708050c25c..c9bb33664f9de55038f4638406841f403f1a86c4 100644
--- a/testcases/kernel/pty/.gitignore
+++ b/testcases/kernel/pty/.gitignore
@@ -2,6 +2,7 @@
/ptem01
/ptem02
/ptem03
+/ptem04
/pty01
/pty02
/pty03
diff --git a/testcases/kernel/pty/ptem04.c b/testcases/kernel/pty/ptem04.c
new file mode 100644
index 0000000000000000000000000000000000000000..675e6b816dc916e48508af19c1b9f45784accff7
--- /dev/null
+++ b/testcases/kernel/pty/ptem04.c
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that it's possible to open a pseudo-terminal via /dev/ptmx, obtain a
+ * slave device and to check if it's possible to open it multiple times.
+ */
+
+#define _GNU_SOURCE
+
+#include "common.h"
+
+#define NUM_SLAVES 10
+
+static int masterfd = -1;
+
+static void run(void)
+{
+ int slavefd[NUM_SLAVES];
+
+ for (int i = 0; i < NUM_SLAVES; i++)
+ slavefd[i] = TST_EXP_FD(open_slave(masterfd));
+
+ for (int i = 0; i < NUM_SLAVES; i++)
+ SAFE_CLOSE(slavefd[i]);
+}
+
+static void setup(void)
+{
+ masterfd = open_master();
+}
+
+static void cleanup(void)
+{
+ if (masterfd != -1)
+ SAFE_CLOSE(masterfd);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 07/12] Add ptem05 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (5 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 06/12] Add ptem04 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 08/12] Add ptem06 test Andrea Cervesato
` (4 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Verify that it's possible to open a pseudo-terminal via /dev/ptmx, to
obtain a master + slave pair and to open them multiple times.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
runtest/pty | 1 +
testcases/kernel/pty/.gitignore | 1 +
testcases/kernel/pty/ptem05.c | 55 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 57 insertions(+)
diff --git a/runtest/pty b/runtest/pty
index 63d927eca07aa3dbd312d5c5cc6b6681dbf3627d..deb04c3f5725647a32f457eaed638eb7071ab4db 100644
--- a/runtest/pty
+++ b/runtest/pty
@@ -10,5 +10,6 @@ ptem01 ptem01
ptem02 ptem02
ptem03 ptem03
ptem04 ptem04
+ptem05 ptem05
hangup01 hangup01
diff --git a/testcases/kernel/pty/.gitignore b/testcases/kernel/pty/.gitignore
index c9bb33664f9de55038f4638406841f403f1a86c4..ef5751907cad087f5e33132b52a374b52ee7905a 100644
--- a/testcases/kernel/pty/.gitignore
+++ b/testcases/kernel/pty/.gitignore
@@ -3,6 +3,7 @@
/ptem02
/ptem03
/ptem04
+/ptem05
/pty01
/pty02
/pty03
diff --git a/testcases/kernel/pty/ptem05.c b/testcases/kernel/pty/ptem05.c
new file mode 100644
index 0000000000000000000000000000000000000000..9357c469ca8c35117a50e60b19bfbf830b1345cf
--- /dev/null
+++ b/testcases/kernel/pty/ptem05.c
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that it's possible to open a pseudo-terminal via /dev/ptmx, to obtain
+ * a master + slave pair and to open them multiple times.
+ */
+
+#define _GNU_SOURCE
+
+#include "common.h"
+
+#define NUM_OPENS 10
+
+static int masterfd[NUM_OPENS];
+
+static void run(void)
+{
+ int slavefd[NUM_OPENS];
+
+ for (int i = 0; i < NUM_OPENS; i++)
+ slavefd[i] = TST_EXP_FD(open_slave(masterfd[i]));
+
+ for (int i = 0; i < NUM_OPENS; i++)
+ SAFE_CLOSE(slavefd[i]);
+}
+
+static void setup(void)
+{
+ for (int i = 0; i < NUM_OPENS; i++)
+ masterfd[i] = -1;
+
+ for (int i = 0; i < NUM_OPENS; i++)
+ masterfd[i] = open_master();
+}
+
+static void cleanup(void)
+{
+ for (int i = 0; i < NUM_OPENS; i++) {
+ if (masterfd[i] != -1)
+ SAFE_CLOSE(masterfd[i]);
+ }
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 08/12] Add ptem06 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (6 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 07/12] Add ptem05 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 09/12] Add TST_EXP_EQ_STRN macro Andrea Cervesato
` (3 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Verify that it's possible to open a pseudo-terminal via /dev/ptmx,
to obtain a slave device and to set baudrate to B0 (which means hang
up).
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
runtest/pty | 1 +
testcases/kernel/pty/.gitignore | 1 +
testcases/kernel/pty/ptem06.c | 52 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 54 insertions(+)
diff --git a/runtest/pty b/runtest/pty
index deb04c3f5725647a32f457eaed638eb7071ab4db..6343da391ba17627abaf09aa5a23509e4f745556 100644
--- a/runtest/pty
+++ b/runtest/pty
@@ -11,5 +11,6 @@ ptem02 ptem02
ptem03 ptem03
ptem04 ptem04
ptem05 ptem05
+ptem06 ptem06
hangup01 hangup01
diff --git a/testcases/kernel/pty/.gitignore b/testcases/kernel/pty/.gitignore
index ef5751907cad087f5e33132b52a374b52ee7905a..630d7fcf7b0e0adfbc21b793fa456d6c5f5e4ad9 100644
--- a/testcases/kernel/pty/.gitignore
+++ b/testcases/kernel/pty/.gitignore
@@ -4,6 +4,7 @@
/ptem03
/ptem04
/ptem05
+/ptem06
/pty01
/pty02
/pty03
diff --git a/testcases/kernel/pty/ptem06.c b/testcases/kernel/pty/ptem06.c
new file mode 100644
index 0000000000000000000000000000000000000000..810b7c1d6a774290baf24c12cedccb85242367c4
--- /dev/null
+++ b/testcases/kernel/pty/ptem06.c
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (c) 2020 Petr Vorel <pvorel@suse.cz>
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that it's possible to open a pseudo-terminal via /dev/ptmx, to obtain
+ * a slave device and to set baudrate to B0 (which means hang up).
+ */
+
+#define _GNU_SOURCE
+
+#include <termios.h>
+#include "common.h"
+
+static int masterfd = -1;
+
+static void run(void)
+{
+ int slavefd;
+ struct termios termios;
+
+ slavefd = open_slave(masterfd);
+
+ TST_EXP_PASS(ioctl(slavefd, TCGETS, &termios));
+ termios.c_cflag &= ~CBAUD;
+ termios.c_cflag |= B0 & CBAUD;
+ TST_EXP_PASS(ioctl(slavefd, TCSETS, &termios));
+
+ SAFE_CLOSE(slavefd);
+}
+
+static void setup(void)
+{
+ masterfd = open_master();
+}
+
+static void cleanup(void)
+{
+ if (masterfd != -1)
+ SAFE_CLOSE(masterfd);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 09/12] Add TST_EXP_EQ_STRN macro
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (7 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 08/12] Add ptem06 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-13 11:53 ` Cyril Hrubis
2025-01-09 14:11 ` [LTP] [PATCH v3 10/12] Refactor pty01 test Andrea Cervesato
` (2 subsequent siblings)
11 siblings, 1 reply; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
New TST_EXP_EQ_STRN macro can be used to compare two strings, passing
their length if needed.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
include/tst_test_macros.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/include/tst_test_macros.h b/include/tst_test_macros.h
index b2ca32f7710df33898092746140c57e5c6428525..dcfe5307df3e2bf2aed1e7e449f9799c65ee6d0d 100644
--- a/include/tst_test_macros.h
+++ b/include/tst_test_macros.h
@@ -425,4 +425,25 @@ const char *tst_errno_names(char *buf, const int *exp_errs, int exp_errs_cnt);
} \
} while (0)
+/**
+ * TST_EXP_EQ_STRN() - Compare two strings, providing length as well.
+ *
+ * @STR_A: string to compare.
+ * @STR_B: string to compare.
+ * @LEN: length of the string.
+ */
+#define TST_EXP_EQ_STRN(STR_A, STR_B, LEN) do { \
+ TST_PASS = strncmp(STR_A, STR_B, LEN) == 0; \
+ \
+ if (TST_PASS) { \
+ tst_res_(__FILE__, __LINE__, TPASS, \
+ "%s == %s (%s)", \
+ #STR_A, #STR_B, STR_B); \
+ } else { \
+ tst_res_(__FILE__, __LINE__, TFAIL, \
+ "%s (%s) != %s (%s)", \
+ #STR_A, STR_A, #STR_B, STR_B); \
+ } \
+} while (0)
+
#endif /* TST_TEST_MACROS_H__ */
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [LTP] [PATCH v3 09/12] Add TST_EXP_EQ_STRN macro
2025-01-09 14:11 ` [LTP] [PATCH v3 09/12] Add TST_EXP_EQ_STRN macro Andrea Cervesato
@ 2025-01-13 11:53 ` Cyril Hrubis
2025-01-13 14:05 ` Andrea Cervesato via ltp
0 siblings, 1 reply; 16+ messages in thread
From: Cyril Hrubis @ 2025-01-13 11:53 UTC (permalink / raw)
To: Andrea Cervesato; +Cc: ltp
Hi!
> +#define TST_EXP_EQ_STRN(STR_A, STR_B, LEN) do { \
> + TST_PASS = strncmp(STR_A, STR_B, LEN) == 0; \
> + \
> + if (TST_PASS) { \
> + tst_res_(__FILE__, __LINE__, TPASS, \
> + "%s == %s (%s)", \
> + #STR_A, #STR_B, STR_B); \
> + } else { \
> + tst_res_(__FILE__, __LINE__, TFAIL, \
> + "%s (%s) != %s (%s)", \
> + #STR_A, STR_A, #STR_B, STR_B); \
Passing these strings to printf-like function is not safe at all, since
they are possibly not nul terminated. If we realy wanted to print them
we would have to copy them and nul terminated them.
e.g.
char str_a_cpy[LEN+1], str_b_cpy[LEN+1];
strncpy(str_a_cpy, STR_A, LEN);
str_a_cpy[LEN] = 0;
strncpy(str_b_cpy, STR_B, LEN);
str_b_cpy[LEN] = 0;
...
tst_res_(...., str_b_cpy, ...);
> + } \
> +} while (0)
> +
> #endif /* TST_TEST_MACROS_H__ */
>
> --
> 2.43.0
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [LTP] [PATCH v3 09/12] Add TST_EXP_EQ_STRN macro
2025-01-13 11:53 ` Cyril Hrubis
@ 2025-01-13 14:05 ` Andrea Cervesato via ltp
2025-01-13 15:26 ` Cyril Hrubis
0 siblings, 1 reply; 16+ messages in thread
From: Andrea Cervesato via ltp @ 2025-01-13 14:05 UTC (permalink / raw)
To: Cyril Hrubis, Andrea Cervesato; +Cc: ltp
Hi Cyril,
I guess this is affecting also TST_EXP_EQ_STR then.. I will need to fix
that one as well.
Andrea
On 1/13/25 12:53, Cyril Hrubis wrote:
> Hi!
>> +#define TST_EXP_EQ_STRN(STR_A, STR_B, LEN) do { \
>> + TST_PASS = strncmp(STR_A, STR_B, LEN) == 0; \
>> + \
>> + if (TST_PASS) { \
>> + tst_res_(__FILE__, __LINE__, TPASS, \
>> + "%s == %s (%s)", \
>> + #STR_A, #STR_B, STR_B); \
>> + } else { \
>> + tst_res_(__FILE__, __LINE__, TFAIL, \
>> + "%s (%s) != %s (%s)", \
>> + #STR_A, STR_A, #STR_B, STR_B); \
> Passing these strings to printf-like function is not safe at all, since
> they are possibly not nul terminated. If we realy wanted to print them
> we would have to copy them and nul terminated them.
>
> e.g.
>
> char str_a_cpy[LEN+1], str_b_cpy[LEN+1];
>
> strncpy(str_a_cpy, STR_A, LEN);
> str_a_cpy[LEN] = 0;
> strncpy(str_b_cpy, STR_B, LEN);
> str_b_cpy[LEN] = 0;
>
> ...
>
> tst_res_(...., str_b_cpy, ...);
>
>> + } \
>> +} while (0)
>> +
>> #endif /* TST_TEST_MACROS_H__ */
>>
>> --
>> 2.43.0
>>
>>
>> --
>> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 16+ messages in thread
* [LTP] [PATCH v3 10/12] Refactor pty01 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (8 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 09/12] Add TST_EXP_EQ_STRN macro Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 11/12] Add pty08 test Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 12/12] Add pty09 test Andrea Cervesato
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Rewrite part of the code using the new LTP library and fix the execution
of the test inside a new session via setsid(). The test is now split
into multiple files, instead of having multiple test* functions
executing all in one file.
Fixes: https://github.com/linux-test-project/kirk/issues/28
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
testcases/kernel/pty/pty01.c | 409 +++++--------------------------------------
1 file changed, 39 insertions(+), 370 deletions(-)
diff --git a/testcases/kernel/pty/pty01.c b/testcases/kernel/pty/pty01.c
index 666b221b017fe214b7baa0b2bc608dfc2feff732..4320082eac1ac8b81b7e8dbbfac826ab4f4c1488 100644
--- a/testcases/kernel/pty/pty01.c
+++ b/testcases/kernel/pty/pty01.c
@@ -1,395 +1,64 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
/*
- *
- * Copyright (c) International Business Machines Corp., 2002
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
*/
-/* 12/23/2002 Port to LTP robbiew@us.ibm.com */
-/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */
+/*\
+ * [Description]
+ *
+ * Verify that write/read is properly working when master and slave
+ * pseudo terminals communicate with each other.
+ */
#define _GNU_SOURCE
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#include <unistd.h>
-
-#include "test.h"
-#include "safe_macros.h"
-#include "lapi/ioctl.h"
-
-char *TCID = "pty01"; /* Test program identifier. */
-int TST_TOTAL = 5; /* Total number of test cases. */
-/**************/
-/*
- * pty master clone device
- */
-#define MASTERCLONE "/dev/ptmx"
+#include "common.h"
-/*
- * string for testing read/write on ptys
- */
#define STRING "Linux Test Project\n"
-/*
- * test buffer size
- */
-#define TESTSIZE 1024
-
-/*
- * mode we expect grantpt() to leave pty as
- */
-#define PTY_MODE 020622
-
-/*
- * number of procs for parallel test
- */
-#define NUMPROCS 15
-
-/*
- * test slave locking
- */
-static int test1(void)
-{
- int masterfd; /* master pty fd */
- int slavefd; /* slave pty fd */
- char *slavename;
- struct stat st;
- char buf[TESTSIZE];
-
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
- }
-
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
- }
-
- if (stat(slavename, &st) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "stat(%s) failed", slavename);
- }
- if (st.st_uid != getuid()) {
- tst_brkm(TBROK, NULL, "uid mismatch");
- }
-
- /* grantpt() is a no-op in bionic. */
-#ifndef __BIONIC__
- if (st.st_mode != (S_IFCHR | S_IRUSR | S_IWUSR | S_IWGRP)) {
- tst_brkm(TBROK, NULL, "mode mismatch (mode=%o)", st.st_mode);
- }
-#endif
-
- slavefd = open(slavename, O_RDWR);
- if (slavefd >= 0) {
- tst_brkm(TBROK, NULL, "open didn't fail as expected!");
- }
-
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "unlockpt() failed");
- }
-
- slavefd = SAFE_OPEN(NULL, slavename, O_RDWR);
-
- /*
- * test writing to the master / reading from the slave
- */
- if (write(masterfd, STRING, strlen(STRING)) != strlen(STRING)) {
- /*
- * XXX: the errno printout might be garbage, but better to be
- * safe than sorry..
- */
- tst_brkm(TFAIL | TERRNO, NULL, "write to master");
- }
-
- if (read(slavefd, buf, strlen(STRING)) != strlen(STRING)) {
- /* XXX: Same as write above.. */
- tst_brkm(TFAIL | TERRNO, NULL, "read from slave");
- }
- if (strncmp(STRING, buf, strlen(STRING) - 1) != 0) {
- tst_brkm(TFAIL, NULL,
- "strings are different (STRING = '%s' != buf = '%s')",
- STRING, buf);
- }
-
- /*
- * test writing to the slave / reading from the master
- */
- if (write(slavefd, STRING, strlen(STRING)) != strlen(STRING)) {
- /* XXX: Same as write above.. */
- tst_brkm(TFAIL | TERRNO, NULL, "write to slave");
- }
-
- if (read(masterfd, buf, strlen(STRING)) != strlen(STRING)) {
- /* XXX: Same as write above.. */
- tst_brkm(TFAIL | TERRNO, NULL, "read from master");
- }
- if (strncmp(STRING, buf, strlen(STRING) - 1) != 0) {
- tst_brkm(TFAIL, NULL,
- "strings are different (STRING = '%s' != buf = '%s').",
- STRING, buf);
- }
-
- /*
- * try an invalid ioctl on the slave...
- */
- if (ioctl(slavefd, TIOCGWINSZ, NULL) == 0) {
- tst_brkm(TFAIL, NULL,
- "invalid slave TIOCGWINSZ ioctl succeeded.. it should "
- "have failed");
- }
+static size_t string_len;
+static int masterfd = -1;
+static int slavefd = -1;
- /*
- * try an invalid ioctl on the master...
- */
- if (ioctl(masterfd, TIOCGWINSZ, NULL) == 0) {
- tst_brkm(TFAIL, NULL,
- "invalid master TIOCGWINSZ ioctl succeeded.. it should "
- "have failed");
- }
-
- /*
- * close pty fds
- */
- if (close(slavefd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "close of slave");
- }
- if (close(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "close of master");
- }
- tst_resm(TPASS, "test1");
- /** NOTREACHED **/
- return 0;
-}
-
-/*
- * test slave operations with closed master
- */
-static void test2(void)
+static void run(void)
{
- int masterfd; /* master pty fd */
- int slavefd; /* slave pty fd */
- int i;
- char *slavename;
- char c;
-
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
- }
-
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
- }
-
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "unlockpt() call failed");
- }
-
- slavefd = SAFE_OPEN(NULL, slavename, O_RDWR);
+ char buf[BUFSIZ];
- /*
- * close pty fds. See what happens when we close the master
- * first.
- */
- if (close(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "close()");
- }
+ tst_res(TINFO, "Send message to master and read it from slave");
- errno = 0;
- if ((i = read(slavefd, &c, 1)) == 1) {
- tst_brkm(TFAIL, NULL,
- "reading from slave fd should have failed, but didn't"
- "(read '%c')", c);
- }
+ memset(buf, 0, BUFSIZ);
+ SAFE_WRITE(SAFE_WRITE_ALL, masterfd, STRING, string_len);
+ SAFE_READ(0, slavefd, buf, string_len + 1);
+ TST_EXP_EQ_STRN(STRING, buf, string_len - 1);
- if ((i = write(slavefd, &c, 1)) == 1) {
- tst_brkm(TFAIL, NULL,
- "writing to slave fd should have failed, but didn't");
- }
+ tst_res(TINFO, "Send message to slave and read it from master");
- if (ioctl(slavefd, TIOCGWINSZ, NULL) == 0) {
- tst_brkm(TFAIL, NULL,
- "trying TIOCGWINSZ on slave fd should have failed, "
- "but didn't");
- }
-
- if (close(slavefd) != 0) {
- tst_brkm(TBROK, NULL, "close");
- }
- tst_resm(TPASS, "test2");
+ memset(buf, 0, BUFSIZ);
+ SAFE_WRITE(SAFE_WRITE_ALL, slavefd, STRING, string_len);
+ SAFE_READ(0, masterfd, buf, string_len + 1);
+ TST_EXP_EQ_STRN(STRING, buf, string_len - 1);
}
-/*
- * test operations on master with closed slave
- */
-static void test3(void)
+static void setup(void)
{
- int masterfd; /* master pty fd */
+ masterfd = open_master();
+ slavefd = open_slave(masterfd);
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- if (ioctl(masterfd, TIOCGWINSZ, NULL) == 0) {
- tst_brkm(TFAIL | TERRNO, NULL,
- "trying TIOCGWINSZ on master with no open slave "
- "succeeded unexpectedly");
- }
- tst_resm(TPASS, "test3");
+ string_len = strlen(STRING);
}
-/*
- * test multiple opens on slave side of pty
- */
-static void test4(void)
+static void cleanup(void)
{
- int masterfd; /* master pty fd */
- int slavefd; /* slave pty fd */
- int slavefd2;
- int slavefd3;
- char *slavename;
-
- masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
-
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- tst_brkm(TBROK, NULL, "ptsname() call failed");
- }
-
- if (grantpt(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "grantpt() call failed");
- }
+ if (masterfd != -1)
+ SAFE_CLOSE(masterfd);
- if (unlockpt(masterfd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "unlockpt() call failed");
- }
-
- slavefd = SAFE_OPEN(NULL, slavename, O_RDWR);
-
- slavefd2 = open(slavename, O_RDWR);
- if (slavefd < 0) {
- tst_brkm(TFAIL | TERRNO, NULL, "Could not open %s (again)",
- slavename);
- }
-
- slavefd3 = open(slavename, O_RDWR);
- if (slavefd < 0) {
- tst_brkm(TFAIL | TERRNO, NULL, "Could not open %s (once more)",
- slavename);
- }
-
- /*
- * close pty fds.
- */
- if (close(slavefd) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "close slave");
- }
-
- if (close(slavefd2) != 0) {
- tst_brkm(TBROK, NULL, "close slave again");
- }
-
- if (close(slavefd3) != 0) {
- tst_brkm(TBROK, NULL, "close slave once more");
- }
-
- if (close(masterfd) != 0) {
- tst_brkm(TBROK, NULL, "close master");
- }
- tst_resm(TPASS, "test4");
-}
-
-/*
- * test opening/closing lots of ptys in parallel. We may run out
- * of ptys for this test depending on how the system is configured,
- * but that's not a fatal error.
- */
-static void test5(void)
-{
- int masterfd; /* master pty fd */
- char *slavename;
- int status;
- int i;
-
- for (i = 0; i < NUMPROCS; ++i) {
- switch (fork()) {
- case -1:
- tst_brkm(TBROK, NULL, "fork()");
- break;
- case 0:
- masterfd = open(MASTERCLONE, O_RDWR);
- if (masterfd < 0) {
- printf("proc %d: opening %s failed: %s",
- i, MASTERCLONE, strerror(errno));
- exit(1);
- }
- if (grantpt(masterfd) != 0) {
- printf("proc %d: grantpt() call failed: %s",
- i, strerror(errno));
- exit(1);
- }
- slavename = ptsname(masterfd);
- if (slavename == NULL) {
- printf("proc %d: ptsname() call failed: %s",
- i, strerror(errno));
- exit(1);
- }
- sleep(10);
- if (close(masterfd) != 0) {
- printf("proc %d: close failed: %s",
- i, strerror(errno));
- exit(1);
- }
- exit(0);
- default:
- break;
- }
- }
- while (wait(&status) > 0) {
- if (status) {
- tst_brkm(TFAIL, NULL,
- "child exited with non-zero status %d",
- status);
- }
- }
- tst_resm(TPASS, "test5");
+ if (slavefd != -1)
+ SAFE_CLOSE(slavefd);
}
-/*
- * main test driver
- */
-int main(void)
-{
- test1();
- test2();
- test3();
- test4();
- test5();
-
- /*
- * all done
- */
- tst_exit();
-}
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 11/12] Add pty08 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (9 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 10/12] Refactor pty01 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
2025-01-09 14:11 ` [LTP] [PATCH v3 12/12] Add pty09 test Andrea Cervesato
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Verify that slave pseudo-terminal fails reading/writing if master has
been closed.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
runtest/pty | 1 +
testcases/kernel/pty/.gitignore | 1 +
testcases/kernel/pty/pty08.c | 38 ++++++++++++++++++++++++++++++++++++++
3 files changed, 40 insertions(+)
diff --git a/runtest/pty b/runtest/pty
index 6343da391ba17627abaf09aa5a23509e4f745556..365a46ee9730aa36b22dbbdbfba82ac0d491ac94 100644
--- a/runtest/pty
+++ b/runtest/pty
@@ -6,6 +6,7 @@ pty04 pty04
pty05 pty05
pty06 pty06
pty07 pty07
+pty08 pty08
ptem01 ptem01
ptem02 ptem02
ptem03 ptem03
diff --git a/testcases/kernel/pty/.gitignore b/testcases/kernel/pty/.gitignore
index 630d7fcf7b0e0adfbc21b793fa456d6c5f5e4ad9..7d8d4dceda84f2e2695a8bee39abfe894288b8b6 100644
--- a/testcases/kernel/pty/.gitignore
+++ b/testcases/kernel/pty/.gitignore
@@ -12,3 +12,4 @@
/pty05
/pty06
/pty07
+/pty08
diff --git a/testcases/kernel/pty/pty08.c b/testcases/kernel/pty/pty08.c
new file mode 100644
index 0000000000000000000000000000000000000000..45e99d18ba898ce24b4151f79554b5f49a9b7586
--- /dev/null
+++ b/testcases/kernel/pty/pty08.c
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that slave pseudo-terminal fails reading/writing if master has been
+ * closed.
+ */
+
+#define _GNU_SOURCE
+
+#include "common.h"
+
+static void run(void)
+{
+ int slavefd;
+ int masterfd;
+ char buf;
+
+ masterfd = open_master();
+ slavefd = open_slave(masterfd);
+
+ tst_res(TINFO, "Closing master communication");
+ SAFE_CLOSE(masterfd);
+
+ TST_EXP_EQ_LI(read(slavefd, &buf, 1), 0);
+ TST_EXP_FAIL(write(slavefd, &buf, 1), EIO);
+
+ SAFE_CLOSE(slavefd);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread* [LTP] [PATCH v3 12/12] Add pty09 test
2025-01-09 14:11 [LTP] [PATCH v3 00/12] Fix tests failing with setsid Andrea Cervesato
` (10 preceding siblings ...)
2025-01-09 14:11 ` [LTP] [PATCH v3 11/12] Add pty08 test Andrea Cervesato
@ 2025-01-09 14:11 ` Andrea Cervesato
11 siblings, 0 replies; 16+ messages in thread
From: Andrea Cervesato @ 2025-01-09 14:11 UTC (permalink / raw)
To: ltp
From: Andrea Cervesato <andrea.cervesato@suse.com>
Verify that slave pseudo-terminal can be opened multiple times
in parallel.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
runtest/pty | 1 +
testcases/kernel/pty/.gitignore | 1 +
testcases/kernel/pty/pty09.c | 74 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 76 insertions(+)
diff --git a/runtest/pty b/runtest/pty
index 365a46ee9730aa36b22dbbdbfba82ac0d491ac94..4b1abe7a602a14456877f3bc42f2275a3be0f8f0 100644
--- a/runtest/pty
+++ b/runtest/pty
@@ -7,6 +7,7 @@ pty05 pty05
pty06 pty06
pty07 pty07
pty08 pty08
+pty09 pty09
ptem01 ptem01
ptem02 ptem02
ptem03 ptem03
diff --git a/testcases/kernel/pty/.gitignore b/testcases/kernel/pty/.gitignore
index 7d8d4dceda84f2e2695a8bee39abfe894288b8b6..2d0c8bb6ff7d6883abfc7838e257b9be50244b69 100644
--- a/testcases/kernel/pty/.gitignore
+++ b/testcases/kernel/pty/.gitignore
@@ -13,3 +13,4 @@
/pty06
/pty07
/pty08
+/pty09
diff --git a/testcases/kernel/pty/pty09.c b/testcases/kernel/pty/pty09.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e477869b0d5be3958a0a4bff24f96220753d513
--- /dev/null
+++ b/testcases/kernel/pty/pty09.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that slave pseudo-terminal can be opened multiple times in parallel.
+ */
+
+#define _GNU_SOURCE
+
+#include "common.h"
+
+static int masterfd = -1;
+
+static unsigned int count_avail_pid(void)
+{
+ DIR *dir;
+ struct dirent *ent;
+ struct rlimit limit;
+ unsigned int count = 0;
+ unsigned int max_pid_num;
+
+ SAFE_GETRLIMIT(RLIMIT_NOFILE, &limit);
+
+ dir = SAFE_OPENDIR("/proc/self/fd");
+ while ((ent = SAFE_READDIR(dir)))
+ count++;
+
+ SAFE_CLOSEDIR(dir);
+
+ max_pid_num = limit.rlim_cur - count;
+
+ tst_res(TINFO, "Available number of pids: %u", max_pid_num);
+
+ return max_pid_num;
+}
+
+static void run(void)
+{
+ unsigned int max_pid_num;
+
+ max_pid_num = count_avail_pid();
+
+ int slavefd[max_pid_num];
+
+ for (uint32_t i = 0; i < max_pid_num; i++)
+ slavefd[i] = open_slave(masterfd);
+
+ tst_res(TPASS, "pty has been opened %d times", max_pid_num);
+
+ for (uint32_t i = 0; i < max_pid_num; i++)
+ SAFE_CLOSE(slavefd[i]);
+}
+
+static void setup(void)
+{
+ masterfd = open_master();
+}
+
+static void cleanup(void)
+{
+ if (masterfd != -1)
+ SAFE_CLOSE(masterfd);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 16+ messages in thread