From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS3215 2.6.0.0/16 X-Spam-Status: No, score=-4.3 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI,NICE_REPLY_A, RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 875111F8C6 for ; Fri, 30 Jul 2021 12:22:03 +0000 (UTC) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 83BBD3890406 for ; Fri, 30 Jul 2021 12:22:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 83BBD3890406 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1627647722; bh=j4LZx+V5iqNhv1rUypWZ9Xr1qO/kemsl4R7bVUb241k=; h=Subject:To:References:Date:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=jnMrNe1vx9fHxRtwzjbW4ZoDftOTgbKqPcnlI94Epnv4D/G5zyOj+2g8TZ8wjySrq DODnLnWdAfKkdz51U/FclLNxjgfIG/jInSb0xIIS/TxAAocEamXm2F3q0yiHVgTXiW m35ikjwHM/4aADKKhhP/n35yvTlMXAuQvEAF7ruI= Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by sourceware.org (Postfix) with ESMTPS id B546E3858426 for ; Fri, 30 Jul 2021 12:21:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B546E3858426 Received: by mail-wr1-x42b.google.com with SMTP id r2so11125399wrl.1 for ; Fri, 30 Jul 2021 05:21:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=j4LZx+V5iqNhv1rUypWZ9Xr1qO/kemsl4R7bVUb241k=; b=YXHJn9yg/kVzKoAz2wdmVeB+quX+R7unzRe1sIVCDYPNEffn/hWOPT40IUdcdp+3eY 8ljOsPDfCeYgzBNVpYbp7nQPdBFvEdJ+ZLOASezjIl3yAyaBxNeEKiUXhzhmh54F4VNz fecVklkqKnKVr2UdZ0S0S6x1QvQaV46dI0Nd3wGc15cndwKRA9MPlpRGrmu6z7LrGsK1 R0I5WFzcJaVR/ErqAldA4BepOE9rb8E3juv7KKCS4DgPTtuf1lI7vR+apVxabd8iFV8o bsZMmhb5m8xeg+e+O3Fq+9fXzDsugKA0z1TgnCjNRrL1ssv+Ejmv6sH5aqoALmOFXalk P/gA== X-Gm-Message-State: AOAM532VpmZ6g22NRFm5ESB1iyGRdk1oGQL+0/Igkcs5XMOOS8HGzzp7 gAUB72ZLLP0H0wLfo2XDdct8lkXCBHo= X-Google-Smtp-Source: ABdhPJwodGO+pTycyvS8hLHw1kq1iB21ShyuFjNGmYuKuhGPw3/Tzy1SyhMmU0Cro0SLK5OoBZr6Pw== X-Received: by 2002:adf:ed4a:: with SMTP id u10mr2728825wro.86.1627647700830; Fri, 30 Jul 2021 05:21:40 -0700 (PDT) Received: from [10.8.0.10] ([195.53.121.100]) by smtp.gmail.com with ESMTPSA id 104sm1639328wrc.4.2021.07.30.05.21.39 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 30 Jul 2021 05:21:40 -0700 (PDT) Subject: Re: [PATCH] ioctl_tty.2: Add example how to get or set baudrate on the serial port To: =?UTF-8?Q?Pali_Roh=c3=a1r?= References: <20210730095333.6118-1-pali@kernel.org> <20210730120542.dv62jtm6lpfmfjyx@pali> Message-ID: <9f1725cc-e808-9c12-2932-92144ce58a78@gmail.com> Date: Fri, 30 Jul 2021 14:21:38 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <20210730120542.dv62jtm6lpfmfjyx@pali> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: "Alejandro Colomar \(man-pages\) via Libc-alpha" Reply-To: "Alejandro Colomar \(man-pages\)" Cc: =?UTF-8?Q?Marek_Beh=c3=ban?= , "G. Branden Robinson" , libc-alpha@sourceware.org, Michael Kerrisk , linux-man@vger.kernel.org Errors-To: libc-alpha-bounces+e=80x24.org@sourceware.org Sender: "Libc-alpha" Hi Pali, On 7/30/21 2:05 PM, Pali Rohár wrote: > >>> + >>> +int >>> +main(int argc, char *argv[]) >>> +{ >>> +#if !defined(TCGETS2) || !defined(TCSETS2) || !defined(BOTHER) >>> + fprintf(stderr, "TCGETS2, TCSETS2 or BOTHER is unsupported\\n"); >>> + return 1; >>> +#else >> >> Do we want the program to compile if those are unsupported? > > My intention was to provide example which compiles fine on any Linux > architecture and in case of error it reports it at runtime. > > On architectures where are TCGETS2/TCSETS2 ioctls unsupported, there are > still supported TCGETS/TCSETS ioctls. So proper Linux portable program > should fallback to TCGETS/TCSETS ioctls with Bnnn constants. > > So for example setting baudrate to 115200 would be possible via > predefined constant B115200 in c_cflag member even when struct termios2 > with c_ospeed is unsupported. > > I just did not put this fallback into this example as it would be quite > loooong (as it is needed to add big switch for every Bnnn constant and > convert numeric value into Bnnn) and example show how to use > TCGETS2/TCSETS2 (not TCGETS/TCSETS). Okay, I leave it up to you what you consider best to do :) > >> Maybe you can #error there and simplify the reader having to parse the >> preprocessor directive mentally: >> >> #if !defined... >> # error ... >> #endif >> >> I know it's non-standard, but I think it's common enough so that we can use >> it here. > > #error is standard. It is already defined in C99 (section 6.10.5 Error > directive). Ahh, it is #warning that is non-standard! Thanks. I forgot that. > >>> + struct termios2 tio2; >>> + int fd, rc; >>> + >>> + if (argc != 2 && argc != 3) { >>> + fprintf(stderr, "Usage: %s device [new_baudrate]\\n", argv[0]); >> >> We use \e for printing the escape character. Not \\ > > Ok! > >> CC: Branden >> >> See groff_man(7): >> Portability >> [...] >> >> Similar caveats apply to escapes. Some escape sequences >> are however required for correct typesetting even in man >> pages and usually do not cause portability problems: >> >> [...] >> >> \e Widely used in man pages to represent a backslash >> output glyph. It works reliably as long as the .ec >> request is not used, which should never happen in >> man pages, and it is slightly more portable than the >> more exact ‘\(rs’ (“reverse solidus”) escape se‐ >> quence. >> >> >>> + return 1; >>> + } >>> + >>> + fd = open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY); >>> + if (fd < 0) { >>> + perror("open"); >>> + return 1; >> >> exit(EXIT_FAILURE); >> >>> + } >>> + >>> + rc = ioctl(fd, TCGETS2, &tio2); >>> + if (rc) { >>> + perror("TCGETS2"); >>> + close(fd); >>> + return 1; >> >> exit(3) >> >>> + } >>> + >>> + printf("%u\\n", tio2.c_ospeed); >> >> \e >> >>> + >>> + if (argc == 3) { >>> + tio2.c_cflag &= ~CBAUD; >>> + tio2.c_cflag |= BOTHER; >>> + tio2.c_ospeed = tio2.c_ispeed = atoi(argv[2]); >>> + >>> + rc = ioctl(fd, TCSETS2, &tio2); >>> + if (rc) { >>> + perror("TCSETS2"); >>> + close(fd); >>> + return 1; >> >> exit(3) >> >>> + } >>> + } >>> + >>> + close(fd); >>> + return 0; >> >> exit(3) > > Interesting... Do you prefer to use exit(EXIT_SUCCESS) instead of return 0? I don't care in my own code. I typically use return 0 at the end of main. But the historical convention in manual pages is using exit(EXIT_SUCCESS), so let's follow that :) Tanks, Alex -- Alejandro Colomar Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/ http://www.alejandro-colomar.es/