CKMod.cpp revision 4e9e8c9c0169b40318386436d762c3d73cf4c328
14e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @addtogroup MCD_MCDIMPL_DAEMON_KERNEL 24e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @{ 34e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @file 44e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 54e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Kernel Module Interface. 64e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 74e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 --> 84e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 94e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Redistribution and use in source and binary forms, with or without 104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * modification, are permitted provided that the following conditions 114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * are met: 124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 1. Redistributions of source code must retain the above copyright 134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer. 144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 2. Redistributions in binary form must reproduce the above copyright 154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer in the 164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * documentation and/or other materials provided with the distribution. 174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 3. The name of the author may not be used to endorse or promote 184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * products derived from this software without specific prior 194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * written permission. 204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */ 334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <cstdlib> 344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <fcntl.h> 364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <sys/mman.h> 374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <errno.h> 384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CKMod.h" 404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define LOG_TAG "McDaemon" 424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "log.h" 434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin ParkCKMod::CKMod( 474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park fdKMod = ERROR_KMOD_NOT_OPEN; 504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin ParkCKMod::~CKMod( 554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park close(); 584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkbool CKMod::isOpen( 634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return (ERROR_KMOD_NOT_OPEN == fdKMod) ? false : true; 664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkbool CKMod::open( 714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park const char *deviceName 724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park bool ret = true; 744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 754e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (isOpen()) 784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_W("already open"); 804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = false; 814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // open return -1 on error, "errno" is set with details 854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int openRet = ::open(deviceName, O_RDWR); 864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (-1 == openRet) 874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("open failed with errno: %d", errno); 894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = false; 904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park fdKMod = openRet; 944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while(0); 964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 974e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 1024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkvoid CKMod::close( 1034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 1044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 1054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (isOpen()) 1064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (0 != ::close(fdKMod)) 1084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("close failed with errno: %d", errno); 1104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park else 1124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park fdKMod = ERROR_KMOD_NOT_OPEN; 1144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park else 1174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_W("not open"); 1194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 1214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */ 123