From: walter harms <wharms@bfs.de>
To: me@vk4msl.yi.org
Cc: Ralf Baechle <ralf@linux-mips.org>,
linux-hams@vger.kernel.org,
Stuart Longland <stuartl@longlandclan.yi.org>
Subject: Re: [PATCH 1/2] kissattach: Add support for pty symlinking
Date: Tue, 14 Jul 2015 11:17:14 +0200 [thread overview]
Message-ID: <55A4D39A.6000200@bfs.de> (raw)
In-Reply-To: <1435460682-27595-2-git-send-email-me@vk4msl.yi.org>
Am 28.06.2015 05:04, schrieb me@vk4msl.yi.org:
> From: Stuart Longland <stuartl@longlandclan.yi.org>
>
> This patch adds abilities for symlinking of dynamically allocated slave
> PTY interfaces to kissattach. This enables other services to make use
> of these PTYs without manually editing their configuration files to
> point to the dynamically allocated PTY.
>
> In addition, the patch includes the ability to change the ownership and
> permissions on the allocated PTY, allowing an unpriviged process to make
> use of it.
> ---
> kiss/kissattach.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 103 insertions(+), 7 deletions(-)
>
> diff --git a/kiss/kissattach.c b/kiss/kissattach.c
> index e30ed05..a872d0a 100644
> --- a/kiss/kissattach.c
> +++ b/kiss/kissattach.c
> @@ -18,6 +18,9 @@
> #include <sys/socket.h>
> #include <sys/ioctl.h>
>
> +#include <pwd.h>
> +#include <grp.h>
> +
> #include <net/if.h>
> #include <netax25/ax25.h>
> #include <netrose/rose.h>
> @@ -32,6 +35,8 @@
> #define N_6PACK 7 /* This is valid for all architectures in 2.2.x */
> #endif
>
> +#define PTMX_TTY "/dev/ptmx"
> +
> static char *callsign;
> static int speed;
> static int mtu;
> @@ -42,6 +47,7 @@ static char *portname;
> static char *inetaddr;
> static int allow_broadcast;
> static int i_am_unix98_pty_master; /* unix98 ptmx support */
> +static int symlink_pty = 0;
>
> static char *kiss_basename(char *s)
> {
> @@ -58,6 +64,8 @@ static void terminate(int sig)
>
> if (!i_am_unix98_pty_master)
> tty_unlock(kttyname);
> + else if (symlink_pty)
> + unlink(kttyname);
>
> exit(0);
> }
> @@ -214,7 +222,8 @@ static int startiface(char *dev, struct hostent *hp)
>
> static void usage(void)
> {
> - fprintf(stderr, "usage: %s [-b] [-l] [-m mtu] [-v] tty port [inetaddr]\n", progname);
> + fprintf(stderr, "usage: %s [-b] [-l] [-m mtu] [-v] [-o user:group] [-p mode] tty port [inetaddr]\n",
> + progname);
> }
>
> int main(int argc, char *argv[])
> @@ -227,12 +236,18 @@ int main(int argc, char *argv[])
> * the client has to use */
> struct hostent *hp = NULL;
>
> + /* Name of the user and group who will "own" the pty */
> + char* pty_owner_user = NULL;
> + char* pty_owner_group = NULL;
> + /* Mode for pty: if 0; use defaults */
> + mode_t pty_mode = 0;
> +
> progname = kiss_basename(argv[0]);
>
> if (!strcmp(progname, "spattach"))
> disc = N_6PACK;
>
> - while ((fd = getopt(argc, argv, "b6i:lm:v")) != -1) {
> + while ((fd = getopt(argc, argv, "b6i:lm:o:p:v")) != -1) {
> switch (fd) {
> case '6':
> disc = N_6PACK;
> @@ -250,9 +265,24 @@ int main(int argc, char *argv[])
> case 'm':
> if ((mtu = atoi(optarg)) <= 0) {
> fprintf(stderr, "%s: invalid mtu size - %s\n", progname, optarg);
> - return 1;
> + case 'o':
> + /* Change the owner of the pty */
> + {
> + char* colon = index(optarg,':');
> + if (colon) {
> + pty_owner_user = optarg;
> + pty_owner_group = colon + 1;
> + *colon = 0;
> + } else {
> + fprintf(stderr, "%s: Must specify user:group\n", progname);
> + return 1;
> + }
> }
> break;
> + case 'p':
> + /* Change the permissions (mode) of the pty */
> + pty_mode = (mode_t)strtoul(optarg, NULL, 8);
> + break;
> case 'v':
> printf("%s: %s\n", progname, VERSION);
> return 0;
hi Stuart,
what was the model for you cli ? i was looking at 'install' and it uses
-g group
-o owner
-m mode
> @@ -278,8 +308,17 @@ int main(int argc, char *argv[])
> if (argc-1 >= optind && !inetaddr)
> inetaddr = argv[optind];
>
> - if (!strcmp("/dev/ptmx", kttyname))
> + if (!strcmp(PTMX_TTY, kttyname)) {
> + i_am_unix98_pty_master = 1;
> + } else if (strstr(kttyname, "pty:") == kttyname) {
> + /*
> + * If the path starts with pty:, then create a
> + * new pty (Unix98 style) and make a symlink to it
> + */
> i_am_unix98_pty_master = 1;
> + kttyname = index(kttyname, ':') + 1;
> + symlink_pty = 1;
> + }
>
> if (!i_am_unix98_pty_master) {
> if (tty_is_locked(kttyname)) {
> @@ -296,7 +335,7 @@ int main(int argc, char *argv[])
> return 1;
> }
>
> - if ((fd = open(kttyname, O_RDONLY | O_NONBLOCK)) == -1) {
> + if ((fd = open((symlink_pty ? PTMX_TTY : kttyname), O_RDONLY | O_NONBLOCK)) == -1) {
> if (errno == ENOENT) {
> fprintf(stderr, "%s: Cannot find serial device %s, no such file or directory.\n", progname, kttyname);
> } else {
> @@ -353,12 +392,69 @@ int main(int argc, char *argv[])
>
> printf("AX.25 port %s bound to device %s\n", portname, dev);
> if (i_am_unix98_pty_master) {
> - /* Users await the slave pty to be referenced in the 3d line */
> - printf("Awaiting client connects on\n%s\n", namepts);
> + /* Are we being asked to chown? */
> + if (pty_owner_user) {
> + /* Look up the user */
> + struct passwd user;
> + struct passwd* user_ptr = NULL;
> + struct group grp;
> + struct group* grp_ptr = NULL;
> + char buffer[512];
> + int err = getpwnam_r(pty_owner_user, &user,
> + buffer, sizeof(buffer)-1, &user_ptr);
why _r ? any need to make it thread safe ?
just my 2 cents,
re,
wh
> + if (err) {
> + fprintf(stderr,
> + "Failed to look up user: %s (%d)\n",
> + strerror(err), err);
> + return 1;
> + }
> +
> + err = getgrnam_r(pty_owner_group, &grp,
> + buffer, sizeof(buffer)-1, &grp_ptr);
> + if (err) {
> + fprintf(stderr,
> + "Failed to look up group: %s (%d)\n",
> + strerror(err), err);
> + return 1;
> + }
> +
> + if (user_ptr && grp_ptr &&
> + chown(namepts, user_ptr->pw_uid,
> + grp_ptr->gr_gid)) {
> + fprintf(stderr,
> + "Failed to change ownership: %s (%d)\n",
> + strerror(errno), errno);
> + return 1;
> + }
> + }
> +
> + /* Are we being asked to chmod? */
> + if (pty_mode) {
> + if (chmod(namepts, pty_mode)) {
> + fprintf(stderr,
> + "Failed to change mode: %s (%d)\n",
> + strerror(errno), errno);
> + }
> + }
> +
> + if (symlink_pty) {
> + /* Create the symlink */
> + if (symlink(namepts, kttyname)) {
> + fprintf(stderr,
> + "Failed to symlink PTY %s to %s: %s (%d)\n",
> + kttyname, namepts, strerror(errno), errno);
> + return 1;
> + }
> + } else {
> + /* Users await the slave pty to be referenced in the 3d line */
> + printf("Awaiting client connects on\n%s\n", namepts);
> + }
> }
> if (logging) {
> openlog(progname, LOG_PID, LOG_DAEMON);
> syslog(LOG_INFO, "AX.25 port %s bound to device %s%s%s\n", portname, dev, (i_am_unix98_pty_master ? " with slave pty " : ""), (i_am_unix98_pty_master ? namepts : ""));
> + if (symlink_pty)
> + syslog(LOG_INFO, "Slave pty %s is symlinked to %s.", namepts, kttyname);
>
> }
>
next prev parent reply other threads:[~2015-07-14 9:17 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-28 3:04 PTY Improvements for kissattach, kissnetd me
2015-06-28 3:04 ` [PATCH 1/2] kissattach: Add support for pty symlinking me
2015-07-14 9:17 ` walter harms [this message]
2015-07-14 20:04 ` Stuart Longland (VK4MSL)
2015-06-28 3:04 ` [PATCH 2/2] kissnetd: Add support for symlinking PTYs me
2015-06-28 3:30 ` PTY Improvements for kissattach, kissnetd Stuart Longland
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=55A4D39A.6000200@bfs.de \
--to=wharms@bfs.de \
--cc=linux-hams@vger.kernel.org \
--cc=me@vk4msl.yi.org \
--cc=ralf@linux-mips.org \
--cc=stuartl@longlandclan.yi.org \
/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.