|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2019 [email protected]
4: //
5:
6: #include "header.h"
7: #include "netdriver.h"
8: #include "configfile.h"
9: #include "mystring.h"
10:
11: static void *netdriver_run(void *);
12:
13: NetDriver *gNetDriver;
14:
15: // コンストラクタ
16: NetDriver::NetDriver(const char *name, EthernetDevice *p,
17: std::mutex *m, std::condition_variable *c)
18: {
19: logname = "netdriver";
20: devname = "NetDriver";
21:
22: monitor.Init(30, 7);
23:
24: fd = -1;
25: drivername = name;
26: parent = p;
27: mtx = m;
28: cv = c;
29: }
30:
31: // デストラクタ
32: NetDriver::~NetDriver()
33: {
34: }
35:
36: // モニタ
37: bool
38: NetDriver::MonitorUpdate()
39: {
40: monitor.Clear();
41:
42: monitor.Print(0, 0, "NetDriver: %s", drivername);
43: monitor.Print(0, 1, "Device : %s", devpath.c_str());
44: monitor.Print(0, 2, "Interface: %s", ifname.c_str());
45:
46: monitor.Print(5, 4, "%9s %9s", "Packets", "Bytes");
47: monitor.Print(0, 5, "Send %9" PRIu64 " %9" PRIu64, tx_pkts, tx_bytes);
48: monitor.Print(0, 6, "Recv %9" PRIu64 " %9" PRIu64, rx_pkts, rx_bytes);
49: return true;
50: }
51:
52: // スレッドが必要な継承クラスが呼ぶ
53: bool
54: NetDriver::InitRecvThread()
55: {
56: // 受信スレッド起動
57: pthread_t th;
58: pthread_create(&th, NULL, netdriver_run, NULL);
59:
60: return true;
61: }
62:
63: // 受信スレッドのエントリポイント
64: void *
65: netdriver_run(void *dummy)
66: {
67: pthread_setname_np("netdriver");
68: pthread_detach(pthread_self());
69:
70: gNetDriver->ThreadRun();
71: return NULL;
72: }
73:
74: // ifup スクリプト実行
75: bool
76: NetDriver::Run_ifup()
77: {
78: return RunScript("nono-ifup");
79: }
80:
81: // ifdown スクリプト実行
82: bool
83: NetDriver::Run_ifdown()
84: {
85: return RunScript("nono-ifdown");
86: }
87:
88: // スクリプトを実行
89: bool
90: NetDriver::RunScript(const char *filename)
91: {
92: // ファイルが存在するか
93: std::string path = gConfig->SearchFile(filename);
94: if (path.empty()) {
95: warnx("%s not found", filename);
96: return false;
97: }
98:
99: // コマンドラインを作成
100: std::string cmd = path + " " + ifname;
101:
102: // 実行
103: int rv = system(cmd.c_str());
104: if (rv == -1) {
105: warn("%s: system() failed", path.c_str());
106: return false;
107: }
108: if (rv == 127) {
109: warnx("%s: system(): shell failed", path.c_str());
110: return false;
111: }
112: if (rv != 0) {
113: warnx("%s failed with %d", path.c_str(), rv);
114: return false;
115: }
116: return true;
117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.