/* * Author: Lubomir Host 'rajo' * $Log: mail2sms.c,v $ * Revision 1.25 2001/11/16 19:30:01 host8 * Patched bug in declaration/definition of global variable debug. * * Revision 1.24 2001/11/12 16:08:00 host8 * Big improvements in http. connect() doesn't work correctly yet. * * Revision 1.23 2001/10/30 17:24:02 host8 * New implementation of http request. * * Revision 1.22 2001/10/27 20:32:43 host8 * mail2sms.c splited to multiple files. * Little improvements in Makefile.in. * * Revision 1.21 2001/10/25 20:05:28 host8 * First implementation of login with password. * * Revision 1.20 2001/10/25 17:37:58 host8 * Support only some sms-gates available. * * Revision 1.19 2001/10/25 09:37:57 host8 * Added support for selection only some sms-gates. * * Revision 1.18 2001/10/24 19:24:49 host8 * Added parameter -p (look for password). * * Revision 1.17 2001/10/02 16:24:47 jombik9 * Added suport for Subject header. * Removed white characters in SMS message. * Minor bugfixies & lots of improvements. * Unneccessary files removed from CVS repository. */ /* README {{{1 * - riadky, na ktorych sa nachadzaju zatvorky `{{{' alebo `}}}' * su urcene pre editor ViM 6.0 . ViM 6.0 podla tychto znaciek * rozoznava, kde sa zacina a konci jedna cast textu, kt. mozno * skryt. Preto prosim neprepisuj tieto riadky, pokial nevies * co robis. D. * }}}1 */ #include #include #include #include #include #include #include //#include #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "mail2sms.h" #include "http.h" #include "strings.h" #include "passwd.h" #include "sendsms.h" #include "mail.h" #if defined(ENABLE_AZET) || defined(ENABLE_WHIZDIARY) || defined(ENABLE_SPISNET) || defined(ENABLE_GLOBTELNET) || defined(ENABLE_MTNSMS) /* empty */ #else # error Please re-run ./configure with at least one argument --enable-* ! #endif /* global variables {{{ */ char *message, *scratch, *keybd; GLOB g; //WWW www; SERVER servers[] = { #ifdef ENABLE_AZET //{ AZET, "azet", "62.168.116.69", 80, 420 }, { AZET, "azet", "sms.azet.sk", 80, 420 }, #endif #ifdef ENABLE_WHIZDIARY //{ WHIZDIARY, "whizdiary", "196.38.82.17", 80, 0 }, { WHIZDIARY, "whizdiary", "www.whizdiary.com", 80, 0 }, #endif #ifdef ENABLE_SPISNET //{ SPISNET, "spisnet", "195.168.233.131", 80, 132 }, { SPISNET, "spisnet", "sms.spisnet.sk", 80, 132 }, #endif #ifdef ENABLE_GLOBTELNET //{ GLOBTELNET, "globtelnet", "213.151.200.27", 80, 0 }, { GLOBTELNET, "globtelnet", "www.globtelnet.sk", 80, 0 }, #endif #ifdef ENABLE_MTNSMS // { MTNSMS, "mtnsms", "196.36.119.197", 80, 0 }, //{ MTNSMS, "mtnsms", "196.36.119.186", 80, 0 }, { MTNSMS, "mtnsms", "www.mtnsms.com", 80, 0 }, #endif { 0, NULL, NULL, 0, 0 } }; int id=-1; /* index to servers[] */ #ifdef DEBUG int debug = 0; #endif /* }}} */ // Function my_free() {{{ void my_free(void *ptr) { /* Normal function 'free()' is buggy, * she crash for free(NULL); */ if (ptr != NULL) free(ptr); } // }}} // Function void_read_at_exit() {{{ void void_read_at_exit(void) { int koniec = 0; fd_set fds; while (!koniec) { // prazdne citanie zo stdin, ked sa neposiela smska FD_ZERO(&fds); FD_SET(0,&fds); switch (select(FD_SETSIZE,&fds,0,0,0)) { case -1 : perror(""); exit(errno); break; default: if (FD_ISSET(0,&fds)) { if (fgets(keybd, KEYBD_LEN-1, stdin)!=NULL); else koniec=1; } break; } // end switch ( select() ) } // end while (!koniec) my_free(message); my_free(scratch); my_free(keybd); exit(0); } // }}} // Function print_usage() {{{ void print_usage(char *argv0) { fprintf(stderr, "Usage: %s [OPTIONS] [MESSAGE] ...\n", argv0); fprintf(stderr, " --number povinne tel. cislo [421903838302]\n"); fprintf(stderr, " --gate [" // #ifdef ENABLE_AZET {{{ #ifdef ENABLE_AZET # define TMP_SOMETHING_ENABLED "azet" #endif // }}} #ifdef ENABLE_AZET // #ifdef ENABLE_WHIZDIARY {{{ #ifdef ENABLE_WHIZDIARY # ifndef TMP_SOMETHING_ENABLED # define TMP_SOMETHING_ENABLED # else "|" # endif "whizdiary" #endif // }}} #ifdef ENABLE_WHIZDIARY // #ifdef ENABLE_SPISNET {{{ #ifdef ENABLE_SPISNET # ifndef TMP_SOMETHING_ENABLED # define TMP_SOMETHING_ENABLED # else "|" # endif "spisnet" #endif // }}} #ifdef ENABLE_SPISNET // #ifdef ENABLE_GLOBTELNET {{{ #ifdef ENABLE_GLOBTELNET # ifndef TMP_SOMETHING_ENABLED # define TMP_SOMETHING_ENABLED # else "|" # endif "globtelnet" #endif // }}}#ifdef ENABLE_GLOBTELNET // #ifdef ENABLE_MTNSMS {{{ #ifdef ENABLE_MTNSMS # ifndef TMP_SOMETHING_ENABLED # define TMP_SOMETHING_ENABLED # else "|" # endif "mtnsms" #endif // }}} #ifdef ENABLE_MTNSMS "]\n"); #undef TMP_SOMETHING_ENABLED fprintf(stderr, " --mail standardny vstup je mail\n"); fprintf(stderr, " --nomail standardny vstup nie je mail\n"); fprintf(stderr, " --reverse zmena poradia smsiek [123] -> [321]\n"); #ifdef DEBUG fprintf(stderr, " --debug vypis ladiacich informacii\n"); #endif fprintf(stderr, " --help vypis tejto informacie a koniec\n"); } // }}} // Function main() {{{ int main(int argc, char *argv[]) { int koniec=0; fd_set fds; g.is_mail = 0; g.reverse = 0; #ifdef DEBUG debug = 0; #endif if (argc < 2) { print_usage(argv[0]); return(0); } while (1) { // Cmdline parsing {{{ int c, i; int option_index = 0; static struct option long_options[] = { {"number", 1, 0, 'n'}, {"gate", 1, 0, 'g'}, {"passwd", 0, 0, 'p'}, {"mail", 0, 0, 'm'}, {"nomail", 0, 0, 'M'}, {"reverse", 0, 0, 'r'}, #ifdef DEBUG {"debug", 2, 0, 'd'}, #endif {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, #ifdef DEBUG "n:g:pmMrd::h", #else "n:g:pmMrh", #endif long_options, &option_index); if (c == -1) break; switch (c) { case 'n': g.number = optarg; // priradenie tel. cisla #ifdef DEBUG fprintf(stderr, "n: number = %s\n", g.number); #endif break; case 'g': #ifdef DEBUG fprintf(stderr, "%s...", optarg); #endif for (i=0; servers[i].desc != NULL; i++) { if (strcmp(servers[i].desc, optarg) == 0) { id = servers[i].id; #ifdef DEBUG fprintf(stderr, "%d\n", id); #endif break; } } if (id == -1) { fprintf(stderr, "\nInvalid option '%s'\n", optarg); exit(1); } break; case 'p': #ifdef DEBUG fprintf(stderr, "p: \n"); #endif break; case 'm': g.is_mail = 1; #ifdef DEBUG fprintf(stderr, "m: is_mail = %d\n", g.is_mail); #endif break; case 'M': g.is_mail = 0; #ifdef DEBUG fprintf(stderr, "M: is_mail = %d\n", g.is_mail); #endif break; case 'r': g.reverse = 1; #ifdef DEBUG fprintf(stderr, "r: reverse = %d\n", g.reverse); #endif break; #ifdef DEBUG case 'd': if (optarg!=NULL) { debug = atoi(optarg); } else debug = 1; fprintf(stderr, "d: debug = %d\n", debug); #endif break; case 'h': print_usage(argv[0]); return 0; break; case '?': default: break; } } // }}} sleep(1); message = (char *) malloc(MESSAGE_LEN*sizeof(char)); scratch = (char *) malloc(SCRATCH_LEN*sizeof(char)); keybd = (char *) malloc(KEYBD_LEN*sizeof(char)); // Preprocessing message {{{ switch (id) { #ifdef ENABLE_AZET case AZET: //komu=0903&predvolba=0903&cislo=838302&sprava=caf+pokus1%0adaskfjkadf+%3Csipky%3E%0ahalo&oslovenie=Ahoj+Milacik%21+&velkost=420&odoslat=Ok&odoslat.x=0&odoslat.y=0", strcpy(message, "komu="); strncat(message, g.number, 4); strcat(message, "&predvolba="); strncat(message, g.number, 4); strcat(message, "&cislo="); strncat(message, g.number + 4, (strlen(g.number) - 4) ); strcat(message, "&sprava="); break; #endif #ifdef ENABLE_WHIZDIARY case WHIZDIARY: strcpy(message, "theAction=Send+Message&cellnum=%2B"); strncat(message, g.number, strlen(g.number)); strcat(message, "&message="); break; #endif #ifdef ENABLE_SPISNET case SPISNET: strcpy(message, "smsn="); strncat(message, g.number, strlen(g.number)); strcat(message, "&chars=0"); strcat(message, "&smsm="); break; #endif #ifdef ENABLE_GLOBTELNET case GLOBTELNET: strcpy(message, "f_Slot_num=&f_Redirect=%2Fsms%2Fsms.php3" "&f_TelNumber="); strncat(message, g.number, strlen(g.number)); strcat(message, "&x=25&y=10"); strcat(message, "&f_SMSBody="); break; #endif #ifdef ENABLE_MTNSMS case MTNSMS: strcpy(message, "dummy=&smsToNumbers="); strncat(message, g.number, strlen(g.number)); strcat(message, "&smsMessage="); break; #endif default: fprintf(stderr, "Somethings go wrong, invalid id in " "preprocessing message!\n"); exit(1); break; } /* end switch (id) */ // }}} Preprocessing message if (optind < argc) { #ifdef DEBUG if (debug) fprintf (stderr, "non-option ARGV-elements:\n"); #endif while (optind < argc) { #ifdef DEBUG if (debug) fprintf (stderr, "%s ", argv[optind]); #endif strcat(message, argv[optind++]); if (argv[optind] != NULL) strcat(message, "+"); } #ifdef DEBUG if (debug) fprintf (stderr, "\n"); #endif } #ifdef DEBUG fprintf(stderr, "message: %s\n", message); #endif while (!koniec) { FD_ZERO(&fds); FD_SET(0,&fds); switch (select(FD_SETSIZE,&fds,0,0,0)) { case -1 : exit(errno); break; default: if (FD_ISSET(0,&fds)) { if (fgets(keybd, KEYBD_LEN-1, stdin)!=NULL) { // printf("Reading: '%s'\n", keybd); if (g.is_mail) { analyze_mail(keybd); } else { add_str_to_sms(keybd); } } else koniec=1; } break; } // end switch ( select() ) } // end while (!koniec) strcat(message, g.text); // Postprocessing message {{{ switch (id) { #ifdef ENABLE_AZET case AZET: strcat(message, "&oslovenie=Ahoj+Milacik%21+&velkost=420" "&odoslat=Ok&odoslat.x=0&odoslat.y=0"); break; #endif #ifdef ENABLE_WHIZDIARY case WHIZDIARY: strcat(message, "&charsLeft="); strcat(message, "130&theNetwork=NONE&I4.x=0&I4.y=0"); break; #endif #ifdef ENABLE_SPISNET case SPISNET: // "smsn=421903123123&chars=0&smsm=sorry%2C+test&submit=Odoslat+SMS+spr%E1vu" strcat(message, "&submit=Odoslat+SMS+spr%E1vu"); break; #endif #ifdef ENABLE_GLOBTELNET case GLOBTELNET: /* empty */ break; #endif #ifdef ENABLE_MTNSMS case MTNSMS: strcat(message, "&smsSig=0&smsSigDyna=rajo" "&lenSSig=5&lenLSig=5&lenSysSig=11"); /* empty */ break; #endif default: fprintf(stderr, "Somethings go wrong, invalid id in " "postprocessing message!\n"); exit(1); break; } /* end switch (id) */ // }}} Postprocessing message if ( #ifdef DEBUG sendsms(message, debug-1) != 0 #else sendsms(message, 0) != 0 #endif ) { sleep(1); fprintf(stderr, "Zlyhalo posielanie SMSky, " "skusam poslat este raz ...\n"); #ifdef DEBUG sendsms(message, debug-1); #else sendsms(message, 0); #endif } my_free(message); my_free(scratch); my_free(keybd); return 0; } // }}} /* Modeline for ViM {{{1 * vim:set ts=4: * vim600:fdm=marker fdl=0 fdc=3: * }}}1 */