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