blob: b1242112c33ca381ff37bb1e85e19778a4d3ea1a [file] [log] [blame]
/*
* osapi.c
*
* Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/****************************************************************************
*
* MODULE: osapi.c
*
* PURPOSE:
*
* DESCRIPTION:
* ============
* OS Memory API for user mode application (CUDK)
*
****************************************************************************/
/* includes */
/************/
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include "cu_os.h"
#include "cu_osapi.h"
/* defines */
/***********/
#define MAX_HOST_MESSAGE_SIZE 512
S32 ipc_pipe[2];
extern S32 user_main (S32 argc, PPS8 argv);
/**
* \fn main
* \brief Main entry point to a user-mode program
*
* This is the main() function for a user mode program, or the entry point
* called by the OS, This calls an OS-abstracted main function
*
* \param argc - command line argument count
* \param argv - command line arguments
* \return 0 on success, any other value indicates error
* \sa user_main
*/
int main (int argc, char** argv)
{
return user_main (argc, (PPS8)argv);
}
/****************************************************************************************
* os_error_printf()
****************************************************************************************
DESCRIPTION: This function prints a debug message
ARGUMENTS: OsContext - our adapter context.
arg_list - string to output with arguments
RETURN: None
*****************************************************************************************/
VOID os_error_printf(S32 debug_level, const PS8 arg_list ,...)
{
static int g_debug_level = CU_MSG_ERROR; /* TODO ronen: create debug logic for CLI */
S8 msg[MAX_HOST_MESSAGE_SIZE];
va_list ap;
#ifdef OS_CLI_LOG_TO_FILE
char file_name[30]="/cli.log";
FILE *ftmp;
#endif
if (debug_level < g_debug_level)
return;
/* Format the message */
va_start(ap, arg_list);
vsprintf((char *)msg, (char *)arg_list, ap);
va_end(ap);
/* print the message */
fprintf(stderr, (char *)msg);
#ifdef OS_CLI_LOG_TO_FILE
ftmp = fopen(file_name, "a");
if (ftmp != NULL) {
fprintf(ftmp,(char *)msg);
fclose(ftmp);
}
#endif
}
/****************************************************************************************
* os_strcpy()
****************************************************************************************
DESCRIPTION: wrapper to the OS strcpy fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
inline PS8 os_strcpy(PS8 dest, const PS8 src)
{
return (PS8)strcpy((char*)dest, (char*)src);
}
/****************************************************************************************
* os_strncpy()
****************************************************************************************
DESCRIPTION: wrapper to the OS strncpy fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
PS8 os_strncpy(PS8 dest, const PS8 src, S32 n)
{
return (PS8)strncpy((char*)dest, (char*)src, n);
}
/****************************************************************************************
* os_sprintf()
****************************************************************************************
DESCRIPTION: wrapper to the OS sprintf fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
S32 os_sprintf(PS8 str, const PS8 arg_list, ...)
{
va_list ap;
S8 msg[MAX_HOST_MESSAGE_SIZE];
va_start(ap, arg_list);
vsprintf((char*)msg, (char*)arg_list, ap);
va_end(ap);
return sprintf((char*)str, (char*)msg);
}
/****************************************************************************************
* os_Printf()
****************************************************************************************
DESCRIPTION: wrapper to the OS printf fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
S32 os_Printf(const PS8 buffer)
{
return printf((char*)buffer);
}
/****************************************************************************************
* os_strcat()
****************************************************************************************
DESCRIPTION: wrapper to the OS strcat fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
PS8 os_strcat(PS8 dest, const PS8 src)
{
return (PS8)strcat((char*)dest, (char*)src);
}
/****************************************************************************************
* os_strlen()
****************************************************************************************
DESCRIPTION: wrapper to the OS strlen fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
U32 os_strlen(const PS8 s)
{
return strlen((char*)s);
}
/****************************************************************************************
* os_memoryCAlloc()
****************************************************************************************
DESCRIPTION: Allocates an array in memory with elements initialized to 0.
ARGUMENTS: OsContext - our adapter context.
Number - Number of elements
Size - Length in bytes of each element
RETURN: Pointer to the allocated memory.
*****************************************************************************************/
PVOID os_MemoryCAlloc(U32 Number, U32 Size)
{
return calloc(Number, Size);
}
/****************************************************************************************
* os_memoryAlloc()
****************************************************************************************
DESCRIPTION: Allocates resident (nonpaged) system-space memory.
ARGUMENTS: OsContext - our adapter context.
Size - Specifies the size, in bytes, to be allocated.
RETURN: Pointer to the allocated memory.
*****************************************************************************************/
PVOID os_MemoryAlloc(U32 Size)
{
return malloc(Size);
}
/****************************************************************************************
* os_memoryFree()
****************************************************************************************
DESCRIPTION: This function releases a block of memory previously allocated with the
os_memoryAlloc function.
ARGUMENTS: OsContext - our adapter context.
pMemPtr - Pointer to the base virtual address of the allocated memory.
This address was returned by the os_memoryAlloc function.
Size - Redundant, needed only for kernel mode.
RETURN: None
*****************************************************************************************/
VOID os_MemoryFree(PVOID pMemPtr)
{
free(pMemPtr);
}
/****************************************************************************************
* os_memset()
****************************************************************************************
DESCRIPTION: wrapper to the OS memset fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
PVOID os_memset(PVOID s, U8 c, U32 n)
{
return memset(s, c, n);
}
/****************************************************************************************
* os_memcpy()
****************************************************************************************
DESCRIPTION: wrapper to the OS memcpy fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
PVOID os_memcpy(PVOID dest, const PVOID src, U32 n)
{
return memcpy(dest, src, n);
}
/****************************************************************************************
* os_memcmp()
****************************************************************************************
DESCRIPTION: wrapper to the OS memcmp fucntion
ARGUMENTS:
RETURN:
*****************************************************************************************/
S32 os_memcmp(const PVOID s1, const PVOID s2, S32 n)
{
return memcmp(s1, s2, n);
}
/************************************************************************
* os_strcmp *
************************************************************************
DESCRIPTION: wrapper to the OS strcmp fucntion
CONTEXT:
************************************************************************/
S32 os_strcmp(const PS8 s1, const PS8 s2)
{
return strcmp((char*)s1,(char*)s2);
}
/************************************************************************
* os_strncmp *
************************************************************************
DESCRIPTION: wrapper to the OS strcmp fucntion
CONTEXT:
************************************************************************/
S32 os_strncmp(const PS8 s1, const PS8 s2, U32 n)
{
return strncmp((char*)s1,(char*)s2,n);
}
/************************************************************************
* os_sscanf *
************************************************************************
DESCRIPTION: wrapper to the OS sscanf fucntion
CONTEXT:
************************************************************************/
S32 os_sscanf(const PS8 str, const PS8 arg_list, ...)
{
va_list ap;
S8 msg[MAX_HOST_MESSAGE_SIZE];
va_start(ap, arg_list);
vsprintf((char*)msg, (char*)arg_list, ap);
va_end(ap);
return sscanf((char*)str, (char*)msg);
}
/************************************************************************
* os_strchr *
************************************************************************
DESCRIPTION: wrapper to the OS strchr fucntion
CONTEXT:
************************************************************************/
PS8 os_strchr(const PS8 s, S32 c)
{
return (PS8)strchr((char*)s,c);
}
/************************************************************************
* os_strtol *
************************************************************************
DESCRIPTION: wrapper to the OS strtol fucntion
CONTEXT:
************************************************************************/
S32 os_strtol(const PS8 nptr, PPS8 endptr, S32 base)
{
return strtol((char*)nptr, (char**)endptr, base);
}
/************************************************************************
* os_strtoul *
************************************************************************
DESCRIPTION: wrapper to the OS strtoul fucntion
CONTEXT:
************************************************************************/
U32 os_strtoul(const PS8 nptr, PPS8 endptr, S32 base)
{
return strtoul((char*)nptr, (char**)endptr, base);
}
/************************************************************************
* os_tolower *
************************************************************************
DESCRIPTION: wrapper to the OS tolower fucntion
CONTEXT:
************************************************************************/
S32 os_tolower(S32 c)
{
return tolower(c);
}
/************************************************************************
* os_tolower *
************************************************************************
DESCRIPTION: wrapper to the OS tolower fucntion
CONTEXT:
************************************************************************/
S32 os_isupper(S32 c)
{
return isupper(c);
}
/************************************************************************
* os_tolower *
************************************************************************
DESCRIPTION: wrapper to the OS tolower fucntion
CONTEXT:
************************************************************************/
S32 os_toupper(S32 c)
{
return toupper(c);
}
/************************************************************************
* os_atoi *
************************************************************************
DESCRIPTION: wrapper to the OS atoi fucntion
CONTEXT:
************************************************************************/
S32 os_atoi(const PS8 str)
{
return (S32)atoi(str);
}
/************************************************************************
* os_fopen *
************************************************************************
DESCRIPTION: wrapper to the OS fopen fucntion
CONTEXT:
************************************************************************/
PVOID os_fopen(const PS8 path, os_fopen_mode_e mode)
{
switch(mode)
{
case OS_FOPEN_READ:
return fopen((char*)path, "r");
case OS_FOPEN_READ_BINARY:
return fopen((char*)path, "rb");
case OS_FOPEN_WRITE:
return fopen(path, "w");
case OS_FOPEN_WRITE_BINARY:
return fopen(path, "wb");
default:
return NULL;
}
}
/************************************************************************
* os_getFileSize *
************************************************************************
DESCRIPTION: wrapper to the OS fopen fucntion
CONTEXT:
************************************************************************/
S32 os_getFileSize (PVOID file)
{
S32 size;
if (fseek(file, 0, SEEK_END))
{
os_error_printf (CU_MSG_ERROR, (PS8)"Cannot seek file to end\n");
return -1;
}
size = ftell(file);
rewind(file);
return size;
}
/************************************************************************
* os_fgets *
************************************************************************
DESCRIPTION: wrapper to the OS fgets fucntion
CONTEXT:
************************************************************************/
inline PS8 os_fgets(PS8 s, S32 size, PVOID stream)
{
return (PS8)fgets((char*)s, size, stream);
}
/************************************************************************
* os_fread *
************************************************************************
DESCRIPTION: wrapper to the OS fread fucntion
CONTEXT:
************************************************************************/
inline S32 os_fread (PVOID ptr, S32 size, S32 nmemb, PVOID stream)
{
return fread (ptr, size, nmemb, stream);
}
/************************************************************************
* os_fwrite *
************************************************************************
DESCRIPTION: wrapper to the OS fwrite fucntion
CONTEXT:
************************************************************************/
S32 os_fwrite (PVOID ptr, S32 size, S32 nmemb, PVOID stream)
{
return fwrite (ptr, size, nmemb, stream);
}
/************************************************************************
* os_fclose *
************************************************************************
DESCRIPTION: wrapper to the OS fclose fucntion
CONTEXT:
************************************************************************/
inline S32 os_fclose(PVOID stream)
{
return fclose(stream);
}
/************************************************************************
* os_getInputString *
************************************************************************
DESCRIPTION: get the input string for the console from the appropiate inputs
CONTEXT:
************************************************************************/
S32 os_getInputString(PS8 inbuf, S32 len)
{
fd_set read_set;
S32 max_fd_index;
S32 result;
S32 pid;
/*
* Wait for one of two external events:
* -----------------------------------
*
* 1. Data received from STDIN
* 2. Data received from the event process
*/
/* Prepare the read set fields */
FD_ZERO(&read_set);
FD_SET(0, &read_set);
FD_SET(ipc_pipe[0], &read_set);
/* Determine the maximum index of the file descriptor */
max_fd_index = max(0, ipc_pipe[0]) + 1;
/* Wait for event - blocking */
result = select(max_fd_index, &read_set, NULL, NULL, NULL);
if (result > 0)
{
if (FD_ISSET(0, &read_set))
{
/* Data received from STDIN */
if ( fgets( (char*)inbuf, len, stdin ) == NULL )
return FALSE;
else
return TRUE;
}
if (FD_ISSET(ipc_pipe[0], &read_set))
{
/**********************************/
/* Data received from TCP client */
/********************************/
result = read(ipc_pipe[0], inbuf, len);
/* Get the pid of the calling process */
pid = *(inbuf + 0) | (*(inbuf + 1) << 8);
/*
Signal the calling process (tell him that we have
received the command, and he can send us another one
*/
if (pid != 0xFFFF)
{
kill(pid, SIGUSR1);
}
if ( result <= 0 )
return FALSE;
else
return TRUE;
}
}
/* Error */
os_error_printf(CU_MSG_ERROR, (PS8)"Input selection mismatch (0x%x)...\n", read_set);
return FALSE;
}
/************************************************************************
* os_Catch_CtrlC_Signal *
************************************************************************
DESCRIPTION: register to catch the Ctrl+C signal
CONTEXT:
************************************************************************/
VOID os_Catch_CtrlC_Signal(PVOID SignalCB)
{
if(signal(SIGINT, SignalCB) == SIG_ERR)
os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - os_Catch_CtrlC_Signal - cant catch Ctrl+C signal\n");
}
VOID os_OsSpecificCmdParams(S32 argc, PS8* argv)
{
}
VOID os_InitOsSpecificModules(VOID)
{
}
VOID os_DeInitOsSpecificModules(VOID)
{
}
TI_SIZE_T os_get_last_error()
{
return errno;
}