/*
* vim: softtabstop=4 shiftwidth=4 cindent foldmethod=marker expandtab
*
* Copyright 2009-2011 Eric Connell
*
* This file is part of Mangler.
*
* Mangler is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Mangler is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Mangler. If not, see .
*/
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef _WIN32
#include
#endif
#include "ventrilo3.h"
void usage(char *argv[]);
void ctrl_c(int signum);
void *v3_feeder(void *connptr);
void *v3_consumer(void *connptr);
int debug = 0;
int should_exit = 0;
struct _conninfo {
char *server;
char *username;
char *password;
char *channelid;
};
void ctrl_c (int signum) {
printf("disconnecting... ");
v3_logout();
printf("done\n");
exit(0);
}
void usage(char *argv[]) {
fprintf(stderr, "usage: %s -h hostname:port -u username -c channelid\n", argv[0]);
exit(1);
}
void *v3_feeder(void *connptr) {
struct _conninfo *conninfo;
_v3_net_message *msg;
conninfo = connptr;
if (debug >= 2) {
v3_debuglevel(V3_DEBUG_PACKET | V3_DEBUG_PACKET_PARSE | V3_DEBUG_INFO);
}
if (! v3_login(conninfo->server, conninfo->username, conninfo->password, "")) {
fprintf(stderr, "could not log in to server: %s\n", _v3_error(NULL));
}
while ((msg = _v3_recv(V3_BLOCK)) != NULL) {
switch (_v3_process_message(msg)) {
case V3_MALFORMED:
_v3_debug(V3_DEBUG_INFO, "received malformed packet");
break;
case V3_NOTIMPL:
_v3_debug(V3_DEBUG_INFO, "packet type not implemented");
break;
case V3_OK:
_v3_debug(V3_DEBUG_INFO, "packet processed");
break;
}
}
should_exit = 1;
pthread_exit(NULL);
}
void *v3_consumer(void *connptr) {
struct _conninfo *conninfo;
v3_event *ev;
conninfo = connptr;
while ((ev = v3_get_event(V3_BLOCK))) {
if (debug) {
fprintf(stderr, "lv3_test: got event type %d\n", ev->type);
}
switch (ev->type) {
case V3_EVENT_DISCONNECT:
should_exit = 1;
free(ev);
pthread_exit(NULL);
break;
case V3_EVENT_LOGIN_COMPLETE:
v3_change_channel(atoi(conninfo->channelid), "");
fprintf(stderr, "***********************************************************************************\n");
fprintf(stderr, "***********************************************************************************\n");
fprintf(stderr, "***********************************************************************************\n");
fprintf(stderr, "***********************************************************************************\n");
fprintf(stderr, "***********************************************************************************\n");
fprintf(stderr, "***********************************************************************************\n");
fprintf(stderr, "***********************************************************************************\n");
#ifndef _WIN32
sleep(5);
#else
Sleep(5000);
#endif
v3_serverprop_open();
break;
}
free(ev);
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
int opt;
int rc;
pthread_t feeder;
pthread_t consumer;
struct _conninfo conninfo;
memset(&conninfo, 0, sizeof(struct _conninfo));
while ((opt = getopt(argc, argv, "dh:p:u:c:")) != -1) {
switch (opt) {
case 'd':
debug++;
break;
case 'h':
conninfo.server = strdup(optarg);
break;
case 'u':
conninfo.username = strdup(optarg);
break;
case 'c':
conninfo.channelid = strdup(optarg);
break;
case 'p':
conninfo.password = strdup(optarg);
break;
}
}
if (! conninfo.server) {
fprintf(stderr, "error: server hostname (-h) was not specified\n");
usage(argv);
}
if (! conninfo.username) {
fprintf(stderr, "error: username (-u) was not specified\n");
usage(argv);
}
if (! conninfo.channelid) {
fprintf(stderr, "error: channel id (-c) was not specified\n");
usage(argv);
}
if (! conninfo.password) {
conninfo.password = "";
}
fprintf(stderr, "server: %s\nusername: %s\n", conninfo.server, conninfo.username);
rc = pthread_create(&feeder, NULL, v3_feeder, (void *)&conninfo);
rc = pthread_create(&consumer, NULL, v3_consumer, (void *)&conninfo);
signal (SIGINT, ctrl_c);
while (! should_exit) {
#ifndef _WIN32
sleep(1);
#else
Sleep(1000);
#endif
}
return(0);
}