X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/713045f81987cf7ac746561b09e607028204bb6c..refs/pull/278/head:/client/util.c diff --git a/client/util.c b/client/util.c index 60054b94..5c2579b1 100644 --- a/client/util.c +++ b/client/util.c @@ -8,14 +8,26 @@ // utilities //----------------------------------------------------------------------------- -#include <ctype.h> +#if !defined(_WIN32) +#define _POSIX_C_SOURCE 199309L // need nanosleep() +#endif + #include "util.h" + +#include <stdint.h> +#include <string.h> +#include <ctype.h> +#include <stdlib.h> +#include <stdio.h> +#include <time.h> +#include "data.h" + #define MAX_BIN_BREAK_LENGTH (3072+384+1) #ifndef _WIN32 #include <termios.h> #include <sys/ioctl.h> - +#include <unistd.h> int ukbhit(void) { @@ -23,25 +35,25 @@ int ukbhit(void) int error; static struct termios Otty, Ntty; - - if ( tcgetattr( 0, &Otty) == -1 ) return -1; + if ( tcgetattr(STDIN_FILENO, &Otty) == -1 ) return -1; Ntty = Otty; - Ntty.c_iflag = 0; /* input mode */ - Ntty.c_oflag = 0; /* output mode */ - Ntty.c_lflag &= ~ICANON; /* raw mode */ - Ntty.c_cc[VMIN] = CMIN; /* minimum time to wait */ - Ntty.c_cc[VTIME] = CTIME; /* minimum characters to wait for */ - - if (0 == (error = tcsetattr(0, TCSANOW, &Ntty))) { - error += ioctl(0, FIONREAD, &cnt); - error += tcsetattr(0, TCSANOW, &Otty); + Ntty.c_iflag = 0x0000; // input mode + Ntty.c_oflag = 0x0000; // output mode + Ntty.c_lflag &= ~ICANON; // control mode = raw + Ntty.c_cc[VMIN] = 1; // return if at least 1 character is in the queue + Ntty.c_cc[VTIME] = 0; // no timeout. Wait forever + + if (0 == (error = tcsetattr(STDIN_FILENO, TCSANOW, &Ntty))) { // set new attributes + error += ioctl(STDIN_FILENO, FIONREAD, &cnt); // get number of characters availabe + error += tcsetattr(STDIN_FILENO, TCSANOW, &Otty); // reset attributes } return ( error == 0 ? cnt : -1 ); } #else + #include <conio.h> int ukbhit(void) { return kbhit(); @@ -157,12 +169,12 @@ char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t brea size_t in_index = 0; // loop through the out_index to make sure we don't go too far - for (size_t out_index=0; out_index < max_len-1; out_index++) { + for (size_t out_index=0; out_index < max_len; out_index++) { // set character - (should be binary but verify it isn't more than 1 digit) if (data[in_index]<10) sprintf(tmp++, "%u", (unsigned int) data[in_index]); // check if a line break is needed and we have room to print it in our array - if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) { + if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 < max_len) ) { // increment and print line break out_index++; sprintf(tmp++, "%s","\n"); @@ -600,3 +612,47 @@ void clean_ascii(unsigned char *buf, size_t len) { buf[i] = '.'; } } + + +// Timer functions +#if !defined (_WIN32) +#include <errno.h> + +static void nsleep(uint64_t n) { + struct timespec timeout; + timeout.tv_sec = n/1000000000; + timeout.tv_nsec = n%1000000000; + while (nanosleep(&timeout, &timeout) && errno == EINTR); +} + +void msleep(uint32_t n) { + nsleep(1000000 * n); +} + +#endif // _WIN32 + +// a milliseconds timer for performance measurement +uint64_t msclock() { +#if defined(_WIN32) + #include <sys/types.h> + + // WORKAROUND FOR MinGW (some versions - use if normal code does not compile) + // It has no _ftime_s and needs explicit inclusion of timeb.h + #include <sys/timeb.h> + struct _timeb t; + _ftime(&t); + return 1000 * t.time + t.millitm; + + // NORMAL CODE (use _ftime_s) + //struct _timeb t; + //if (_ftime_s(&t)) { + // return 0; + //} else { + // return 1000 * t.time + t.millitm; + //} +#else + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + return (t.tv_sec * 1000 + t.tv_nsec / 1000000); +#endif +}