|
|
@@ -2,23 +2,12 @@ |
|
|
|
|
|
|
|
#define VERSION_STRING "1" |
|
|
|
|
|
|
|
/* Parses the format username[:password]@server[:port] */ |
|
|
|
|
|
|
|
#define GENCOPY(dst,src,l) \ |
|
|
|
do \ |
|
|
|
{ \ |
|
|
|
dst = malloc(sep + 1); \ |
|
|
|
if (dst) \ |
|
|
|
{ \ |
|
|
|
strncpy(dst,src,l); \ |
|
|
|
dst[len] = '\0'; \ |
|
|
|
} \ |
|
|
|
else \ |
|
|
|
{ return 1; } \ |
|
|
|
} while (0) |
|
|
|
/* Parses the format username[:password]@server[:port] |
|
|
|
* user:password@server:port = userNULpasswordNULserverNUL (port N/A) |
|
|
|
*/ |
|
|
|
|
|
|
|
DECL int |
|
|
|
parse_url(char const * url) |
|
|
|
parse_url(char * url) |
|
|
|
{ |
|
|
|
size_t len = strlen(url); |
|
|
|
size_t sep = 0, ls = 0, rs; |
|
|
@@ -32,25 +21,22 @@ parse_url(char const * url) |
|
|
|
while (++rs < len && url[rs] != ':'); |
|
|
|
if (rs == len) |
|
|
|
{ rs = 0; } |
|
|
|
GENCOPY(creds.username, url, ls ? ls : sep); |
|
|
|
creds.username = url; |
|
|
|
url[ls ? ls : sep] = '\0'; |
|
|
|
if (ls) |
|
|
|
{ |
|
|
|
GENCOPY(creds.password, url + ls + 1, sep - ls - 1); |
|
|
|
creds.password = url + ls + 1; |
|
|
|
url[sep] = '\0'; |
|
|
|
} |
|
|
|
creds.server = url + sep + 1; |
|
|
|
if (rs) |
|
|
|
{ |
|
|
|
GENCOPY(creds.server, url + sep + 1, rs - sep - 1); |
|
|
|
url[rs] = '\0'; |
|
|
|
creds.port = atoi(url + rs + 1); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
GENCOPY(creds.server, url + sep + 1, len - sep - 1); |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
#undef GENCOPY |
|
|
|
|
|
|
|
DECL void |
|
|
|
rope(void) |
|
|
|
{ |
|
|
@@ -59,36 +45,48 @@ rope(void) |
|
|
|
api_rope(); |
|
|
|
} |
|
|
|
|
|
|
|
/* All possible failures / successes wipe the password from memory. */ |
|
|
|
DECL int |
|
|
|
init(void) |
|
|
|
{ |
|
|
|
int ret = 0; |
|
|
|
srand(time(NULL)); |
|
|
|
if(api_init()) |
|
|
|
{ ERR(DB_ERROR, "Error initializing database."); } |
|
|
|
memset(&callbacks, 0, sizeof(callbacks)); |
|
|
|
callbacks.event_connect = event_connect; |
|
|
|
callbacks.event_channel = event_channel; |
|
|
|
session = irc_create_session(&callbacks); |
|
|
|
if (!session) |
|
|
|
if(!api_init()) |
|
|
|
{ |
|
|
|
ERRMSG("Error creating IRC session"); |
|
|
|
goto fail; |
|
|
|
session = irc_create_session(&callbacks); |
|
|
|
if (!session) |
|
|
|
{ |
|
|
|
ERRMSG("Error creating IRC session"); |
|
|
|
ret = 1; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
atexit(rope); |
|
|
|
if (creds.username == NULL || |
|
|
|
creds.server == NULL) |
|
|
|
{ ERRMSG("Server and Username required. Stopping now"); |
|
|
|
exit(1); } |
|
|
|
|
|
|
|
if (irc_connect(session, |
|
|
|
creds.server, creds.port, creds.password, |
|
|
|
creds.username, creds.username, creds.username)) |
|
|
|
{ |
|
|
|
fprintf(stderr, "IRC ERROR: %s\n", irc_strerror(irc_errno(session))); |
|
|
|
ret = 1; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
atexit(rope); |
|
|
|
assert(creds.username != NULL); |
|
|
|
assert(creds.server != NULL); |
|
|
|
if (irc_connect(session, |
|
|
|
creds.server, creds.port, creds.password, |
|
|
|
creds.username, creds.username, creds.username)) |
|
|
|
else |
|
|
|
{ |
|
|
|
fprintf(stderr, "IRC ERROR: %s\n", irc_strerror(irc_errno(session))); |
|
|
|
exit(1); |
|
|
|
ERRMSG("Error initializing database."); |
|
|
|
ret = 1; |
|
|
|
} |
|
|
|
FULL_FREE(creds.password); |
|
|
|
return 0; |
|
|
|
fail: |
|
|
|
FULL_FREE(creds.password); |
|
|
|
return 1; |
|
|
|
if (creds.password) |
|
|
|
{ memset(creds.password, '\0', strlen(creds.password)); } |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
DECL int |
|
|
@@ -109,7 +107,7 @@ help(void) |
|
|
|
"-url URL - Sets the target URL\n" |
|
|
|
"-db DBFILE - Sets the database file (default: probotic_data.sqlite)\n" |
|
|
|
"-identify PASSWORD - Identifies against NickServ\n" |
|
|
|
"-version - Prints Version information\n" |
|
|
|
"-version - Prints version information\n" |
|
|
|
"-help - Prints this information\n" |
|
|
|
"\nUse format username[:password]@server[:port], port defaults to 6667.\n"); |
|
|
|
} |
|
|
@@ -147,7 +145,7 @@ main (int argc, |
|
|
|
else if (strcmp(arg, "url") == 0) |
|
|
|
{ parse_url(argv[1]); } |
|
|
|
else if (strcmp(arg, "channel") == 0) |
|
|
|
{ free(creds.channel); creds.channel = strdup(argv[1]); } |
|
|
|
{ creds.channel = argv[1]; } |
|
|
|
else if (strcmp(arg, "identify") == 0) |
|
|
|
{ ident_password = argv[1]; } |
|
|
|
else |
|
|
@@ -160,7 +158,6 @@ main (int argc, |
|
|
|
{ goto help; } |
|
|
|
} |
|
|
|
} |
|
|
|
atexit(creds_free); |
|
|
|
|
|
|
|
fprintf(stderr, "Connecting to %s:%s@%s:%d\nChannel: %s\n", |
|
|
|
creds.username, creds.password, |
|
|
|