/* This is a program for sending SMS messages to Rogers/AT&T cellphones. Compilation: On Linux/BSD: gcc -o rogsms rogsms.c On SunOS/Solaris: gcc -o rogsms rogsms.c -lsocket -lnsl Usage: rogsms "" Authors: fractal@efnet slik_@efnet syke@efnet This program is Copyright 2003 by HardCore Software, and its distribution is protected by the GNU General Public License. See www.gnu.org for details. */ #include #include #include #include #include #include #include #include #include #define VERSION "1.1" // You may have to change the following parameter if rogers changes the IP the use // for sending messages. You can find it by sending a message at // http://www.rogers.com/english/wireless/sendpcs.html and looking at the // address bar #define HOST "216.129.53.44" #define PORT 8080 char seg1[] = "POST /cgi-bin/send_sm_rogers.new HTTP/1.0\r\nHost: "; char seg2[] = ":"; char seg3[] = "\r\nReferer: http://www.rogers.com/english/wireless/sendpcs.html\r\nContent-type: application/x-www-form-urlencoded\r\nContent-length: "; char seg4[] = "\r\n\r\n"; char seg5[] = "msisdn="; char seg6[] = "&area="; char seg7[] = "&num1="; char seg8[] = "&num2="; char seg9[] = "&oldtext="; char seg10[] = "&text="; char seg11[] = "&SIZEBOX="; char seg12[] = "&sm_title=Rogers+%7C+Wireless&sm_header_ok=Thank+You&sm_header_fail=Sorry&sm_ym=Your+Message%3A+&sm_status_ok=has+been+sent+to%3A&sm_status_fail=cannot+presently+be+sent+to%3A+&sm_logo=%2Fatt-logo.gif&sm_pcs_link=http%3A%2F%2Fwww.rogers.com%2Fenglish%2Fwireless%2Fsendpcs.html&sm_pcs_text=Send+a+PCS+message&sm_home_link=http%3A%2F%2Fwww.rogers.com&sm_home_text=home"; int openconnection(char *toconn, int port) { struct hostent *he; struct sockaddr_in their_addr; /* connector's address information */ int sd; if ((he=gethostbyname(toconn)) == NULL) { /* get the host info */ return -1; } if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { return -1; } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(port); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero),'\0',8); /* zero rest of struct */ if (connect(sd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { return -1; } return sd; } int verifyname(char *s) { int i; if (strlen(s) > 11) return 0; for (i=strlen(s)-1; i>0; i--) if (!isdigit(s[i]) && !isalpha(s[i])) return 0; return 1; } int verifynumber(char *s) { int i; if (strlen(s) != 10) return 0; for (i=0; i<10; i++) if (!isdigit(s[i])) return 0; return 1; } void encodemessage(char *src, char *name, char *dst, int len) { int i=0; len-=5; memset(dst, '\0', len); snprintf(dst,len,"%s%%3A+",name); i = strlen(dst); dst+=i; while(i \"\"\n\n"); exit(0); } int numofdigits(int s) { char tp[20]; snprintf(tp, sizeof(tp), "%d", s); return strlen(tp); } /* argv[1] = phone number argv[2] = name argv[3] = message */ int main (int argc, char *argv[]) { char buf[10500], message[10000]; int clen=0,mlen=0; /* Check number of args... */ if (argc != 4) usage(); /* Check for valid phone number */ if (verifynumber(argv[1]) == 0) { printf("* INVALID PHONE NUMBER!\n\n"); usage(); } /* Check for valid sender name */ if (verifyname(argv[2]) == 0) { printf("* INVALID NAME!\n\n"); usage(); } /* Encode message */ encodemessage(argv[3], argv[2], message, sizeof(message)); /* Count the number of chars */ mlen = strlen(argv[3]); clen = (2*strlen(message)) /* Length of message, twice */ + 20 /* 2 phone numbers */ + numofdigits(mlen) /* SIZEBOX field */ + strlen(seg5) + strlen(seg6) + strlen(seg7) + strlen(seg8) + strlen(seg9) + strlen(seg10) + strlen(seg11) + strlen(seg12); /* All the other bits */ /* Build the request */ snprintf(buf, sizeof(buf), "%s%s%s%d%s%d%s%s%s%s%.3s%s%.3s%s%s%s%s%s%s%s%d%s",seg1,HOST,seg2,PORT,seg3,clen,seg4,seg5,argv[1],seg6,argv[1],seg7,argv[1]+3,seg8,argv[1]+6,seg9,message,seg10,message,seg11,mlen,seg12); /* Send it! */ printf("Sending request...\n"); sendrequest(buf); printf("Sent.\n"); /* And we're done! */ return 0; }