|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2019 [email protected] ! 4: // ! 5: ! 6: #include "header.h" ! 7: #include "configfile.h" ! 8: #include "consio.h" ! 9: #include <poll.h> ! 10: #include <netdb.h> ! 11: #include <sys/socket.h> ! 12: ! 13: // コンストラクタ ! 14: ConsioTCP::ConsioTCP() ! 15: { ! 16: ls = -1; ! 17: sock = -1; ! 18: } ! 19: ! 20: // デストラクタ ! 21: ConsioTCP::~ConsioTCP() ! 22: { ! 23: if (res) { ! 24: freeaddrinfo(res); ! 25: res = NULL; ! 26: } ! 27: if (sock != -1) { ! 28: close(sock); ! 29: sock = -1; ! 30: } ! 31: if (ls != -1) { ! 32: close(ls); ! 33: ls = -1; ! 34: } ! 35: } ! 36: ! 37: // 初期化 ! 38: bool ! 39: ConsioTCP::Init() ! 40: { ! 41: struct addrinfo hints; ! 42: int r; ! 43: int on = 1; ! 44: ! 45: memset(&hints, 0, sizeof(hints)); ! 46: hints.ai_family = AF_UNSPEC; ! 47: hints.ai_socktype = SOCK_STREAM; ! 48: hints.ai_flags = AI_PASSIVE; ! 49: ! 50: const char *host = "::1"; ! 51: std::string port = gConfig->ReadStr("debugger_port", "9999"); ! 52: printf("debugger_port=%s\n", port.c_str()); ! 53: ! 54: r = getaddrinfo(host, port.c_str(), &hints, &res); ! 55: if (r != 0) { ! 56: const char *errmsg; ! 57: if (r == EAI_SYSTEM) { ! 58: errmsg = strerror(errno); ! 59: } else { ! 60: errmsg = gai_strerror(r); ! 61: } ! 62: warnx("getaddrinfo: %s: %s", host, errmsg); ! 63: return false; ! 64: } ! 65: if (res == NULL) { ! 66: warnx("getaddrinfo: %s: no address found", host); ! 67: return false; ! 68: } ! 69: ! 70: // res を順番に試して成功したらそれで待ち受ける ! 71: ls = -1; ! 72: for (ai = res; ai && ls == -1; ai = ai->ai_next) { ! 73: ls = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); ! 74: if (ls == -1) { ! 75: warn("socket"); ! 76: continue; ! 77: } ! 78: ! 79: if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) { ! 80: warn("setsockopt(SO_REUSEADDR)"); ! 81: close(ls); ! 82: continue; ! 83: } ! 84: ! 85: if (setsockopt(ls, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on))) { ! 86: warn("setsockopt(SO_REUSEPORT)"); ! 87: close(ls); ! 88: continue; ! 89: } ! 90: ! 91: if (bind(ls, ai->ai_addr, ai->ai_addrlen) == -1) { ! 92: warn("bind"); ! 93: close(ls); ! 94: continue; ! 95: } ! 96: ! 97: if (listen(ls, 0) == -1) { ! 98: warn("listen"); ! 99: close(ls); ! 100: continue; ! 101: } ! 102: ! 103: // ここまで来たら成功 ! 104: break; ! 105: } ! 106: ! 107: if (ls == -1) { ! 108: return false; ! 109: } ! 110: ! 111: return true; ! 112: } ! 113: ! 114: bool ! 115: ConsioTCP::Open() ! 116: { ! 117: // 待ち受け ! 118: for (;;) { ! 119: sock = accept(ls, ai->ai_addr, &ai->ai_addrlen); ! 120: if (sock == -1) { ! 121: if (errno == EINTR) { ! 122: continue; ! 123: } ! 124: warn("accept"); ! 125: return false; ! 126: } ! 127: break; ! 128: } ! 129: ! 130: return true; ! 131: } ! 132: ! 133: void ! 134: ConsioTCP::Close() ! 135: { ! 136: if (sock != -1) { ! 137: close(sock); ! 138: sock = -1; ! 139: } ! 140: } ! 141: ! 142: void ! 143: ConsioTCP::Print(const char *fmt, ...) ! 144: { ! 145: char buf[1024]; ! 146: va_list ap; ! 147: int len; ! 148: int r; ! 149: ! 150: if (sock == -1) { ! 151: errno = EBADF; ! 152: return; ! 153: } ! 154: ! 155: va_start(ap, fmt); ! 156: len = vsnprintf(buf, sizeof(buf), fmt, ap); ! 157: va_end(ap); ! 158: ! 159: len = std::min(len, (int)sizeof(buf)); ! 160: r = write(sock, buf, len); ! 161: if (r == -1) ! 162: Close(); ! 163: } ! 164: ! 165: void ! 166: ConsioTCP::Flush() ! 167: { ! 168: } ! 169: ! 170: int ! 171: ConsioTCP::GetChar() ! 172: { ! 173: char ch; ! 174: int r; ! 175: ! 176: if (sock == -1) { ! 177: errno = EBADF; ! 178: return -1; ! 179: } ! 180: ! 181: r = read(sock, &ch, 1); ! 182: if (r == -1) { ! 183: Close(); ! 184: return -1; ! 185: } ! 186: return ch; ! 187: } ! 188: ! 189: int ! 190: ConsioTCP::Gets(char *buf, int bufsize) ! 191: { ! 192: int len; ! 193: int r; ! 194: ! 195: if (sock == -1) { ! 196: errno = EBADF; ! 197: return -1; ! 198: } ! 199: ! 200: for (len = 0; len < bufsize - 1; ) { ! 201: r = read(sock, buf + len, 1); ! 202: if (r == 0) { ! 203: goto done; ! 204: } ! 205: if (r == -1) { ! 206: Close(); ! 207: return -1; ! 208: } ! 209: char c = buf[len]; ! 210: len++; ! 211: ! 212: if (c == '\n') { ! 213: break; ! 214: } ! 215: } ! 216: ! 217: done: ! 218: buf[len] = '\0'; ! 219: return len; ! 220: } ! 221: ! 222: int ! 223: ConsioTCP::Poll() ! 224: { ! 225: struct pollfd pfd; ! 226: ! 227: if (sock == -1) { ! 228: errno = EBADF; ! 229: return -1; ! 230: } ! 231: ! 232: pfd.fd = sock; ! 233: pfd.events = POLLIN; ! 234: pfd.revents = 0; ! 235: int r = poll(&pfd, 1, 0); ! 236: return r; ! 237: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.