root/lang/c/partty/trunk/cmd_host.cc @ 6983

Revision 6983, 3.1 kB (checked in by frsyuki, 7 years ago)

lang/c/partty: cleaned unio.h up

Line 
1#include "partty.h"
2#include "unio.h"
3#include <kazuhiki/basic.h>
4#include <kazuhiki/network.h>
5#include <iostream>
6#include <stdio.h>
7
8#include <pwd.h>
9#include <unistd.h>
10
11void usage(void)
12{
13        std::cout
14                << "\n"
15                << "* Partty Host (create new session)\n"
16                << "   [connect to server]$ partty-host  [options]  <server name>  # use default port ["<<Partty::SERVER_DEFAULT_PORT<<"]\n"
17                << "   [connect to server]$ partty-host  [options]  <server name>:<port number>\n"
18                << "   [example 1        ]$ partty-host  partty.net\n"
19                << "   [example 2        ]$ partty-host  -s mysession  -c 'a'  partty.net\n"
20                << "\n"
21                << "   options:\n"
22                << "     -s <session name>      session name\n"
23                << "     -p <password>          password to join the session\n"
24                << "     -c <lock character>    control key to lock guest operation [a]\n"
25                << "\n"
26                << std::endl;
27}
28
29int main(int argc, char* argv[])
30{
31        std::string session_name;
32        std::string password;
33        char lock_char = '0';
34        bool session_name_set;
35        bool password_set;
36        bool lock_char_set;
37        struct sockaddr_storage saddr;
38        try {
39                using namespace Kazuhiki;
40                Parser kz;
41                --argc;  ++argv;  // skip argv[0]
42                kz.on("-s", "--session",  Accept::String(session_name), session_name_set);
43                kz.on("-p", "--password", Accept::String(password),     password_set);
44                kz.on("-c", "--lock",     Accept::Character(lock_char), lock_char_set);
45                kz.break_parse(argc, argv);  // parse!
46
47                if( argc != 1 ) {
48                        usage();
49                        return 1;
50                }
51                Convert::FlexibleActiveHost(argv[0], saddr, Partty::SERVER_DEFAULT_PORT);
52
53                if( lock_char_set && lock_char < 'a' ) {
54                        throw ArgumentError("Invalid lock character");
55                }
56
57        } catch (Kazuhiki::ArgumentError& e) {
58                std::cerr << "error: " << e.what() << std::endl;
59                usage();
60                return 1;
61        }
62
63        // セッション名チェック
64        if( !session_name_set ) {
65                char sbuf[Partty::MAX_USER_NAME_LENGTH+2];  // 長さ超過を検知するために+2
66                std::cerr << "session name: " << std::flush;
67                std::cin.getline(sbuf, sizeof(sbuf));
68                session_name = sbuf;
69        }
70        if( session_name.length() > Partty::MAX_SESSION_NAME_LENGTH ) {
71                std::cerr << "Session name is too long" << std::endl;
72                return 1;
73        }
74        if( session_name.length() < Partty::MIN_SESSION_NAME_LENGTH ) {
75                std::cerr << "Session name is too short" << std::endl;
76                return 1;
77        }
78
79        // パスワードチェック
80        if( !password_set ) {
81                char* pass = getpass("password: ");
82                password = pass;
83        }
84        if( password.length() > Partty::MAX_PASSWORD_LENGTH ) {
85                std::cerr << "Password is too long" << std::endl;
86                return 1;
87        }
88
89        // ソケットをlisten
90        int ssock = socket(saddr.ss_family, SOCK_STREAM, 0);
91        if( ssock < 0 ) {
92                perror("socket");
93                return 1;
94        }
95        socklen_t saddr_len = (saddr.ss_family == AF_INET) ?
96                sizeof(struct sockaddr_in) :
97                sizeof(struct sockaddr_in6);
98        if( connect(ssock, (struct sockaddr*)&saddr, saddr_len) < 0 ) {
99                perror("can't to connect to server");
100                return 1;
101        }
102
103        // Host開始
104        try {
105                char lock_code = lock_char - 'a' + 1;
106                Partty::Host host(ssock, lock_code,
107                                session_name.c_str(), session_name.length(),
108                                password.c_str(), password.length());
109                return host.run();
110        } catch (Partty::partty_error& e) {
111                std::cerr << "error: " << e.what() << std::endl;
112                return 1;
113        }
114}
115
Note: See TracBrowser for help on using the browser.