From: Theodore Ts'o Date: Sun, 13 Jul 2008 20:17:57 +0000 (-0400) Subject: badblocks: If nanosleep() does not exist, try using usleep() instead X-Git-Tag: v1.41.1~129 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c13ab4fa7aa2ddd3daa66c353ad41422265de9c3;p=thirdparty%2Fe2fsprogs.git badblocks: If nanosleep() does not exist, try using usleep() instead For portability on systems that don't have nanosleep(). Signed-off-by: "Theodore Ts'o" --- diff --git a/configure b/configure index 0b7a05eed..41f4f4bfd 100755 --- a/configure +++ b/configure @@ -14883,7 +14883,9 @@ fi -for ac_func in chflags getrusage llseek lseek64 open64 fstat64 ftruncate64 getmntinfo strtoull strcasecmp srandom jrand48 fchown mallinfo fdatasync strnlen strptime strdup sysconf pathconf posix_memalign memalign valloc __secure_getenv prctl mmap utime setresuid setresgid + + +for ac_func in chflags getrusage llseek lseek64 open64 fstat64 ftruncate64 getmntinfo strtoull strcasecmp srandom jrand48 fchown mallinfo fdatasync strnlen strptime strdup sysconf pathconf posix_memalign memalign valloc __secure_getenv prctl mmap utime setresuid setresgid usleep nanosleep do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 diff --git a/configure.in b/configure.in index 4d84eeb95..c29f43899 100644 --- a/configure.in +++ b/configure.in @@ -741,7 +741,7 @@ AC_CHECK_MEMBER(struct sockaddr.sa_len, [#include #include ]) dnl -AC_CHECK_FUNCS(chflags getrusage llseek lseek64 open64 fstat64 ftruncate64 getmntinfo strtoull strcasecmp srandom jrand48 fchown mallinfo fdatasync strnlen strptime strdup sysconf pathconf posix_memalign memalign valloc __secure_getenv prctl mmap utime setresuid setresgid) +AC_CHECK_FUNCS(chflags getrusage llseek lseek64 open64 fstat64 ftruncate64 getmntinfo strtoull strcasecmp srandom jrand48 fchown mallinfo fdatasync strnlen strptime strdup sysconf pathconf posix_memalign memalign valloc __secure_getenv prctl mmap utime setresuid setresgid usleep nanosleep) dnl dnl Check to see if -lsocket is required (solaris) to make something dnl that uses socket() to compile; this is needed for the UUID library diff --git a/misc/badblocks.c b/misc/badblocks.c index 9a4c36291..946c839f0 100644 --- a/misc/badblocks.c +++ b/misc/badblocks.c @@ -297,6 +297,7 @@ static int do_read (int dev, unsigned char * buffer, int try, int block_size, fprintf(stderr, _("Weird value (%ld) in do_read\n"), got); got /= block_size; if (d_flag && got == try) { +#ifdef HAVE_NANOSLEEP struct timespec ts; ts.tv_sec = tv2.tv_sec - tv1.tv_sec; ts.tv_nsec = (tv2.tv_usec - tv1.tv_usec) * MILISEC; @@ -313,6 +314,23 @@ static int do_read (int dev, unsigned char * buffer, int try, int block_size, } if (ts.tv_sec || ts.tv_nsec) nanosleep(&ts, NULL); +#else +#ifdef HAVE_USLEEP + struct timeval tv; + tv.tv_sec = tv2.tv_sec - tv1.tv_sec; + tv.tv_usec = tv2.tv_usec - tv1.tv_usec; + tv.tv_sec = tv.tv_sec * d_flag / 100; + tv.tv_usec = tv.tv_usec * d_flag / 100; + if (tv.tv_usec > 1000000) { + tv.tv_sec += tv.tv_usec / 1000000; + tv.tv_usec %= 1000000; + } + if (tv.tv_sec) + sleep(tv.tv_sec); + if (tv.tv_usec) + usleep(tv.tv_usec); +#endif +#endif } return got; }