libzypp  17.31.31
cdtools.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
9 
10 #include "cdtools.h"
11 
12 extern "C"
13 {
14 #include <sys/ioctl.h>
15 #include <linux/cdrom.h>
16 }
17 
18 #include <fcntl.h>
19 #include <unistd.h>
20 #include <zypp-core/base/LogControl.h>
21 #include <zypp-core/ExternalProgram.h>
22 
23 
24 /*
25 ** If defined to the full path of the eject utility,
26 ** it will be used additionally to the eject-ioctl.
27 */
28 #define EJECT_TOOL_PATH "/bin/eject"
29 
30 
31 namespace zypp::media {
32 
33  bool CDTools::openTray(const std::string &device_r)
34  {
35  int fd = ::open( device_r.c_str(), O_RDONLY|O_NONBLOCK|O_CLOEXEC );
36  int res = -1;
37 
38  if ( fd != -1)
39  {
40  res = ::ioctl( fd, CDROMEJECT );
41  ::close( fd );
42  }
43 
44  if ( res )
45  {
46  if( fd == -1)
47  {
48  WAR << "Unable to open '" << device_r
49  << "' (" << ::strerror( errno ) << ")" << std::endl;
50  }
51  else
52  {
53  WAR << "Eject " << device_r
54  << " failed (" << ::strerror( errno ) << ")" << std::endl;
55  }
56 
57 #if defined(EJECT_TOOL_PATH)
58  DBG << "Try to eject " << device_r << " using "
59  << EJECT_TOOL_PATH << " utility" << std::endl;
60 
61  const char *cmd[3];
62  cmd[0] = EJECT_TOOL_PATH;
63  cmd[1] = device_r.c_str();
64  cmd[2] = NULL;
66 
67  for(std::string out( eject.receiveLine());
68  out.length(); out = eject.receiveLine())
69  {
70  DBG << " " << out;
71  }
72 
73  if(eject.close() != 0)
74  {
75  WAR << "Eject of " << device_r << " failed." << std::endl;
76  return false;
77  }
78 #else
79  return false;
80 #endif
81  }
82  MIL << "Eject of " << device_r << " successful." << std::endl;
83  return true;
84  }
85 
86  bool CDTools::closeTray(const std::string &device_r)
87  {
88  int fd = ::open( device_r.c_str(), O_RDONLY|O_NONBLOCK|O_CLOEXEC );
89  if ( fd == -1 ) {
90  WAR << "Unable to open '" << device_r << "' (" << ::strerror( errno ) << ")" << std::endl;
91  return false;
92  }
93  int res = ::ioctl( fd, CDROMCLOSETRAY );
94  ::close( fd );
95  if ( res ) {
96  WAR << "Close tray " << device_r << " failed (" << ::strerror( errno ) << ")" << std::endl;
97  return false;
98  }
99  DBG << "Close tray " << device_r << std::endl;
100  return true;
101  }
102 
103 }
#define MIL
Definition: Logger.h:96
std::string receiveLine()
Read one line from the input stream.
#define EJECT_TOOL_PATH
Definition: cdtools.cc:28
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
#define WAR
Definition: Logger.h:97
int close()
Wait for the progamm to complete.
static bool closeTray(const std::string &device_r)
Definition: cdtools.cc:86
static bool openTray(const std::string &device_r)
Definition: cdtools.cc:33
std::string strerror(int errno_r)
Return string describing the error_r code.
Definition: String.cc:53
#define DBG
Definition: Logger.h:95