#include #include #include #include #include #include #include char buf[65536]; void sendCmd(int fd, char *cmd) { char temp[65536]; memcpy(temp, cmd, strlen(cmd) - 1); temp[strlen(cmd)-1] = 0; //printf("send: %s\n", temp); if(write(fd, cmd, strlen(cmd)) == -1) { fprintf(stderr, "Shit. %s\n", strerror(errno)); exit(1); } } void recvResp(int fd) { int ret; ret = read(fd, buf, 65535); if(ret == -1) { fprintf(stderr, "Shit. %s\n", strerror(errno)); exit(1); } if(ret > 1 && (buf[ret - 1] == '\r' || buf[ret - 2] == '\n')) --ret; if(ret > 1 && (buf[ret - 1] == '\r' || buf[ret - 2] == '\n')) --ret; buf[ret] = 0; if(buf[0] == '\n' || buf[0] == '\r') return recvResp(fd); //printf("recv: %s\n", buf); } struct termios term; int initConn(int speed) { int fd = open("/dev/tty.baseband", O_RDWR | 0x20000 | O_NOCTTY); unsigned int blahnull = 0; unsigned int handshake = TIOCM_DTR | TIOCM_RTS | TIOCM_CTS | TIOCM_DSR; if(fd == -1) { fprintf(stderr, "%i(%s)\n", errno, strerror(errno)); exit(1); } ioctl(fd, 0x2000740D); fcntl(fd, 4, 0); tcgetattr(fd, &term); ioctl(fd, 0x8004540A, &blahnull); cfsetspeed(&term, speed); cfmakeraw(&term); term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 2; term.c_cc[VEOL] = '\r'; term.c_iflag = (term.c_iflag & 0xFFFFF0CD) | 5; term.c_oflag = term.c_oflag & 0xFFFFFFFE; term.c_cflag = (term.c_cflag & 0xFFFC6CFF) | 0x3CB00; term.c_lflag = term.c_lflag & 0xFFFFFA77; term.c_cflag = (term.c_cflag & ~CSIZE) | CS8; term.c_cflag &= ~PARENB; term.c_lflag |= ICANON; term.c_lflag &= ~ECHO; tcsetattr(fd, TCSANOW, &term); ioctl(fd, TIOCSDTR); ioctl(fd, TIOCCDTR); ioctl(fd, TIOCMSET, &handshake); sendCmd(fd, "at\r"); recvResp(fd); if(buf[0] != '0') { recvResp(fd); sendCmd(fd, "atv0\r"); recvResp(fd); recvResp(fd); sendCmd(fd, "atE0\r"); recvResp(fd); recvResp(fd); } } int main(int argc, char **argv) { int fd; unsigned int ctr; char brutebuf[28] = "AT+CLCK=\"PN\",0,\"00000000\"\r"; time_t start, end; int kps, foo; int days, hours, secs, mins; fd = initConn(atoi(argv[2])); if(argc > 3) { sprintf(buf, "at+ipr=%s\r", argv[3]); sendCmd(fd, buf); cfsetspeed(&term, atoi(argv[3])); tcsetattr(fd, TCSANOW, &term); recvResp(fd); return 1; } start = time(0); for(ctr = atoi(argv[1]); ctr < 100000000; ++ctr) { if((ctr % 1000) == 0 && ctr != 0) { end = time(0); kps = 1000 / (unsigned int) difftime(end, start); foo = (99999999 - ctr) / kps; secs = foo % 60; mins = (foo / 60) % 60; hours = (foo / 60 / 60) % 24; days = foo / 60 / 60 / 24; fprintf( stderr, "%08u -- %i kps. Time to completion: %i:%02i:%02i:%02i\n", ctr, kps, days, hours, mins, secs ); start = end; } sprintf(brutebuf + 16, "%08u\"\r", ctr); sendCmd(fd, brutebuf); recvResp(fd); if(buf[0] != '4') fprintf(stderr, "Last command: %s\nRecv: %s\n", brutebuf, buf, buf[0]); } close(fd); }