#include #include #include #include #include void setEcho(bool echo); void setBlocking(bool block); bool hasInput(); void clearStdin(); using namespace std; int main(void) { int i; char c; //turn off blocking fcntl(STDIN_FILENO, O_NONBLOCK, O_ASYNC); setBlocking(false); setEcho(false); cout << "set your password: "; cout.flush(); do { if(hasInput()) { c = cin.get(); c++; cout.put(c+1); cout.flush(); } usleep(1000); } while(c!='\n'); setEcho(true); clearStdin(); return 0; } void setEcho(bool echo) { struct termios t; //get the current settings tcgetattr(STDIN_FILENO, &t); //toggle echo if(echo) t.c_lflag = t.c_lflag | ECHO; else t.c_lflag = t.c_lflag & ~ECHO; //set the settings tcsetattr(STDIN_FILENO, TCSANOW, &t); } void setBlocking(bool block) { struct termios t; //get the current settings tcgetattr(STDIN_FILENO, &t); //toggle blocking if(block) t.c_lflag = t.c_lflag | ICANON; else t.c_lflag = t.c_lflag & ~ICANON; //set the settings tcsetattr(STDIN_FILENO, TCSANOW, &t); } bool hasInput() { fd_set fs; timeval tv; int i; //set up the fd set FD_SET(STDIN_FILENO, &fs); //set up the timespec tv.tv_sec = 0; tv.tv_usec = 1; //select i=select(STDIN_FILENO + 1, &fs, NULL, NULL, &tv); //0 no input available //-1 error if(i==0 || i==-1) { return false; } //there is input return true; } void clearStdin() { while(hasInput()) cin.get(); }