static void tgprpl_login (PurpleAccount * acct) { debug ("tgprpl_login()\n"); PurpleConnection *gc = purple_account_get_connection(acct); char const *username = purple_account_get_username(acct); struct tgl_state *TLS = tgl_state_alloc (); const char *dir = config_dir; struct passwd *pw = getpwuid(getuid()); size_t len = strlen (dir) + strlen (pw->pw_dir) + 2 + strlen (username); TLS->base_path = malloc (len); snprintf (TLS->base_path, len, "%s/%s/%s", pw->pw_dir, dir, username); debug ("base configuration path: '%s'", TLS->base_path); g_mkdir_with_parents(TLS->base_path, 0700); len += strlen ("/downloads"); char *ddir = malloc (len); sprintf (ddir, "%s/downloads", TLS->base_path); tgl_set_download_directory (TLS, ddir); g_mkdir_with_parents(ddir, 0700); free (ddir); tgl_set_verbosity (TLS, 4); tgl_set_rsa_key (TLS, pk_path); // create handle to store additional info for libpurple in // the new telegram instance telegram_conn *conn = g_new0(telegram_conn, 1); conn->TLS = TLS; conn->gc = gc; conn->pa = acct; conn->new_messages = g_queue_new (); conn->joining_chats = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); purple_connection_set_protocol_data (gc, conn); tgl_set_ev_base (TLS, conn); tgl_set_net_methods (TLS, &tgp_conn_methods); tgl_set_timer_methods (TLS, &tgp_timers); tgl_set_callback (TLS, &tgp_callback); tgl_register_app_id (TLS, TGP_APP_ID, TGP_APP_HASH); tgl_init (TLS); purple_connection_set_state (conn->gc, PURPLE_CONNECTING); telegram_login (TLS); }
int main (int argc, char **argv) { signal (SIGSEGV, termination_signal_handler); signal (SIGABRT, termination_signal_handler); signal (SIGBUS, termination_signal_handler); signal (SIGQUIT, termination_signal_handler); signal (SIGFPE, termination_signal_handler); signal (SIGPIPE, SIG_IGN); signal (SIGTERM, sig_term_handler); signal (SIGINT, sig_term_handler); rl_catch_signals = 0; log_level = 10; args_parse (argc, argv); change_user_group (); if (port > 0) { struct sockaddr_in serv_addr; sfd = socket (AF_INET, SOCK_STREAM, 0); if (sfd < 0) { perror ("socket"); exit(1); } memset (&serv_addr, 0, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl (0x7f000001); serv_addr.sin_port = htons (port); if (bind (sfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { perror ("bind"); exit(1); } listen (sfd, 5); } else { sfd = -1; } if (unix_socket) { assert (strlen (unix_socket) < 100); struct sockaddr_un serv_addr; usfd = socket (AF_UNIX, SOCK_STREAM, 0); if (usfd < 0) { perror ("socket"); exit(1); } memset (&serv_addr, 0, sizeof (serv_addr)); serv_addr.sun_family = AF_UNIX; snprintf (serv_addr.sun_path, 108, "%s", unix_socket); if (bind (usfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { perror ("bind"); exit(1); } listen (usfd, 5); } else { usfd = -1; } if (daemonize) { signal (SIGHUP, sighup_handler); reopen_logs (); } signal (SIGUSR1, sigusr1_handler); if (!disable_output) { printf ( "Telegram-cli version " TGL_VERSION ", Copyright (C) 2013-2014 Vitaly Valtman\n" "Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions; type `show_license' for details.\n" ); } running_for_first_time (); parse_config (); tgl_set_rsa_key ("/etc/" PROG_NAME "/server.pub"); tgl_set_rsa_key ("tg-server.pub"); get_terminal_attributes (); #ifdef USE_LUA if (lua_file) { lua_init (lua_file); } #endif inner_main (); return 0; }
int main (int argc, char **argv) { signal (SIGSEGV, termination_signal_handler); signal (SIGABRT, termination_signal_handler); signal (SIGBUS, termination_signal_handler); signal (SIGQUIT, termination_signal_handler); signal (SIGFPE, termination_signal_handler); signal (SIGPIPE, SIG_IGN); signal (SIGTERM, sig_term_handler); signal (SIGINT, sig_term_handler); rl_catch_signals = 0; log_level = 10; args_parse (argc, argv); change_user_group (); if (port > 0) { struct sockaddr_in serv_addr; int yes = 1; sfd = socket (AF_INET, SOCK_STREAM, 0); if (sfd < 0) { perror ("socket"); exit(1); } if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) { perror("setsockopt"); exit(1); } memset (&serv_addr, 0, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = accept_any_tcp ? INADDR_ANY : htonl (0x7f000001); serv_addr.sin_port = htons (port); if (bind (sfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { perror ("bind"); exit(1); } listen (sfd, 5); } else { sfd = -1; } if (unix_socket) { assert (strlen (unix_socket) < 100); struct sockaddr_un serv_addr; usfd = socket (AF_UNIX, SOCK_STREAM, 0); if (usfd < 0) { perror ("socket"); exit(1); } memset (&serv_addr, 0, sizeof (serv_addr)); serv_addr.sun_family = AF_UNIX; snprintf (serv_addr.sun_path, sizeof(serv_addr.sun_path), "%s", unix_socket); if (bind (usfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) { perror ("bind"); exit(1); } listen (usfd, 5); } else { usfd = -1; } if (daemonize) { signal (SIGHUP, sighup_handler); reopen_logs (); } signal (SIGUSR1, sigusr1_handler); if (!disable_output) { printf ( "Telegram-cli version " TELEGRAM_CLI_VERSION ", Copyright (C) 2013-2015 Vitaly Valtman\n" "Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions; type `show_license' for details.\n" "Telegram-cli uses libtgl version " TGL_VERSION "\n" #ifndef TGL_AVOID_OPENSSL "Telegram-cli includes software developed by the OpenSSL Project\n" "for use in the OpenSSL Toolkit. (http://www.openssl.org/)\n" #endif #ifdef USE_PYTHON "Telegram-cli uses libpython version " PY_VERSION "\n" #endif ); } running_for_first_time (); parse_config (); #ifdef __FreeBSD__ tgl_set_rsa_key (TLS, "/usr/local/etc/" PROG_NAME "/server.pub"); #else tgl_set_rsa_key (TLS, "/etc/" PROG_NAME "/server.pub"); #endif tgl_set_rsa_key (TLS, "tg-server.pub"); tgl_set_rsa_key_direct (TLS, tglmp_get_default_e (), tglmp_get_default_key_len (), tglmp_get_default_key ()); get_terminal_attributes (); #ifdef USE_LUA if (lua_file) { lua_init (lua_file, lua_param); } #endif #ifdef USE_PYTHON if (python_file) { py_init (python_file); } #endif inner_main (); return 0; }
void args_parse (int argc, char **argv) { int opt = 0; while ((opt = getopt (argc, argv, "u:hk:vNl:fEwWCRdL:DU:G:qP:S:e:" #ifdef HAVE_LIBCONFIG "c:p:" #else "B" #endif #ifdef USE_LUA "s:" #endif )) != -1) { switch (opt) { case 'u': set_default_username (optarg); break; case 'k': //rsa_public_key_name = tstrdup (optarg); tgl_set_rsa_key (optarg); break; case 'v': tgl_incr_verbosity (); verbosity ++; break; case 'N': msg_num_mode ++; break; #ifdef HAVE_LIBCONFIG case 'c': config_filename = tstrdup (optarg); break; case 'p': prefix = tstrdup (optarg); assert (strlen (prefix) <= 100); break; #else case 'B': binlog_enabled = 1; break; #endif case 'l': log_level = atoi (optarg); break; case 'f': sync_from_start = 1; break; case 'E': disable_auto_accept = 1; break; case 'w': allow_weak_random = 1; break; #ifdef USE_LUA case 's': lua_file = strdup (optarg); break; #endif case 'W': wait_dialog_list = 1; break; case 'C': disable_colors ++; break; case 'R': readline_disabled ++; break; case 'd': daemonize ++; break; case 'L': logname = optarg; break; case 'U': set_user_name = optarg; break; case 'G': set_group_name = optarg; break; case 'D': disable_output ++; break; case 'q': reset_authorization ++; break; case 'P': port = atoi (optarg); break; case 'S': unix_socket = optarg; break; case 'e': start_command = optarg; break; case 'h': default: usage (); break; } } }
void args_parse (int argc, char **argv) { TLS = tgl_state_alloc (); static struct option long_options[] = { {"debug-allocator", no_argument, 0, 1000 }, {"phone", required_argument, 0, 'u'}, {"rsa-key", required_argument, 0, 'k'}, {"verbosity", no_argument, 0, 'v'}, {"enable-msg-id", no_argument, 0, 'N'}, #ifdef HAVE_LIBCONFIG {"config", required_argument, 0, 'c'}, {"profile", required_argument, 0, 'p'}, #else #if 0 {"enable-binlog", no_argument, 0, 'B'}, #endif #endif {"log-level", required_argument, 0, 'l'}, {"sync-from-start", no_argument, 0, 'f'}, {"disable-auto-accept", no_argument, 0, 'E'}, {"allow-weak-random", no_argument, 0, 'w'}, #ifdef USE_LUA {"lua-script", required_argument, 0, 's'}, {"lua-param", required_argument, 0, 'K'}, #endif {"wait-dialog-list", no_argument, 0, 'W'}, {"disable-colors", no_argument, 0, 'C'}, {"disable-readline", no_argument, 0, 'R'}, {"alert", no_argument, 0, 'A'}, {"daemonize", no_argument, 0, 'd'}, {"logname", required_argument, 0, 'L'}, {"username", required_argument, 0, 'U'}, {"groupname", required_argument, 0, 'G'}, {"disable-output", no_argument, 0, 'D'}, {"reset-authorization", no_argument, 0, 'q'}, {"tcp-port", required_argument, 0, 'P'}, {"unix-socket", required_argument, 0, 'S'}, {"exec", required_argument, 0, 'e'}, {"disable-names", no_argument, 0, 'I'}, {"enable-ipv6", no_argument, 0, '6'}, {"bot", required_argument, 0, 'b'}, {"help", no_argument, 0, 'h'}, {"accept-any-tcp", no_argument, 0, 1001}, {"disable-link-preview", no_argument, 0, 1002}, {"json", no_argument, 0, 1003}, {"python-script", required_argument, 0, 'Z'}, {"permanent-msg-ids", no_argument, 0, 1004}, {"permanent-peer-ids", no_argument, 0, 1005}, {0, 0, 0, 0 } }; int opt = 0; while ((opt = getopt_long (argc, argv, "u:hk:vNl:fEwWCRAdL:DU:G:qP:S:e:I6b" #ifdef HAVE_LIBCONFIG "c:p:" #else #if 0 "B" #endif #endif #ifdef USE_LUA "s:" #endif #ifdef USE_PYTHON "Z:" #endif , long_options, NULL )) != -1) { switch (opt) { case 'b': bot_mode ++; bot_hash = optarg; break; case 1000: tgl_allocator = &tgl_allocator_debug; break; case 1001: accept_any_tcp = 1; break; case 'u': set_default_username (optarg); break; case 'k': //rsa_public_key_name = tstrdup (optarg); tgl_set_rsa_key (TLS, optarg); break; case 'v': tgl_incr_verbosity (TLS); verbosity ++; break; case 'N': msg_num_mode ++; break; #ifdef HAVE_LIBCONFIG case 'c': config_filename = tstrdup (optarg); break; case 'p': prefix = optarg; assert (strlen (prefix) <= 100); break; #else #if 0 case 'B': binlog_enabled = 1; break; #endif #endif case 'l': log_level = atoi (optarg); break; case 'f': sync_from_start = 1; break; case 'E': disable_auto_accept = 1; break; case 'w': allow_weak_random = 1; break; #ifdef USE_LUA case 's': lua_file = strdup (optarg); break; case 'K': lua_param = strdup (optarg); break; #endif case 'W': wait_dialog_list = 1; break; #ifdef USE_PYTHON case 'Z': python_file = strdup (optarg); break; #endif case 'C': disable_colors ++; break; case 'R': readline_disabled ++; break; case 'A': alert_sound = 1; break; case 'd': daemonize ++; break; case 'L': logname = optarg; break; case 'U': set_user_name = optarg; break; case 'G': set_group_name = optarg; break; case 'D': disable_output ++; break; case 'q': reset_authorization ++; break; case 'P': port = atoi (optarg); break; case 'S': unix_socket = optarg; break; case 'e': start_command = optarg; break; case 'I': use_ids ++; break; case '6': ipv6_enabled = 1; break; case 1002: disable_link_preview = 2; break; case 1003: enable_json = 1; break; case 1004: permanent_msg_id_mode = 1; break; case 1005: permanent_peer_id_mode = 1; break; case 'h': default: usage (); break; } } }