|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #include "header.h" ! 7: #include "mainapp.h" ! 8: ! 9: // 高速モード (XXX 設定ファイルと含めて見直すこと) ! 10: bool fast_mode; ! 11: ! 12: // VM ディレクトリ ! 13: std::string vmdir; ! 14: ! 15: // ログ指定文字列 (-L) ! 16: char logopt[256]; ! 17: ! 18: // 引数 arg のログ指定文字列をパースする。 ! 19: // arg は "foo=1,bar=2" 形式の文字列で、これを分解して ! 20: // それぞれ担当するオブジェクトのログレベルにセットする。 ! 21: bool ! 22: parse_logopt(const char *arg, u_int vmtype) ! 23: { ! 24: char *buf; ! 25: char *last; ! 26: char *p; ! 27: bool rv; ! 28: ! 29: // "help" (完全一致) なら識別子一覧を表示。 ! 30: if (strcmp(arg, "help") == 0) { ! 31: for (auto& obj : gObjects) { ! 32: if (obj->logname != "?") { ! 33: printf("%s\n", obj->logname.c_str()); ! 34: } ! 35: } ! 36: // エイリアスとか ! 37: printf("sch -> scheduler\n"); ! 38: if (vmtype == VM::TYPE_LUNA) { ! 39: printf("ppi -> pio\n"); ! 40: printf("scc -> sio\n"); ! 41: } ! 42: printf("all\n"); ! 43: return false; ! 44: } ! 45: ! 46: rv = false; ! 47: buf = strdup(arg); ! 48: for (p = strtok_r(buf, ",", &last); ! 49: p; ! 50: p = strtok_r(NULL, ",", &last)) ! 51: { ! 52: const char *name; ! 53: char *v; ! 54: int val; ! 55: ! 56: name = p; ! 57: ! 58: v = strchr(p, '='); ! 59: if (v) { ! 60: *v++ = '\0'; ! 61: val = atoi(v); ! 62: } else { ! 63: val = 1; ! 64: } ! 65: // ここで name は変数名、val は値(省略されたら1) ! 66: ! 67: if (strlen(name) < 1) { ! 68: printf("invalid logname '%s'\n", name); ! 69: goto abort; ! 70: } ! 71: ! 72: // 短縮形とかエイリアスとか ! 73: if (strcmp(name, "sch") == 0) ! 74: name = "scheduler"; ! 75: if (vmtype == VM::TYPE_LUNA) { ! 76: if (strcmp(name, "pio") == 0) ! 77: name = "ppi"; ! 78: if (strcmp(name, "scc") == 0) ! 79: name = "sio"; ! 80: } ! 81: ! 82: // 比較 ! 83: if (strcmp(name, "all") == 0) { ! 84: // "all" なら none 以外の全部にセット ! 85: for (auto& obj : gObjects) { ! 86: obj->loglevel = val; ! 87: } ! 88: } else { ! 89: // それ以外は一致するキーを探してセット ! 90: std::string sname = name; ! 91: bool found = false; ! 92: for (auto& obj : gObjects) { ! 93: if (obj->logname == sname) { ! 94: obj->loglevel = val; ! 95: found = true; ! 96: break; ! 97: } ! 98: } ! 99: // 見つからない場合はエラー ! 100: if (!found) { ! 101: printf("invalid logname '%s'\n", name); ! 102: goto abort; ! 103: } ! 104: } ! 105: } ! 106: ! 107: rv = true; ! 108: abort: ! 109: free(buf); ! 110: return rv; ! 111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.