1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
4 */
5
6 #ifndef PTEM_H
7 #define PTEM_H
8
9 #define _GNU_SOURCE
10
11 #include "tst_test.h"
12
13 #define MASTERCLONE "/dev/ptmx"
14
open_master(void)15 static inline int open_master(void)
16 {
17 int masterfd;
18
19 if (access(MASTERCLONE, F_OK))
20 tst_brk(TCONF, "%s device doesn't exist", MASTERCLONE);
21
22 tst_res(TINFO, "opening master %s", MASTERCLONE);
23
24 masterfd = SAFE_OPEN(MASTERCLONE, O_RDWR);
25
26 if (grantpt(masterfd) == -1)
27 tst_brk(TBROK | TERRNO, "grantpt() error");
28
29 if (unlockpt(masterfd) == -1)
30 tst_brk(TBROK | TERRNO, "unlockpt() error");
31
32 return masterfd;
33 }
34
open_slave(const int masterfd)35 static inline int open_slave(const int masterfd)
36 {
37 int slavefd;
38 char *slavename;
39
40 slavename = SAFE_PTSNAME(masterfd);
41
42 tst_res(TINFO, "opening slave %s", slavename);
43
44 #ifndef __BIONIC__
45 /* grantpt() is a no-op in bionic. */
46 struct stat st;
47
48 SAFE_STAT(slavename, &st);
49
50 uid_t uid = getuid();
51
52 if (st.st_uid != uid) {
53 tst_brk(TBROK, "uid mismatch st.st_uid(%d) != getuid(%d)",
54 st.st_uid, uid);
55 }
56
57 if (st.st_mode != (S_IFCHR | 0620)) {
58 tst_brk(TBROK, "unexpected slave device permission: %o",
59 st.st_mode);
60 }
61 #endif
62
63 slavefd = SAFE_OPEN(slavename, O_RDWR);
64
65 return slavefd;
66 }
67
68 #endif
69