>From dfb317fc2a8456f2d6dbf1793301a32161daccbc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?=
Date: Tue, 28 Oct 2014 15:27:22 +0100
Subject: [PATCH] Add device name detection on Haiku
Move the default implementation and declaration of device_id()
to ddrescue.h to avoid redeclaring it.
Also drop linux.h since it's then useless.
---
Makefile.in | 7 ++++---
extra.h | 23 +++++++++++++++++++++++
haiku.cc | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
linux.cc | 6 +-----
linux.h | 18 ------------------
main.cc | 2 +-
6 files changed, 81 insertions(+), 27 deletions(-)
create mode 100644 extra.h
create mode 100644 haiku.cc
delete mode 100644 linux.h
diff --git a/Makefile.in b/Makefile.in
index de0c787..86ac8b5 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -7,7 +7,7 @@ INSTALL_DIR = $(INSTALL) -d -m 755
SHELL = /bin/sh
ddobjs = fillbook.o genbook.o io.o logbook.o rescuebook.o main.o
-objs = arg_parser.o block.o linux.o logfile.o loggers.o rational.o $(ddobjs)
+objs = arg_parser.o block.o haiku.o linux.o logfile.o loggers.o rational.o $(ddobjs)
logobjs = arg_parser.o block.o logbook.o logfile.o ddrescuelog.o
@@ -42,13 +42,14 @@ $(objs) : Makefile
$(ddobjs) : block.h ddrescue.h
arg_parser.o : arg_parser.h
block.o : block.h
+haiku.o : ddrescue.h
io.o : loggers.h
-linux.o : linux.h
+linux.o : ddrescue.h
logfile.o : block.h
loggers.o : block.h loggers.h
rational.o : rational.h
rescuebook.o : loggers.h
-main.o : arg_parser.h rational.h linux.h loggers.h main_common.cc
+main.o : arg_parser.h rational.h loggers.h main_common.cc
ddrescuelog.o : Makefile arg_parser.h block.h ddrescue.h main_common.cc
diff --git a/extra.h b/extra.h
new file mode 100644
index 0000000..a013c38
--- /dev/null
+++ b/extra.h
@@ -0,0 +1,23 @@
+/* GNU ddrescue - Data recovery tool
+ Copyright (C) 2014 Antonio Diaz Diaz.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+// Extra features, default implementations
+#if !defined USE_LINUX && !defined __HAIKU__
+inline const char * device_id( const int ) { return 0; }
+#else
+const char * device_id( const int );
+#endif
diff --git a/haiku.cc b/haiku.cc
new file mode 100644
index 0000000..8d9a8be
--- /dev/null
+++ b/haiku.cc
@@ -0,0 +1,52 @@
+/* GNU ddrescue - Data recovery tool
+ Copyright (C) 2014 Antonio Diaz Diaz.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#include "extra.h"
+
+#ifdef __HAIKU__
+#include
+#include
+#include
+#include
+
+
+void sanitize_string( std::string & str )
+ {
+ for( unsigned i = str.size(); i > 0; --i ) // remove non-printable chars
+ {
+ const unsigned char ch = str[i-1];
+ if( std::isspace( ch ) ) str[i-1] = ' ';
+ else if( ch < 32 || ch > 126 ) str.erase( i - 1, 1 );
+ }
+ for( unsigned i = str.size(); i > 0; --i ) // remove duplicate spaces
+ if( str[i-1] == ' ' && ( i <= 1 || i >= str.size() || str[i-2] == ' ' ) )
+ str.erase( i - 1, 1 );
+ }
+
+const char * device_id( const int fd )
+ {
+ static std::string id_str;
+ char id[256];
+
+ if( ioctl( fd, B_GET_DEVICE_NAME, &id, sizeof(id) ) != 0 ) return 0;
+ id_str = (const char *)id;
+ // XXX: is it needed anyway?
+ sanitize_string( id_str );
+ return id_str.c_str();
+ }
+
+#endif
diff --git a/linux.cc b/linux.cc
index c1021b5..eaa1779 100644
--- a/linux.cc
+++ b/linux.cc
@@ -17,7 +17,7 @@
#define _FILE_OFFSET_BITS 64
-#include "linux.h"
+#include "extra.h"
#ifdef USE_LINUX
#include
@@ -53,8 +53,4 @@ const char * device_id( const int fd )
return 0;
}
-#else
-
-const char * device_id( const int ) { return 0; }
-
#endif
diff --git a/linux.h b/linux.h
deleted file mode 100644
index 750bf4c..0000000
--- a/linux.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* GNU ddrescue - Data recovery tool
- Copyright (C) 2014 Antonio Diaz Diaz.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-const char * device_id( const int fd );
diff --git a/main.cc b/main.cc
index 2f5fb8b..1741bdb 100644
--- a/main.cc
+++ b/main.cc
@@ -42,7 +42,7 @@
#include "rational.h"
#include "block.h"
#include "ddrescue.h"
-#include "linux.h"
+#include "extra.h"
#include "loggers.h"
#ifndef O_BINARY
--
1.8.3.4