* [PATCH 1/2] slcand: add flow control option
@ 2014-01-13 8:54 yegorslists
2014-01-13 8:54 ` [PATCH 2/2] slcand: reimplement daemonize routine yegorslists
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: yegorslists @ 2014-01-13 8:54 UTC (permalink / raw)
To: linux-can; +Cc: socketcan, u.kleine-koenig, mkl, Yegor Yefremov
From: Yegor Yefremov <yegorslists@googlemail.com>
Add option '-t' to specify flow control type. Two types are
supported: 'hw' - RTS/CTS and 'sw' - XON/XOFF.
Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
---
slcand.c | 32 +++++++++++++++++++++++++++++++-
1 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/slcand.c b/slcand.c
index 30f5127..996c8d2 100644
--- a/slcand.c
+++ b/slcand.c
@@ -69,6 +69,11 @@
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
+/* UART flow control types */
+#define FLOW_NONE 0
+#define FLOW_HW 1
+#define FLOW_SW 2
+
void print_usage(char *prg)
{
fprintf(stderr, "\nUsage: %s [options] <tty> [canif-name]\n\n", prg);
@@ -77,6 +82,7 @@ void print_usage(char *prg)
fprintf(stderr, " -f (read status flags with 'F\\r' to reset error states)\n");
fprintf(stderr, " -s <speed> (set CAN speed 0..8)\n");
fprintf(stderr, " -S <speed> (set UART speed in baud)\n");
+ fprintf(stderr, " -t <type> (set UART flow control type 'hw' or 'sw')\n");
fprintf(stderr, " -b <btr> (set bit time register value)\n");
fprintf(stderr, " -F (stay in foreground; no daemonize)\n");
fprintf(stderr, " -h (show this help page)\n");
@@ -300,6 +306,7 @@ int main(int argc, char *argv[])
char *speed = NULL;
char *uart_speed_str = NULL;
long int uart_speed = 0;
+ int flow_type = FLOW_NONE;
char *btr = NULL;
int run_as_daemon = 1;
pid_t parent_pid = 0;
@@ -309,7 +316,7 @@ int main(int argc, char *argv[])
ttypath[0] = '\0';
- while ((opt = getopt(argc, argv, "ocfs:S:b:?hF")) != -1) {
+ while ((opt = getopt(argc, argv, "ocfs:S:t:b:?hF")) != -1) {
switch (opt) {
case 'o':
send_open = 1;
@@ -336,6 +343,18 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
break;
+ case 't':
+ if (!strcmp(optarg, "hw")) {
+ flow_type = FLOW_HW;
+ }
+ else if (!strcmp(optarg, "sw")) {
+ flow_type = FLOW_SW;
+ }
+ else {
+ fprintf(stderr, "Unsupported flow type (%s)\n", optarg);
+ exit(EXIT_FAILURE);
+ }
+ break;
case 'b':
btr = optarg;
if (strlen(btr) > 6)
@@ -401,10 +420,21 @@ int main(int argc, char *argv[])
old_ispeed = cfgetispeed(&tios);
old_ospeed = cfgetospeed(&tios);
+ /* Reset UART settings */
+ cfmakeraw(&tios);
+ tios.c_iflag &= ~IXOFF;
+ tios.c_cflag &= ~CRTSCTS;
+
/* Baud Rate */
cfsetispeed(&tios, look_up_uart_speed(uart_speed));
cfsetospeed(&tios, look_up_uart_speed(uart_speed));
+ /* Flow control */
+ if (flow_type == FLOW_HW)
+ tios.c_cflag |= CRTSCTS;
+ else if (flow_type == FLOW_SW)
+ tios.c_iflag |= (IXON | IXOFF);
+
/* apply changes */
if (tcsetattr(fd, TCSADRAIN, &tios) < 0)
syslog(LOG_NOTICE, "Cannot set attributes for device \"%s\": %s!\n", ttypath, strerror(errno));
--
1.7.7
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/2] slcand: reimplement daemonize routine 2014-01-13 8:54 [PATCH 1/2] slcand: add flow control option yegorslists @ 2014-01-13 8:54 ` yegorslists 2014-01-13 9:58 ` Uwe Kleine-König 2014-01-16 16:19 ` Marc Kleine-Budde 2014-01-13 18:01 ` [PATCH 1/2] slcand: add flow control option Oliver Hartkopp 2014-01-16 16:19 ` Marc Kleine-Budde 2 siblings, 2 replies; 8+ messages in thread From: yegorslists @ 2014-01-13 8:54 UTC (permalink / raw) To: linux-can; +Cc: socketcan, u.kleine-koenig, mkl, Yegor Yefremov From: Yegor Yefremov <yegorslists@googlemail.com> Replace daemonize() routine with daemone() system call, because of conflicting licenses. daemonize() routine was derived from under GNU Free Documentation License licensed code. This license is incompatible with GPL-2+. Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> --- slcand.c | 144 +++----------------------------------------------------------- 1 files changed, 6 insertions(+), 138 deletions(-) diff --git a/slcand.c b/slcand.c index 996c8d2..66e62e0 100644 --- a/slcand.c +++ b/slcand.c @@ -18,20 +18,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * This code is derived from an example daemon code from - * - * http://en.wikipedia.org/wiki/Daemon_(computer_software)#Sample_Program_in_C_on_Linux - * (accessed 2009-05-05) - * - * So it is additionally licensed under the GNU Free Documentation License: - * - * Permission is granted to copy, distribute and/or modify this document - * under the terms of the GNU Free Documentation License, Version 1.2 - * or any later version published by the Free Software Foundation; - * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. - * A copy of the license is included in the section entitled "GNU - * Free Documentation License". - * * Send feedback to <linux-can@vger.kernel.org> * */ @@ -63,9 +49,6 @@ /* The length of ttypath buffer */ #define TTYPATH_LENGTH 64 -/* The length of pidfile name buffer */ -#define PIDFILE_LENGTH 64 - #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 @@ -96,7 +79,6 @@ void print_usage(char *prg) static int slcand_running; static int exit_code; static char ttypath[TTYPATH_LENGTH]; -static char pidfile[PIDFILE_LENGTH]; static void child_handler(int signum) { @@ -178,117 +160,6 @@ static int look_up_uart_speed(long int s) } } -static pid_t daemonize(const char *lockfile, char *tty, char *name) -{ - pid_t pid, sid, parent; - int lfp = -1; - FILE *pFile; - char const *pidprefix = "/var/run/"; - char const *pidsuffix = ".pid"; - - snprintf(pidfile, PIDFILE_LENGTH, "%s%s-%s%s", pidprefix, DAEMON_NAME, tty, pidsuffix); - - /* already a daemon */ - if (getppid() == 1) - return 0; - - /* Create the lock file as the current user */ - if (lockfile && lockfile[0]) { - - lfp = open(lockfile, O_RDWR | O_CREAT, 0640); - if (lfp < 0) - { - syslog(LOG_ERR, "unable to create lock file %s, code=%d (%s)", - lockfile, errno, strerror(errno)); - exit(EXIT_FAILURE); - } - } - - /* Drop user if there is one, and we were run as root */ - if (getuid() == 0 || geteuid() == 0) { - struct passwd *pw = getpwnam(RUN_AS_USER); - - if (pw) - { - /* syslog(LOG_NOTICE, "setting user to " RUN_AS_USER); */ - setuid(pw->pw_uid); - } - } - - /* Trap signals that we expect to receive */ - signal(SIGINT, child_handler); - signal(SIGTERM, child_handler); - signal(SIGCHLD, child_handler); - signal(SIGUSR1, child_handler); - signal(SIGALRM, child_handler); - - /* Fork off the parent process */ - pid = fork(); - if (pid < 0) { - syslog(LOG_ERR, "unable to fork daemon, code=%d (%s)", - errno, strerror(errno)); - exit(EXIT_FAILURE); - } - - /* If we got a good PID, then we can exit the parent process. */ - if (pid > 0) { - /* Wait for confirmation from the child via SIGTERM or SIGCHLD, or - for five seconds to elapse (SIGALRM). pause() should not return. */ - alarm(5); - pause(); - exit(EXIT_FAILURE); - } - - /* At this point we are executing as the child process */ - parent = getppid(); - - /* Cancel certain signals */ - signal(SIGCHLD, SIG_DFL); /* A child process dies */ - signal(SIGTSTP, SIG_IGN); /* Various TTY signals */ - signal(SIGTTOU, SIG_IGN); - signal(SIGTTIN, SIG_IGN); - signal(SIGHUP, SIG_IGN); /* Ignore hangup signal */ - signal(SIGINT, child_handler); - signal(SIGTERM, child_handler); - - /* Change the file mode mask */ - umask(0); - - /* Create a new SID for the child process */ - sid = setsid(); - if (sid < 0) { - syslog(LOG_ERR, "unable to create a new session, code %d (%s)", - errno, strerror(errno)); - exit(EXIT_FAILURE); - } - - pFile = fopen(pidfile, "w"); - if (NULL == pFile) { - syslog(LOG_ERR, "unable to create pid file %s, code=%d (%s)", - pidfile, errno, strerror(errno)); - exit(EXIT_FAILURE); - } - fprintf(pFile, "%d\n", sid); - fclose(pFile); - - /* Change the current working directory. This prevents the current - directory from being locked; hence not being able to remove it. */ - if (chdir("/") < 0) { - syslog(LOG_ERR, "unable to change directory to %s, code %d (%s)", - "/", errno, strerror(errno)); - exit(EXIT_FAILURE); - } - - /* Redirect standard files to /dev/null */ - pFile = freopen("/dev/null", "r", stdin); - pFile = freopen("/dev/null", "w", stdout); - pFile = freopen("/dev/null", "w", stderr); - - /* Tell the parent process that we are A-okay */ - /* kill(parent, SIGUSR1); */ - return parent; -} - int main(int argc, char *argv[]) { char *tty = NULL; @@ -309,7 +180,6 @@ int main(int argc, char *argv[]) int flow_type = FLOW_NONE; char *btr = NULL; int run_as_daemon = 1; - pid_t parent_pid = 0; char *pch; int ldisc = LDISC_N_SLCAN; int fd; @@ -390,8 +260,12 @@ int main(int argc, char *argv[]) syslog(LOG_INFO, "starting on TTY device %s", ttypath); /* Daemonize */ - if (run_as_daemon) - parent_pid = daemonize("/var/lock/" DAEMON_NAME, tty, name); + if (run_as_daemon) { + if (daemon(0, 0)) { + syslog(LOG_ERR, "failed to daemonize"); + exit(EXIT_FAILURE); + } + } else { /* Trap signals that we expect to receive */ signal(SIGINT, child_handler); @@ -494,8 +368,6 @@ int main(int argc, char *argv[]) close(s); } } - if (parent_pid > 0) - kill(parent_pid, SIGUSR1); /* The Big Loop */ while (slcand_running) @@ -522,10 +394,6 @@ int main(int argc, char *argv[]) if (tcsetattr(fd, TCSADRAIN, &tios) < 0) syslog(LOG_NOTICE, "Cannot set attributes for device \"%s\": %s!\n", ttypath, strerror(errno)); - /* Remove pidfile */ - if (run_as_daemon) - unlink(pidfile); - /* Finish up */ syslog(LOG_NOTICE, "terminated on %s", ttypath); closelog(); -- 1.7.7 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] slcand: reimplement daemonize routine 2014-01-13 8:54 ` [PATCH 2/2] slcand: reimplement daemonize routine yegorslists @ 2014-01-13 9:58 ` Uwe Kleine-König 2014-01-13 10:02 ` Yegor Yefremov 2014-01-16 16:19 ` Marc Kleine-Budde 1 sibling, 1 reply; 8+ messages in thread From: Uwe Kleine-König @ 2014-01-13 9:58 UTC (permalink / raw) To: yegorslists; +Cc: linux-can, socketcan, mkl Hello Yegor, On Mon, Jan 13, 2014 at 09:54:05AM +0100, yegorslists@googlemail.com wrote: > From: Yegor Yefremov <yegorslists@googlemail.com> > > Replace daemonize() routine with daemone() system call, because of > conflicting licenses. daemonize() routine was derived from under > GNU Free Documentation License licensed code. This license is > incompatible with GPL-2+. > > Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> Thanks. Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Uwe ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] slcand: reimplement daemonize routine 2014-01-13 9:58 ` Uwe Kleine-König @ 2014-01-13 10:02 ` Yegor Yefremov 2014-01-13 18:00 ` Oliver Hartkopp 0 siblings, 1 reply; 8+ messages in thread From: Yegor Yefremov @ 2014-01-13 10:02 UTC (permalink / raw) To: Uwe Kleine-König Cc: linux-can@vger.kernel.org, Oliver Hartkopp, Marc Kleine-Budde On Mon, Jan 13, 2014 at 10:58 AM, Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote: > Hello Yegor, > > On Mon, Jan 13, 2014 at 09:54:05AM +0100, yegorslists@googlemail.com wrote: >> From: Yegor Yefremov <yegorslists@googlemail.com> >> >> Replace daemonize() routine with daemone() system call, because of >> conflicting licenses. daemonize() routine was derived from under >> GNU Free Documentation License licensed code. This license is >> incompatible with GPL-2+. >> >> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> > Thanks. > > Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Just a note. I've tested the patches with our VScom USB-CAN device at 3Mbit/s. So far everything was working as expected: daemon started and I could send/receive frames. Yegor ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] slcand: reimplement daemonize routine 2014-01-13 10:02 ` Yegor Yefremov @ 2014-01-13 18:00 ` Oliver Hartkopp 0 siblings, 0 replies; 8+ messages in thread From: Oliver Hartkopp @ 2014-01-13 18:00 UTC (permalink / raw) To: Yegor Yefremov, Uwe Kleine-König Cc: linux-can@vger.kernel.org, Marc Kleine-Budde On 13.01.2014 11:02, Yegor Yefremov wrote: > On Mon, Jan 13, 2014 at 10:58 AM, Uwe Kleine-König > <u.kleine-koenig@pengutronix.de> wrote: >> Hello Yegor, >> >> On Mon, Jan 13, 2014 at 09:54:05AM +0100, yegorslists@googlemail.com wrote: >>> From: Yegor Yefremov <yegorslists@googlemail.com> >>> >>> Replace daemonize() routine with daemone() system call, because of >>> conflicting licenses. daemonize() routine was derived from under >>> GNU Free Documentation License licensed code. This license is >>> incompatible with GPL-2+. >>> >>> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> >> Thanks. >> >> Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > > Just a note. I've tested the patches with our VScom USB-CAN device at > 3Mbit/s. So > far everything was working as expected: daemon started and I could > send/receive frames. > Great! That was really a cool cleanup: 6 insertions(+), 138 deletions(-) And when it works it's even better :-) Thanks! Acked-by: Oliver Hartkopp <socketcan@hartkopp.net> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] slcand: reimplement daemonize routine 2014-01-13 8:54 ` [PATCH 2/2] slcand: reimplement daemonize routine yegorslists 2014-01-13 9:58 ` Uwe Kleine-König @ 2014-01-16 16:19 ` Marc Kleine-Budde 1 sibling, 0 replies; 8+ messages in thread From: Marc Kleine-Budde @ 2014-01-16 16:19 UTC (permalink / raw) To: yegorslists, linux-can; +Cc: socketcan, u.kleine-koenig [-- Attachment #1: Type: text/plain, Size: 727 bytes --] On 01/13/2014 09:54 AM, yegorslists@googlemail.com wrote: > From: Yegor Yefremov <yegorslists@googlemail.com> > > Replace daemonize() routine with daemone() system call, because of > conflicting licenses. daemonize() routine was derived from under > GNU Free Documentation License licensed code. This license is > incompatible with GPL-2+. > > Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> Applied to master. Tnx, Marc -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de | [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 242 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] slcand: add flow control option 2014-01-13 8:54 [PATCH 1/2] slcand: add flow control option yegorslists 2014-01-13 8:54 ` [PATCH 2/2] slcand: reimplement daemonize routine yegorslists @ 2014-01-13 18:01 ` Oliver Hartkopp 2014-01-16 16:19 ` Marc Kleine-Budde 2 siblings, 0 replies; 8+ messages in thread From: Oliver Hartkopp @ 2014-01-13 18:01 UTC (permalink / raw) To: yegorslists, linux-can; +Cc: u.kleine-koenig, mkl On 13.01.2014 09:54, yegorslists@googlemail.com wrote: > From: Yegor Yefremov <yegorslists@googlemail.com> > > Add option '-t' to specify flow control type. Two types are > supported: 'hw' - RTS/CTS and 'sw' - XON/XOFF. > > Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> Acked-by: Oliver Hartkopp <socketcan@hartkopp.net> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] slcand: add flow control option 2014-01-13 8:54 [PATCH 1/2] slcand: add flow control option yegorslists 2014-01-13 8:54 ` [PATCH 2/2] slcand: reimplement daemonize routine yegorslists 2014-01-13 18:01 ` [PATCH 1/2] slcand: add flow control option Oliver Hartkopp @ 2014-01-16 16:19 ` Marc Kleine-Budde 2 siblings, 0 replies; 8+ messages in thread From: Marc Kleine-Budde @ 2014-01-16 16:19 UTC (permalink / raw) To: yegorslists, linux-can; +Cc: socketcan, u.kleine-koenig [-- Attachment #1: Type: text/plain, Size: 608 bytes --] On 01/13/2014 09:54 AM, yegorslists@googlemail.com wrote: > From: Yegor Yefremov <yegorslists@googlemail.com> > > Add option '-t' to specify flow control type. Two types are > supported: 'hw' - RTS/CTS and 'sw' - XON/XOFF. > > Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> Applied to master. Tnx, Marc -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de | [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 242 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-01-16 16:19 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-01-13 8:54 [PATCH 1/2] slcand: add flow control option yegorslists 2014-01-13 8:54 ` [PATCH 2/2] slcand: reimplement daemonize routine yegorslists 2014-01-13 9:58 ` Uwe Kleine-König 2014-01-13 10:02 ` Yegor Yefremov 2014-01-13 18:00 ` Oliver Hartkopp 2014-01-16 16:19 ` Marc Kleine-Budde 2014-01-13 18:01 ` [PATCH 1/2] slcand: add flow control option Oliver Hartkopp 2014-01-16 16:19 ` Marc Kleine-Budde
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).