void Fd::Close() { if(!IsAcquired()) throw std::logic_error("IsAcquired() (Fd::Close())"); if(close(TheFd) != 0) throw ErrnoException(errno, "Fd::Close()"); TheFd = -1; }
static void removeIPCAccessControlFile(const std::string& path, const std::string& name, bool is_group) { IPCServer::checkAccessControlName(name); const std::string basename = getIPCAccessControlFileBasename(name, is_group); const std::string separator = (path.at(path.size() - 1) == '/' ? "" : "/"); const std::string filepath = path + separator + basename; if (unlink(filepath.c_str()) != 0) { throw ErrnoException("removeIPCAccessControlFile", filepath, errno); } }
///////////////////////////////////////////////////////////////////////////// /// intialise void DeviceMonitor::Init( const LedControlPtr& leds ) { leds_ = leds; // get udev library context dev_context_ = udev_new(); if ( !dev_context_ ) throw ErrnoException( "udev_new" ); // set up udev monitor dev_monitor_ = udev_monitor_new_from_netlink( dev_context_, "udev" ); if ( !dev_monitor_ ) throw ErrnoException( "udev_monitor_new_from_netlink" ); // only interested in scsi devices if ( udev_monitor_filter_add_match_subsystem_devtype( dev_monitor_, "scsi", "scsi_device" ) ) { throw ErrnoException( "udev_monitor_filter_add_match_subsystem_devtype" ); } // enumerate existing devices enumDevices_( ); // then start monitoring if ( udev_monitor_enable_receiving( dev_monitor_ ) ) { throw ErrnoException( "udev_monitor_enable_receiving" ); } }
static void createIPCAccessControlFile(const std::string& path, const std::string& name, bool is_group, const IPCServer::AccessControl& access_control) { IPCServer::checkAccessControlName(name); const std::string basename = getIPCAccessControlFileBasename(name, is_group); const std::string separator = (path.at(path.size() - 1) == '/' ? "" : "/"); const std::string filepath = path + separator + basename; /* * Ensure that only the owner can read/write the file. */ umask(0177); std::ofstream access_control_stream(filepath); if (!access_control_stream.good()) { throw ErrnoException("createIPCAccessControlFile", filepath, errno); } access_control.save(access_control_stream); return; }
int Quorum::getFd() { int fd = cman_get_fd(cman); if (fd == 0) throw ErrnoException("Can't get cman file descriptor"); return fd; }
///////////////////////////////////////////////////////////////////////////// /// main looop void DeviceMonitor::Main( ) { assert( dev_monitor_ ); const int fd_mon = udev_monitor_get_fd( dev_monitor_ ); const int nfds = fd_mon + 1; int queue_tok = 8; sigset_t sigempty; sigemptyset( &sigempty ); struct timespec timeout; if( activity ) { timeout.tv_sec = 0; //timeout.tv_sec = 1; timeout.tv_nsec = 100000000; //timeout.tv_nsec = 0; } else { timeout.tv_sec = 999; timeout.tv_nsec = 0; } while ( true ) { fd_set fds_read; FD_ZERO( &fds_read ); FD_SET( fd_mon, &fds_read ); // block for something interesting to happen int res = pselect( nfds, &fds_read, 0, 0, &timeout, &sigempty ); if ( res < 0 ) { if ( EINTR != errno ) throw ErrnoException( "select" ); std::cout << "Exiting on signal\n"; return; // signalled } // udev monitor notification? if ( FD_ISSET( fd_mon, &fds_read ) ) { std::tr1::shared_ptr< udev_device > device( udev_monitor_receive_device( dev_monitor_ ), &udev_device_unref ); // make sure this is a device we want to monitor if (!acceptDevice_(device.get())) continue; const char* str = udev_device_get_action( device.get() ); if ( !str ) { } else if ( 0 == strcasecmp( str, "add" ) ) { deviceAdded_( device.get() ); } else if ( 0 == strcasecmp( str, "remove" ) ) { deviceRemove_( device.get() ); } else { if ( debug ) { std::cout << "action: " << str << '\n'; std::cout << ' ' << udev_device_get_syspath(device.get()) << "' (" << udev_device_get_subsystem(device.get()) << ")\n"; } } } if( activity ) { for( int i = 0; i < num_disks_; ++i ) { std::ifstream stats; stats.open( statsFile(i).c_str() ); char buf[256]; stats.getline( &(buf[0]), 255 ); std::string s(&(buf[0])); // tokenize the string std::string::size_type last = s.find_first_not_of( " ", 0 ); std::string::size_type pos = s.find_first_of( " ", last ); int tok = 0; int queue_length = 0; while( std::string::npos != pos || std::string::npos != last ) { last = s.find_first_not_of(" ", pos ); pos = s.find_first_of( " ", last ); ++tok; if( tok == queue_tok ) { queue_length = atoi(s.substr( last, pos - last ).c_str()); if( debug ) std::cout << " " << i << " " << queue_length; break; } } int led_idx = ledIndex(i); if( led_enabled_[led_idx] && leds_ ) { if( queue_length > 0 ) { leds_->Set( LED_BLUE, led_idx, true ); leds_->Set( LED_RED, led_idx, true ); } else { leds_->Set( LED_BLUE, led_idx, true ); leds_->Set( LED_RED, led_idx, false ); } } } } if( debug ) std::cout << "\n"; } }