Annotation of nono/host/comdriver_stdio.cpp, revision 1.1.1.2

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2021 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // シリアルポートの標準入出力ドライバ
                      9: //
                     10: 
                     11: #include "comdriver_stdio.h"
                     12: #include "hostcom.h"
                     13: 
                     14: // コンストラクタ
                     15: COMDriverStdio::COMDriverStdio(HostDevice *hostdev_)
                     16:        : inherited(hostdev_, "Stdio")
                     17: {
                     18:        // 現在の端末属性を取得
                     19:        tcgetattr(STDIN_FILENO, &oldtc);
                     20: }
                     21: 
                     22: // デストラクタ
                     23: COMDriverStdio::~COMDriverStdio()
                     24: {
                     25:        // 端末属性を元に戻す
                     26:        tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
                     27: }
                     28: 
                     29: // ドライバ初期化
                     30: bool
                     31: COMDriverStdio::InitDriver()
                     32: {
                     33:        struct termios tc;
                     34: 
                     35:        // 端末の設定を変更
                     36:        tc = oldtc;
                     37: 
                     38:        // 入力時の変換は無し
                     39:        tc.c_iflag = 0;
                     40: 
                     41:        tc.c_lflag &= ~ECHO;    // エコーオフ
                     42:        tc.c_lflag &= ~ICANON;  // 非カノニカルモード
                     43:        tc.c_lflag &= ~IEXTEN;  // DISCARD(^O)と LNEXT をオフ?
1.1.1.2 ! root       44:        tc.c_lflag &= ~ISIG;    // シグナルを生成しない
1.1       root       45:        tc.c_cc[VTIME] = 0;
                     46:        tc.c_cc[VMIN] = 1;
                     47: 
                     48:        if (tcsetattr(STDIN_FILENO, TCSANOW, &tc) < 0) {
                     49:                putmsg(0, "tcsetattr: %s", strerror(errno));
                     50:                return false;
                     51:        }
                     52: 
                     53:        if (hostdev->AddOuter(STDIN_FILENO) < 0) {
                     54:                putmsg(0, "AddOuter: %s", strerror(errno));
                     55:                return false;
                     56:        }
                     57: 
                     58:        return true;
                     59: }
                     60: 
                     61: // 外部への1バイト書き出し
                     62: void
                     63: COMDriverStdio::Write(uint32 data)
                     64: {
                     65:        uint8 buf[1];
                     66:        int r;
                     67: 
                     68:        buf[0] = data;
                     69:        r = write(STDOUT_FILENO, buf, sizeof(buf));
                     70:        if (r < 0) {
                     71:                putmsg(0, "write: %s", strerror(errno));
                     72:                return;
                     73:        }
                     74:        if (r < sizeof(buf)) {
                     75:                putmsg(0, "write: short");
                     76:                return;
                     77:        }
                     78: }
                     79: 
                     80: // 外部からの1バイト読み込み
                     81: int
                     82: COMDriverStdio::Read()
                     83: {
                     84:        uint8 buf[1];
                     85:        int r;
                     86: 
                     87:        r = read(STDIN_FILENO, buf, sizeof(buf));
                     88:        if (r < 0) {
                     89:                putmsg(0, "read: %s", strerror(errno));
                     90:                return NODATA;
                     91:        }
                     92:        if (r == 0) {
                     93:                return NODATA;
                     94:        }
                     95:        return buf[0];
                     96: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.