Utility API

Oasis에서 쓰이는 유용한 함수들입니다.

헤더 파일

OasisNet.h
OasisUtil.h

네트워크

int32_t get_netif_list ( char ifnames[][IFNAMSIZ] , int32_t ifnames_size , uint32_t flags = 0 )
OasisNet.h
기기에 설치된 네트워크 인터페이스 이름 목록을 얻습니다.
매개변수
ifnames[][IFNAMSIZ]  OUT 네트워크 인터페이스 이름 목록을 리턴합니다.
ifnames_size  네트워크 인터페이스 이름 목록 최대 크기입니다.
flags  검색 시 적용 될 플래그 값입니다.
리턴값
네트워크 인터페이스 개수를 리턴합니다. 실패할 경우 -1을 리턴합니다.

플래그 값은 아래 값을 OR'ing 합니다.

#define NETIF_LIST_F_LOOPBACK_INCLUDED          0x0001
#define NETIF_LIST_F_MULTICAST_SUPPORTED        0x0002
  • NETIF_LIST_F_LOOPBACK_INCLUDED 검색 시 루프백 장치도 포함시킵니다.
  • NETIF_LIST_F_MULTICAST_SUPPORTED 검색 시 멀티캐스트를 지원하는 네트워크 인터페이스만 포함시킵니다.
int32_t get_netif_list ( char ifnames[][IFNAMSIZ] , int32_t ifindices[] , int32_t ifnames_size , uint32_t flags = 0 )
OasisNet.h
기기에 설치된 네트워크 인터페이스 이름 목록과 인덱스 목록을 얻습니다.
매개변수
ifnames[][IFNAMSIZ]  OUT 네트워크 인터페이스 이름 목록을 리턴합니다.
ifindices[]  OUT 네트워크 인터페이스 인덱스 목록을 리턴합니다.
ifnames_size  네트워크 인터페이스 이름과 인덱스 목록 최대 크기입니다.
flags  검색 시 적용 될 플래그 값입니다.
리턴값
네트워크 인터페이스 개수를 리턴합니다. 실패할 경우 -1을 리턴합니다.
int32_t get_current_mac_address ( char * ifname , size_t ifname_size , uint8_t * macaddr , int32_t * maclen )
OasisNet.h
현재 동작 중인 네트워크 인터페이스 이름과 하드웨어 주소를 얻습니다.
매개변수
ifname  OUT 네트워크 이름을 리턴합니다.
ifname_size  네트워크 이름 버퍼의 크기입니다. 바이트 단위입니다.
macaddr  OUT 하드웨어 주소를 리턴합니다.
maclen  하드웨어 주소 버퍼의 크기입니다. 바이트 단위입니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t get_mac_address ( int32_t s , uint8_t * macaddr , int32_t * maclen )
OasisNet.h
소켓에 연결된 하드웨어 주소를 얻습니다.
매개변수
s  소켓 핸들 번호입니다.
macaddr  OUT 하드웨어 주소를 리턴합니다.
maclen  하드웨어 주소 버퍼의 크기입니다. 바이트 단위입니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t get_mac_address ( const char * ifname , uint8_t * macaddr , int32_t * maclen )
OasisNet.h
네트워크 인터페이스 이름에 해당하는 하드웨어 주소를 얻습니다.
매개변수
ifname  네트워크 인터페이스 이름입니다.
macaddr  OUT 하드웨어 주소를 리턴합니다.
maclen  하드웨어 주소 버퍼의 크기입니다. 바이트 단위입니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t get_current_netif_config ( const char * if_name , char * netaddr , char * netmask , char * gateway )
OasisNet.h
네트워크 인터페이스 이름의 네트워크 환경 설정을 얻습니다.
매개변수
if_name  네트워크 인터페이스 이름입니다.
netaddr  OUT IPv4 주소를 리턴합니다.
netmask  OUT Netmask를 리턴합니다.
gateway  OUT 게이트웨이 주소를 리턴합니다.
리턴값
  • 0: 성공
  • -1: 실패
bool is_in_the_same_local_network ( const struct in_addr in )
OasisNet.h
주소가 같은 로컬 네트워크에 있는지 확인합니다.
매개변수
in  확인할 IPv4 주소입니다.
리턴값
  • true: 같은 로컬 네트워크에 있습니다.
  • false: 다른 네트워크에 있습니다.
bool is_my_network_address ( const struct in_addr in )
OasisNet.h
주소가 내 기기의 IPv4 주소인지 확인합니다.
매개변수
in  확인할 IPv4 주소입니다.
리턴값
  • true: 내 네트워크 주소입니다.
  • false: 내 네트워크 주소가 아닙니다.
std::string net_addr_to_string ( const struct sockaddr_in * addr )
OasisNet.h
네트워크 주소를 문자열로 변환합니다. 변환된 문자열은 <IPv4 주소>/<포트번호> 형식입니다.
매개변수
addr  변환할 주소입니다.
리턴값
변환된 문자열 주소를 리턴합니다.
int32_t get_netif_index ( int32_t s )
OasisNet.h
소켓에 연결된 네트워크 인터페이스의 인덱스를 얻습니다.
매개변수
s  소켓 핸들 번호입니다.
리턴값
성공하면 네트워크 인터페이스 인덱스 번호를 리턴하고, 실패하면 -1을 리턴합니다.
int32_t get_netif_index ( struct in_addr in )
OasisNet.h
로컬 주소에 연결된 네트워크 인터페이스의 인덱스를 얻습니다.
매개변수
in  로컬 주소입니다.
리턴값
성공하면 네트워크 인터페이스 인덱스 번호를 리턴하고, 실패하면 -1을 리턴합니다.
bool is_valid_netif ( const char * netif_name )
OasisNet.h
네트워크 인터페이스 이름이 유효한지 확인합니다.
매개변수
netif_name  네트워크 인터페이스 이름입니다.
리턴값
  • true: 유효합니다.
  • false: 유효하지 않습니다.
bool validate_netifs ( const char * network_interfaces )
OasisNet.h
네트워크 인터페이스 이름 목록이 모두 유효한지 확인합니다.
매개변수
network_interfaces  콤마(,)로 구분되는 네트워크 인터페이스 이름 목록입니다. 예를들어 "eth0,wlan0"와 같은 형식입니다.
리턴값
모두 유효한 경우 "true"를 리턴합니다. 하나라도 유효하지 않으면 "false"를 리턴합니다.
int32_t get_netifs ( const char * network_interfaces , char ifnames[][IFNAMSIZ] , int32_t ifnames_size , uint32_t flags = 0 )
OasisNet.h
네트워크 인터페이스 이름 목록을 얻습니다.
매개변수
network_interfaces  콤마(,)로 구분되는 네트워크 인터페이스 이름 목록입니다. nullptr이 아니면, 이 목록에 있는 네트워크 인터페이스 이름이 유효한지 확인하고, 하나라도 유효하지 않다면 -1을 리턴합니다. 모두 유효하면 이 목록 이름을 리턴합니다. nullptr이면 기기에 있는 네트워크 인터페이스 이름 목록을 flags 값에 따라 찾아서 리턴합니다.
ifnames[][IFNAMSIZ]  OUT 네트워크 인터페이스 이름 목록을 리턴합니다.
ifnames_size  네트워크 인터페이스 이름 목록 최대 크기입니다.
flags  검색 시 적용 될 플래그 값입니다.
리턴값
성공할 경우 목록 크기를 리턴합니다. 실패할 경우 -1을 리턴합니다.
bool is_network_down ( const char * ifname )
OasisNet.h
네트워크 인터페이스에 연결된 네트워크가 다운되었는지 확인합니다.
매개변수
ifname  네트워크 인터페이스 이름입니다.
리턴값
  • true: 네트워크 다운 상태입니다.
  • false: 네트워크 업 상태입니다.
void enable_internal_dns ( bool enable )
OasisNet.h
Oasis DNS 클라이언트 컴포넌트를 활성화합니다.
매개변수
enable  true이면 활성화하고, false이면 비활성화합니다.
int32_t set_dns_transport ( int32_t transport )
OasisNet.h
Oasis DNS 클라이언트 컴포넌트가 사용할 네트워크 트랜스포트 유형을 지정합니다.
매개변수
transport  "0" 값은 TCP를 사용하며, "1" 값은 UDP를 사용합니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t set_dns_timeout ( int32_t timeout )
OasisNet.h
Oasis DNS 클라이언트 컴포넌트가 FQDN를 얻기까지 기다리는 최대 시간을 설정합니다.
매개변수
timeout  최대 대기 시간입니다. 밀리초 단위입니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t resolve_net_address ( const char * netaddr , uint32_t * addr4_ptr , bool use_systemd = false )
OasisNet.h
FQDN를 DNS 서비스를 이용하여 IPv4 주소로 변환합니다.
매개변수
netaddr  FQDN 입니다. 예를 들어 "www.mediastek.com"과 같이 정규화된 이름입니다.
addr4_ptr  OUT 변환된 주소 문자열을 리턴합니다.
use_systemd  true이면 시스템의 DNS 서비스를 사용합니다. false이면 Oasis DNS 서비스를 사용합니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t resolve_net_addresses ( const char * netaddr , std::vector<struct in_addr> & addrs )
OasisNet.h
FQDN에서 DNS 서비스를 이용하여 IPv4 주소 목록을 얻습니다. 하나의 FQDN이 여러 IPv4 주소를 갖을 경우에 유용합니다.
매개변수
netaddr  FQDN 입니다. 예를 들어 "www.mediastek.com"과 같이 정규화된 이름입니다.
addrs  OUT 변환된 IPv4 주소 목록을 리턴합니다.
리턴값
  • 0: 성공
  • -1: 실패
ssize_t net_decode_url ( const char * url , int32_t len , std::string & decoded_url )
OasisNet.h
인코딩된 URL을 디코딩합니다.
매개변수
url  인코딩된 URL 문자열입니다.
len  문자열 길이입니다.
decoded_url  OUT 디코딩된 URL 문자열을 리턴합니다.
리턴값
성공할 경우 디코딩된 URL 문자열의 길이를 리턴합니다. 실패할 경우 -1을 리턴합니다.
ssize_t net_encode_url ( const char * url , std::string & encoded_url )
OasisNet.h
URL을 인코딩합니다.
매개변수
url  인코딩할 URL입니다.
encoded_url  OUT 인코딩된 URL 문자열을 리턴합니다.
리턴값
성공할 경우 인코딩된 URL 문자열의 길이를 리턴합니다. 실패할 경우 -1을 리턴합니다.
const char * extension_to_mime_type ( const char * extension )
OasisNet.h
파일 확장자를 MIME 타입으로 변환합니다. 지원되는 확장자는 Oasis 초기화 시에 사전에 등록되어 있거나 API를 통하여 동적으로 등록해야 합니다. 대소문자를 구분하지 않습니다.
매개변수
extension  확장자를 가리키는 문자열 포인터입니다.
리턴값
파일 확장자를 지원하는 경우, 그 파일에 해당되는 MIME 타입을 리턴합니다. 모르는 확장자의 경우, "application/octet-stream"를 리턴합니다.
const char * get_file_mime_type ( const char * file_name )
OasisUtil.h
일반적인 파일 확장자가 있는 파일 이름에서 MIME 타입을 리턴합니다.
매개변수
file_name  파일 이름입니다.
리턴값
지원하는 확장자에 대해서 MIME 타입을 리턴하고, 지원하지 않는 확장자에 대해서는 "application/octet-stream"을 리턴합니다.

아래는 Oasis가 인식하는 파일 확장자별 MIME 타입 표입니다.

확장자 MIME 타입
html, htm, osp text/html
png image/png
gif image/gif
bmp image/bmp
jpeg, jpg image/jpeg
css text/css
js application/x-javascript
mp4 video/mp4
avi video/x-msvideo
cgi text/html
pdf application/pdf
그외 application/octet-stream

문자열

std::string toHexString ( const uint8_t * data , size_t length , bool lowercase = true )
OasisUtil.h
바이트 배열 데이터를 16진수 문자열로 변환합니다. 한 바이트는 2개의 16진수로 변환됩니다. 리턴된 문자열의 길이는 데이터 길이의 2배입니다.
매개변수
data  바이트 배열 데이터 포인터입니다.
length  배열 길이입니다.
lowercase  "true"이면 소문자 16진수(abcdef)를 사용합니다. "false"이면 대문자 16진수(ABCDEF)를 사용합니다.
리턴값
16진수로 구성된 문자열입니다. 예를 들어, lowercase 값이 "true"연 경우, 5f1bc26509002142b6f2와 같이 변환됩니다. lowercase 값이 "false"이면 5F1BC26509002142B6F2와 같이 변환됩니다.
std::string toHexDumpString ( const uint8_t * data , size_t length , bool lowercase = true )
OasisUtil.h
바이트 배열 데이터를 한 줄이 16바이트로 이루어지고, 각 줄은 16진수와 ASCII로 구성된 Hex Dump 양식의 문자열을 리턴합니다.
매개변수
data  바이트 배열 데이터 포인터입니다.
length  배열 길이입니다.
lowercase  "true"이면 소문자 16진수(abcdef)를 사용합니다. "false"이면 대문자 16진수(ABCDEF)를 사용합니다.
리턴값
Hex Dump 양식의 문자열입니다.

아래는 toHexDumpString 예입니다.

" 00000000 33 59 c6 dd 97 07 1d d4 3b d3 5c 40 b3 b0 c9 a4 3Y......;.\@....\n 00000010 f1 0b 36 39 59 5c ed e8 dd 63 42 ce f9 d0 88 2c ..69Y...cB....,\n 00000020 29 4e 09 c0 \n"

이 문자열을 콘솔에 출력하면 아래와 같이 보입니다.

   00000000  33 59 c6 dd 97 07 1d d4 3b d3 5c 40 b3 b0 c9 a4   3Y......;.\@....
   00000010  f1 0b 36 39 59 5c ed e8 dd 63 42 ce f9 d0 88 2c   ..69Y\...cB....,
   00000020  29 4e 09 c0                                       )N..
std::string toHexAsciiString ( const uint8_t * data , size_t length )
OasisUtil.h
바이트 배열 데이터를 각각 ASCII 값으로 변환된 문자열을 리턴합니다. 출력되지 않는 문자의 경우는 "." 로 변환됩니다. 예를 들어, .p.j..#...Pp...[.av.r.H...o'.Z.D.. 이런 형식으로 리턴합니다.
매개변수
data  바이트 배열 데이터 포인터입니다.
length  배열 길이입니다.
리턴값
변환된 문자열을 리턴합니다.
std::string toDotString ( const uint32_t * data , size_t length )
OasisUtil.h
32비트 배열 데이터를 "."로 구분된 문자열로 변환합니다. 예를 들어 561719494.513318045.664304121.498333846 이런 형식으로 리턴합니다.
매개변수
data  32비트 배열 데이터 포인터입니다.
length  배열 길이 입니다.
리턴값
변환된 문자열입니다.
std::string toDotString ( const uint8_t * data , size_t length )
OasisUtil.h
바이트 배열 데이터를 "."로 구분된 문자열로 변환합니다. 예를 들어 70.230.47.188.127.96 이런 형식으로 리턴합니다.
매개변수
data  바이트 배열 데이터 포인터입니다.
length  배열 길이입니다.
리턴값
변환된 문자열입니다.
bool isNumber ( char * str )
OasisUtil.h
문자열이 숫자(0123456789)로만 구성되어있는지 확인합니다.
매개변수
str  문자열 포인터입니다.
리턴값
  • true: 숫자로만 구성되어 있습니다.
  • false: 숫자 외에 다른 문자로 구성되어 있습니다.
bool isHexNumber ( char * str )
OasisUtil.h
문자열이 16진수(0123456789abcdefABCDEF)로만 구성되어있는지 확인합니다.
매개변수
str  문자열 포인터입니다.
리턴값
  • true: 16진수로만 구성되어 있습니다.
  • false: 16진수 외에 다른 문자로 구성되어 있습니다.
std::string format ( const char * format , ... )
OasisUtil.h
서식화된 문자열을 리턴합니다. 서식은 printf와 동일합니다.
매개변수
format  서식 포맷 문자열입니다.
...  인수 리스트입니다.
리턴값
서식화된 문자열을 리턴합니다.
std::string formatV ( const char * format , va_list args )
OasisUtil.h
인자로 va_list를 받아서 서식화된 문자열을 리턴합니다. 서식은 printf와 동일합니다.
매개변수
format  서식 포맷 문자열입니다.
args  인수 리스트입니다.
리턴값
서식화된 문자열을 리턴합니다.
void replace_all ( std::string & str , const char * from , const char * to )
OasisUtil.h
문자열에서 from 문자열을 to 문자열로 변경합니다.
매개변수
str  IN OUT 문자열입니다.
from  찾을 문자열입니다.
to  대체될 문자열입니다.
uint64_t string_to_number ( const char * string )
OasisUtil.h
문자열을 숫자로 변환합니다. 문자열이 "0x" 또는 "0X"로 시작되면 16진수 문자열로 간주하여 16진수를 숫자로 변환됩니다. 그렇치 않은 경우, 10진수로 간주됩니다. 10진수 문자열 도중에 \xNN 같은 16진수 표기가 있으면 이 부분만 16진수를 숫자로 변환됩니다. 숫자 기호로 인식이 되는 부분까지만 숫자로 변환됩니다.
매개변수
string  문자열 포인터입니다.
리턴값
변환된 숫자값을 리턴합니다.
ssize_t string_to_array ( const char * string , char * buffer , size_t size , uint8_t * padding_bits_ptr = nullptr )
OasisUtil.h
문자열을 배열로 변환합니다. 문자열이 "0b" 또는 "0B"로 시작되면 이진수로 간주되어, 8비트씩 묶어서 한 바이트 값으로 변환됩니다. 마지막 바이트가 완전한 8비트가 아니면 채우지 못한 비트 수가 padding_bits_ptr에 리턴됩니다. 예를 들어 "110" 으로 3비트만 채우면, 5 값이 리턴되고, 배열의 마지막 요소 값은 "192" (이진수로는 "1100 0000") 이 됩니다. 문자열이 "0x" 또는 "0X"로 시작되면 16진수 문자열로 간주하여 2개의 16진수 문자를 한 바이트 숫자 값으로 변환되어 저장됩니다. 그외의 경우, 문자열 한 글자를 그대로 배열에 한 바이트씩 저장되며, 이 문자열 도중에 "\xNN"이 있으면 NN을 16진수 문자로 간주하여 변환된 숫자값이 저장되고, "\0"이 있으면 "0"이 저장되고, "\"이 있으면 "\"이 저장됩니다.
매개변수
string  문자열 포인터입니다.
buffer  변환될 버퍼 포인터입니다.
size  버퍼 크기입니다. 바이트 단위입니다. 최소 문자열 길이 만큼 지정합니다.
padding_bits_ptr  OUT 이진수 변환일 경우, 마지막 채우지 못 한 비트 수를 리턴합니다.
리턴값
바이트 배열 크기를 리턴합니다. 실패할 경우, -22 (EINVAL) 값을 리턴합니다.

Base64

int32_t base64Decode ( uint8_t * out , const char * in , int32_t out_length )
OasisUtil.h
BASE64 인코딩된 문자열을 디코딩한 데이터를 얻습니다.
매개변수
out  OUT 디코딩 결과를 저장할 버퍼 포인터입니다.
in  BASE64 인코딩된 문자열입니다.
out_length  디코딩 결과가 저장될 버퍼의 길이입니다. 바이트 단위입니다. 인코딩된 문자열 길이보다 작습니다.
리턴값
성공하면 디코딩된 데이터 길이를 리턴합니다. 실패하면 -1을 리턴합니다.
int32_t base64Encode ( char * buf , int32_t buf_len , uint8_t * src , int32_t len , int32_t line_length = 0 )
OasisUtil.h
데이터를 BASE64 인코딩한 문자열을 얻습니다.
매개변수
buf  인코딩된 문자열을 저장할 버퍼 포인터입니다.
buf_len  인코딩된 문자열을 저장할 버퍼 길이입니다. 바이트 단위입니다.
src  인코딩할 데이터 포인터입니다.
len  인코딩할 데이터 길이입니다. 바이트 단위입니다.
line_length  0이 아닐 경우, 인코딩 문자열을 line_length 길이만큼 한줄씩 끊어서 리턴합니다. 각 줄 구분은 "\a"으로 합니다.
리턴값
성공하면 인코딩된 문자열 길이를 리턴합니다. 만일 여러줄로 이루어진 경우, 줄 구분자인 "\a" 개수도 포함됩니다. 3줄이면, 실제 인코딩된 길이보다 2가 더 큽니다. 실패하면 -1을 리턴합니다.

아래는 line_length 가 0 인 경우, BASE64 인코딩한 문자열입니다.

BN+faS4nrqxihBlI7FrA/ouSVhdvYqNNWzVdZxkMPB3r24YZAjTFZLnerKU4bKTE/vrbbV1+u7i0GB/NJFvqDzZwKDik7Zxdy0gDBLSnyLKhox/+Idq21fPVohcwjCdm/E+eoT06/giCAQw2qNToSncISJni/27V1BHtBZ0=

아래는 line_length 가 32 인 경우, BASE64 인코딩한 문자열입니다.

BN+faS4nrqxihBlI7FrA/ouSVhdvYqNN<0x0a>
WzVdZxkMPB3r24YZAjTFZLnerKU4bKTE<0x0a>
/vrbbV1+u7i0GB/NJFvqDzZwKDik7Zxd<0x0a>
y0gDBLSnyLKhox/+Idq21fPVohcwjCdm<0x0a>
/E+eoT06/giCAQw2qNToSncISJni/27V<0x0a>
1BHtBZ0=

Random 데이터와 UUID

void generateRandomBytes ( uint8_t * buf , size_t length )
OasisUtil.h
랜덤 바이트 배열을 얻습니다.
매개변수
buf  랜덤 바이트 배열을 저장할 버퍼 포인터입니다.
length  버퍼 크기입니다. 바이트 단위입니다.
std::string generateUUIDString ( )
OasisUtil.h
UUID 문자열을 얻습니다. 예를 들어 1c7ffde7-ae42-1ce9-ae55-8000206779f2 와 같은 양식의 문자열입니다.
리턴값
UUID 문자열을 리턴합니다.

시간

std::string tvToString ( struct timeval * tv )
OasisUtil.h
timeval 구조체를 "yyyy/mm/dd hh:mm:ss" 양식으로 변환된 문자열로 얻습니다. UTC+0 기준입니다. 예를 들어 2000/06/07 21:34:39 이런 양식으로 변환됩니다.
매개변수
tv  변환될 timeval 구조체 포인터입니다.
리턴값
변환된 문자열을 리턴합니다.
int64_t tvSubtract ( struct timeval * x , struct timeval * y )
OasisUtil.h
timeval 구조체의 차이를 리턴합니다.
매개변수
x  timeval 구조체 포인터입니다.
y  timeval 구조체 포인터입니다.
리턴값
x-y 값을 리턴합니다. 단위는 마이크로초 입니다.
int32_t getTimeOfDay ( struct timeval * tv )
OasisUtil.h
CLOCK_MONOTONIC 값을 얻습니다. 시스템 부팅 후 단순 증가하는 타이머 값입니다.
매개변수
tv  OUT 저장될 timeval 구조체 포인터입니다.
리턴값
항상 0을 리턴합니다.
uint64_t systemTime ( )
OasisUtil.h
시스템 부팅 후 단순 증가하는 타이머 값을 얻습니다. 마이크로 초 단위입니다.
리턴값
타이머 값입니다.
uint64_t timeSpecToUsec ( struct timespec & ts )
OasisUtil.h
timespec 값을 마이크로초 값으로 변환된 값을 얻습니다. timespec은 nano 초 값을 표현할 수 있습니다.
매개변수
ts  timespec 구조체 레퍼런스입니다.
리턴값
변환된 값을 리턴합니다.
uint64_t timeSpecToUsec ( struct timespec * ts )
OasisUtil.h
timespec 값을 마이크로초 값으로 변환된 값을 얻습니다. timespec은 nano 초 값을 표현할 수 있습니다.
매개변수
ts  timespec 구조체 포인터입니다.
리턴값
변환된 값을 리턴합니다.
void parseUsec ( int64_t usec , int & h , int & m , int & s , int & u )
OasisUtil.h
마이크로초를 시,분,초,마이크로초로 분해합니다.
매개변수
usec  마이크로 초 값입니다.
h  OUT 시간을 리턴합니다. 시간 값은 24(하루)를 넘을 수 있습니다.
m  OUT 분을 리턴합니다.
s  OUT 초를 리턴합니다.
u  OUT 마이크로 초를 리턴합니다.

패러미터 맵

void mergeParameters ( const char * tag_string , key_value_map_t & to_parameters , key_value_map_t & from_parameters , const char * prefix_string = nullptr , bool copy_prefixed_pair_only = false )
OasisUtil.h
두 개의 key-value map을 합칩니다. prefix_string이 주어지면 이 문자열을 접두어로 갖는 키는 이 접두어를 제거한 키 이름으로 변경된 후 합쳐집니다.
매개변수
tag_string  로그 출력 등에 단순 참조용으로 사용될 TAG 문자열입니다.
to_parameters  IN OUT 합체한 결과물이 리턴되는 패러미터 맵입니다.
from_parameters  합체할 key-value 요소를 찾을 패러미터 맵입니다.
prefix_string  nullptr이 아니면 이 인수에 지정된 문자열을 접두어로 한 키를 from_parameters에서 찾아서 접두어를 제거한 키를 사용합니다. 예를 들어 prefix_stringchannel1- 이고, from_parameterschannel1-fps 라는 키가 있다면, 머지될 키는 fps가 됩니다.
copy_prefixed_pair_only  "true"이면 channel1- 등과 같이 키의 접두어가 매치되는 key-value 요소만 합칩니다. "false"이면, prefix_string가 지정된 경우는 이 접두어를 뺀 키의 요소를 합치고, 다른 키는 수정없이 합쳐집니다.
void mergeParameters ( const char * tag_string , key_value_map_t & to_parameters , key_value_map_t & from_parameters , const char * prefix_string , const char * excluded_prefix_string , bool copy_prefixed_pair_only = false )
OasisUtil.h
두 개의 key-value map을 합칩니다. prefix_string이 주어지면 이 문자열을 접두어로 갖는 키는 이 접두어를 제거한 키 이름으로 변경된 후 합쳐집니다. excluded_prefix_string이 주어질 경우, 이 접두어로 갖는 키는 합체에서 제외됩니다.
매개변수
tag_string  로그 출력 등에 단순 참조용으로 사용될 TAG 문자열입니다.
to_parameters  IN OUT 합체한 결과물이 리턴되는 패러미터 맵입니다.
from_parameters  합체할 key-value 요소를 찾을 패러미터 맵입니다.
prefix_string  nullptr이 아니면 이 인수에 지정된 문자열을 접두어로 한 키를 from_parameters에서 찾아서 접두어를 제거한 키를 사용합니다. 예를 들어 prefix_stringchannel1- 이고, from_parameterschannel1-fps 라는 키가 있다면, 머지될 키는 fps가 됩니다.
excluded_prefix_string  nullptr이 아니면 이 인수에 지정된 문자열을 접두어로 한 키를 from_parameters에서 찾아서 합체에서 제외시킵니다.
copy_prefixed_pair_only 
void regExcludeParameters ( const char * tag_string , key_value_map_t & , key_value_map_t & from_parameters , const char * exclude_regex )
OasisUtil.h
두 개의 key-value map을 합칩니다. exclude_regex 로 주어진 정규식 문자열에 매치되는 키 이름은 합체에서 제외됩니다.
매개변수
tag_string  로그 출력 등에 단순 참조용으로 사용될 TAG 문자열입니다.
  IN OUT 합체한 결과물이 리턴되는 패러미터 맵입니다.
from_parameters  합체할 key-value 요소를 찾을 패러미터 맵입니다.
exclude_regex  합체에서 제외할 요소의 키 이름을 찾을 정규식입니다.
void dumpParameters ( const char * tag , key_value_map_t & parameters , const char * key = nullptr )
OasisUtil.h
key-value map을 로그 메세지로 출력합니다.
매개변수
tag  로그 출력 시 TAG로 사용될 문자열 포인터입니다.
parameters  덤프할 key-value map입니다.
key  nullptr이 아니면 이 키값을 가지고 있는 요소만 출력합니다.

INI 파일

get_profile_section, get_profile_section_names, get_profile_string, write_profile_string 함수는 모두 확장자가 ini 타입인 파일의 내용을 다룹니다.

ini 파일은 여러 개의 섹션으로 구성되어 있으며, 각 섹션은 <키 이름>=<값> 줄로 이루어져 있습니다. #; 는 코멘트 구분 기호로 사용됩니다. <값> 에 공백을 포함하는 경우, 큰따옴표로 시작하여 큰따옴표로 끝납니다. 섹션 이름은 대소문자 구별됩니다.

; 코멘트
# 코멘트
[섹션1 이름]
키이름=값   # 코멘트
키이름=값   ; 코멘트

예로 아래와 같습니다.

[general]
key1=value1
key2="general value2"  ; comment

[section1]
key1=section1_value1
key2="section1 value2"  ; comment

[section2]
key1=section2_value1
key2="section2 value2"  ; comment
int32_t get_profile_section ( const char * section , char * buf , int32_t buf_size , const char * file )
OasisUtil.h
file 에서 섹션을 찾아서, "키=값" 리스트를 얻습니다. 해당 줄에 코멘트가 있으면 코멘트도 포함됩니다. 리스트의 각줄은 공백문자('\0')로 끝납니다. 마지막에는 공백문자('\0')가 더 붙습니다.
매개변수
section  찾고자 하는 섹션 이름을 가리키는 문자열 포인터입니다.
buf  OUT "키=값" 목록을 저장할 버퍼의 포인터입니다.
buf_size  버퍼 크기입니다. 바이트 단위입니다.
file  ini 파일 경로입니다.
리턴값
성공하면, "키=값" 리스트 크기를 리턴합니다. 바이트 단위입니다. 실패하면, -1을 리턴합니다.
:[general], __data=0xffffeafcf4c8, __size=47 of 47:
   00000000  6b 65 79 31 3d 76 61 6c 75 65 31 00 6b 65 79 32   key1=value1.key2
   00000010  3d 22 67 65 6e 65 72 61 6c 20 76 61 6c 75 65 32   ="general value2
   00000020  22 20 20 3b 20 63 6f 6d 6d 65 6e 74 00 00 00      "  ; comment...
int32_t get_profile_section_names ( char * buf , int32_t buf_size , const char * file )
OasisUtil.h
file 에서 섹션 이름 목록을 얻습니다. 각 줄은 공백문자('\0')로 끝납니다. 마지막에는 공백문자('\0')가 더 붙습니다.
매개변수
buf  섹션 이름 리스트가 저장될 버퍼 포인터입니다.
buf_size  버퍼 크기입니다. 바이트 단위입니다.
file  ini 파일 경로입니다.
리턴값
성공하면, 섹션 이름 리스트 크기를 리턴합니다. 바이트 단위입니다. 실패하면, -1을 리턴합니다.
  • 0: 성공
  • -1: 실패
:section list, __data=0xffffeafcf4c8, __size=27 of 27:
   00000000  67 65 6e 65 72 61 6c 00 73 65 63 74 69 6f 6e 31   general.section1
   00000010  00 73 65 63 74 69 6f 6e 32 00 00                  .section2..
int32_t get_profile_string ( const char * section , const char * key , const char * default_str , char * buf , int32_t buf_size , const char * file )
OasisUtil.h
file 에서 section 에 있는 key 키 이름을 갖는 엔트리의 값을 얻습니다.
매개변수
section  찾고자 하는 섹션 이름을 가리키는 문자열 포인터입니다.
key  찾고자 하는 섹션 내 키 이름을 가리키는 문자열 포인터입니다.
default_str  key를 못 찾을 경우, 버퍼에 저장될 기본값입니다. nullptr 이고, key가 발견되지 않는 경우, -1을 리턴합니다. 빈 문자열도 가능합니다.
buf  OUT 값이 저장될 버퍼의 포인터입니다.
buf_size  버터 크기입니다. 바이트 단위입니다.
file  ini 파일 경로입니다.
리턴값
성공하면, 값 문자열 길이를 리턴합니다. 빈 문자열일 경우 0을 리턴합니다. 실패하면 -1을 리턴합니다.
int32_t write_profile_string ( const char * section , const char * key , const char * str , const char * file )
OasisUtil.h
file 에서 section 에 있는 key 키 이름을 갖는 엔트리의 값을 str 문자열로 덮어씁니다. str 내에 공백문자(스페이니나 탭 문자)가 있으면 큰따옴표가 문자열의 앞과 뒤에 붙습니다. strnullptr이면, key 엔트리를 삭제합니다.
매개변수
section  찾고자 하는 섹션 이름을 가리키는 문자열 포인터입니다.
key  찾고자 하는 섹션 내 키 이름을 가리키는 문자열 포인터입니다.
str  새 값으로 덮어쓸 문자열 포인터입니다.
file  ini 파일 경로입니다.
리턴값
  • 0: 성공
  • -1: 실패

파일 경로

std::string get_path_dir ( const std::string & path )
OasisUtil.h
파일 경로에서 폴더 경로를 얻습니다.
매개변수
path  파일 경로입니다.
리턴값
폴더 경로를 리턴합니다.
std::string get_path_leaf ( const std::string & path )
OasisUtil.h
파일 경로에서 파일이름과 구분자(.)와 확장자로 구성된 Leaf 문자열을 얻습니다.
매개변수
path  파일 경로입니다.
리턴값
경로의 Leaf 문자열을 리턴합니다. Leaf가 없다면 비어있는 문자열을 리턴합니다.
std::string get_path_leaf_name ( const std::string & path , bool make_lower )
OasisUtil.h
파일 경로에서 확장자를 제외한 파일 이름을 얻습니다.
매개변수
path  파일 경로입니다.
make_lower  "true"이면 소문자로 변환되어 리턴됩니다. "false"이면 대소문자 변환없이 리턴됩니다.
리턴값
파일 이름을 리턴합니다. 파일이름이 없으면 비어있는 문자열을 리턴합니다.
std::string get_file_ext ( const std::string & path , bool make_lower = true )
OasisUtil.h
파일 경로에서 파일의 확장자를 리턴합니다.
매개변수
path  파일 경로입니다.
make_lower  "true"이면 소문자로 변환되어 리턴됩니다. "false"이면 대소문자 변환없이 리턴됩니다.
리턴값
확장자 문자열입니다. 확장자가 없으면 비어있는 문자열을 리턴합니다.

아래는 몇 가지 경로에 대해 위 함수들을 적용한 예입니다.

path: /a/b/c/d/file.ext
get_path_dir: /a/b/c/d
get_path_leaf: file.ext
get_path_leaf_name: file
get_file_ext: ext

path: /a/b/c/d/
get_path_dir: /a/b/c/d
get_path_leaf: 
get_path_leaf_name: 
get_file_ext: 

path: /a/b/c/d/file
get_path_dir: /a/b/c/d
get_path_leaf: file
get_path_leaf_name: file
get_file_ext: 

path: /a/b/c/d/.ext
get_path_dir: /a/b/c/d
get_path_leaf: .ext
get_path_leaf_name: 
get_file_ext: ext

path: /a/b/c/d/.
get_path_dir: /a/b/c/d
get_path_leaf: .
get_path_leaf_name: 
get_file_ext: 
char * canonicalizePath ( const char * path , char * c_path )
OasisUtil.h
절대 경로를 정식 절대 경로(canonical path)로 변경합니다.
매개변수
path  절대 경로 입니다. '/'로 시작하지 않을 경우, path를 그대로 c_path에 리턴합니다.
c_path  OUT 정식 절대 경로를 리턴합니다.
리턴값
정식 절대 경로 문자열의 시작 포인터를 리턴합니다.
const char * canonicalizePath ( const char * path , std::string & c_path )
OasisUtil.h
절대 경로를 정식 절대 경로(canonical path)로 변경합니다.
매개변수
path  절대 경로 입니다. '/'로 시작하지 않을 경우, path를 그대로 c_path에 리턴합니다.
c_path  OUT 정식 절대 경로를 리턴합니다.
리턴값
정식 절대 경로 문자열의 시작 포인터를 리턴합니다.

파일 I/O

int32_t writeStringToFile ( const char * file_path , const char * value )
OasisUtil.h
문자열을 파일에 씁니다. 기존에 파일이 있으면, 덮어 씁니다.
매개변수
file_path  파일 경로입니다.
value  문자열 포인터입니다.
리턴값
성공하면 쓴 바이트 수를 리턴합니다. 실패하면 -1을 리턴합니다.
int32_t appendStringToFile ( const char * file_path , const char * value )
OasisUtil.h
문자열을 파일에 붙여씁니다. 파일이 없으면 새파일을 생성합니다.
매개변수
file_path  파일 경로입니다.
value  문자열 포인터입니다.
리턴값
성공하면 쓴 바이트 수를 리턴합니다. 실패하면 -1을 리턴합니다.
int32_t readStringFromFile ( const char * file_path , char * value , size_t size , bool trim_trailing_lws = false )
OasisUtil.h
텍스트 파일에서 문자열을 읽어 옵니다.
매개변수
file_path  파일 경로입니다.
value  OUT 문자열을 저장할 버퍼 포인터입니다.
size  버퍼 크기입니다. 바이트 단위입니다.
trim_trailing_lws  "true"이면 마지막 줄의 문자열 끝의 공백문자(0x20, 0x0d, 0x0a, 0x09) 등을 제거합니다.
리턴값
성공하면 읽어온 바이트 수를 리턴합니다. 실패하면 -1을 리턴합니다.
ssize_t readLinesFromFile ( const char * file_path , char * value , size_t size )
OasisUtil.h
여러 줄로 이루어진 텍스트 파일에서 모든 줄을 읽어 옵니다. 각 줄끝에 공백문자('\0')이 붙습니다. 마지막에는 공백문자('\0')가 더 붙습니다.
매개변수
file_path  파일 경로입니다.
value  OUT 전체 문자열을 저장할 버퍼 포인터입니다.
size  버퍼 크기입니다. 바이트 단위입니다. 버퍼크기가 작을 경우, 읽어온 총 문자열 데이터가 짤립니다.
리턴값
성공하면, 읽어온 총 바이트 수를 리턴합니다. 실패하면 -1을 리턴합니다.

아래는 읽어온 데이터 버퍼을 HEX DUMP한 예입니다.

readLinesFromFile, __data=0xfffff09f8d68, __size=206 of 206:
   00000000  23 20 63 6f 6d 6d 65 6e 74 0a 00 0a 00 5b 67 65   # comment....[ge
   00000010  6e 65 72 61 6c 5d 0a 00 6b 65 79 31 3d 76 61 6c   neral]..key1=val
   00000020  75 65 31 0a 00 6b 65 79 32 3d 22 67 65 6e 65 72   ue1..key2="gener
   00000030  61 6c 20 76 61 6c 75 65 32 22 20 20 3b 20 63 6f   al value2"  ; co
   00000040  6d 6d 65 6e 74 0a 00 0a 00 5b 73 65 63 74 69 6f   mment....[sectio
   00000050  6e 31 5d 0a 00 6b 65 79 32 3d 0a 00 6b 65 79 33   n1]..key2=..key3
   00000060  3d 22 6e 65 77 20 6b 65 79 20 76 61 6c 75 65 22   ="new key value"
   00000070  0a 00 6b 65 79 31 3d 22 73 68 6f 72 74 20 76 61   ..key1="short va
   00000080  6c 75 65 22 0a 00 0a 00 5b 73 65 63 74 69 6f 6e   lue"....[section
   00000090  32 5d 0a 00 6b 65 79 31 3d 73 65 63 74 69 6f 6e   2]..key1=section
   000000a0  32 5f 76 61 6c 75 65 31 0a 00 6b 65 79 32 3d 22   2_value1..key2="
   000000b0  73 65 63 74 69 6f 6e 32 20 76 61 6c 75 65 32 22   section2 value2"
   000000c0  20 20 3b 20 63 6f 6d 6d 65 6e 74 0a 00 00           ; comment...
ssize_t readTailLinesFromFile ( const char * file_path , int32_t tail_count , std::list<std::string> & lines , bool trim_trailing_lws = false , bool skip_empty_lines = false , bool skip_bash_comment_lines = false )
OasisUtil.h
여러 줄로 이루어진 텍스트 파일에서 끝에서 부터 tail_count 줄을 읽어 옵니다. 목록의 첫번째줄은 위 줄에서 부터 저장이 됩니다. 목록의 마지막 줄이 파일의 마지막 줄과 같습니다.
매개변수
file_path  파일 경로입니다.
tail_count  끝줄 개수입니다. "0" 값이면 전체 줄을 읽어 옵니다.
lines  OUT 각줄이 저장될 문자열 리스트 레퍼런스입니다.
trim_trailing_lws  "true"이면 각 줄의 문자열 끝의 공백문자(0x20, 0x0d, 0x0a, 0x09) 등을 제거합니다. 줄의 시작에 있는 공백문자는 항상 제거됩니다.
skip_empty_lines  "true"이면 비어 있는 문자열을 제외합니다.
skip_bash_comment_lines  "true"이면 '#'로 시작하는 코멘트 줄은 제외합니다.
리턴값
성공하면 lines 리스트의 크기를 리턴합니다. 실패하면 -1을 리턴합니다.
ssize_t readMapFromFile ( const char * file_path , key_value_map_t & parameters , char delimiter = '=' )
OasisUtil.h
각 줄이 <키><delimiter><값> 으로 구성된 텍스트 파일을 읽어서 key-value map 을 얻습니다.
매개변수
file_path  파일 경로입니다.
parameters  변환된 key-value map을 리턴합니다.
delimiter  "키" 와 "값" 사이에 있는 구분자입니다.
리턴값
성공하면, key-value map 크기를 리턴합니다. 실패하면 0을 리턴합니다.
ssize_t writeFile ( const void * data , size_t length , const char * file_path , mode_t mode = 0666 )
OasisUtil.h
파일을 주어진 접근 권한 모드로 생성하고 데이터를 씁니다. 파일이 있다면 덮어 씁니다.
매개변수
data  쓸 데이터 포인터입니다.
length  데이터 길이입니다. 바이트 단위입니다.
file_path  파일 경로 입니다.
mode  생성할 파일의 접근 권한 모드입니다. 8진수로 "0666" 의미는 "rw-rw-rw-" 입니다.
리턴값
성공하면 쓴 바이트 수를 리턴합니다. 실패하면 -1을 리턴합니다.
ssize_t readFile ( const char * file_path , std::vector<uint8_t> & data )
OasisUtil.h
파일에서 uint8_t 타입으로 데이터를 읽습니다.
매개변수
file_path  파일 경로 입니다.
data  OUT 읽어올 데이터를 저장할 벡터 레퍼런스입니다.
리턴값
성공하면 총 읽은 바이트 수를 리턴합니다. 실패하면 -1을 리턴합니다.
ssize_t readFile ( const char * file_path , std::vector<uint8_t> & data )
OasisUtil.h
파일에서 char 타입으로 데이터를 읽습니다.
매개변수
file_path  파일 경로 입니다.
data  OUT 읽어올 데이터를 저장할 벡터 레퍼런스입니다.
리턴값
성공하면 총 읽은 바이트 수를 리턴합니다. 실패하면 -1을 리턴합니다.
char * getOFFSMountedPoint ( char * offs_mounted_path , int32_t size )
OasisUtil.h
Oasis 파일 시스템이 마운팅된 시스템 폴더 경로를 얻습니다.
매개변수
offs_mounted_path  OUT 마운팅 경로를 저장할 버퍼 포인터입니다.
size  버퍼 크기입니다. 바이트 단위입니다.
리턴값
마운팅된 경로를 찾으면 경로 문자열 포인터를 리턴합니다. 찾지 못하면 nullptr을 리턴합니다.
bool isPathOnOFFS ( const char * path )
OasisUtil.h
경로가 Oasis 파일 시스템에 마운팅된 경로에 있는지 확인합니다.
매개변수
path  경로입니다.
리턴값
  • true: Oasis 파일 시스템에 위치한 경로입니다.
  • false: Oasis 파일 시스템에 위치하지 않은 경로입니다.
bool checkMounted ( const char * path , const char * type = "fuse.sshfs" )
OasisUtil.h
마운팅된 경로가 특정 파일시스템 타입인지 확인합니다.
매개변수
path  마운팅 경로입니다.
type  파일 시스템 타입입니다. ext4, squashfs, devtmpfs, tmpfs, proc, sysfs, ubifs, fuse.ssfs, fuse.ntfs-3g, fuse.offs 등이 가능합니다. 파일 시스템 타입은 /proc/filesystems에서 확인할 수 있습니다.
리턴값
  • true: 특정 파일 시스템 타입입니다.
  • false: 특정 파일 시스템 타입이 아닙니다.

자원 및 환경 변수

float getCPUUsage ( )
OasisUtil.h
전체 CPU 점유율을 얻습니다.
리턴값
퍼센트율을 리턴합니다.
float getThisCPUUsage ( bool irix_mode )
OasisUtil.h
호출하는 프로세스의 CPU 점유율을 얻습니다.
매개변수
irix_mode  "true"이면 Irix 모드로 모든 CPU 점유율의 합을 계산하며, "false"이면 Solaris모드로 프로세스 개수만큼 나눈 값을 계산합니다.
리턴값
퍼센트율을 리턴합니다.
uint64_t getFreeMemorySize ( )
OasisUtil.h
사용가능한 실제 물리적 메모리 크기를 얻습니다. 아직 할당 안 된 메모리와 버퍼링 되거나 캐쉬 되어 있는 메모리 합을 바이트 단위로 리턴합니다.
리턴값
가용 메모리 크기입니다. 바이트단위입니다.
uint64_t getThisMemoryUsage ( )
OasisUtil.h
호출하는 프로세스에서 사용중인 실제 물리적 메모리 크기를 얻습니다.
리턴값
사용 중인 메모리 크기 입니다. 바이트단위입니다.
int32_t getThisThreadCount ( )
OasisUtil.h
호출하는 프로세스가 생성하여 사용 중인 쓰레드 개수를 얻습니다.
리턴값
쓰레드 개수를 리턴합니다.
void killProcess ( std::string pname , int32_t timeout_msec = 5000 )
OasisUtil.h
지정된 프로그램 이름의 모든 프로세스를 종료합니다. SIGTERM 신호를 보내어 프로세스가 모두 종료될 때가지 timeout_msec 만큼 대기합니다. 이후에도 여전히 실행 중인 프로세스가 발견되면 SIGKILL 신호를 보냅니다. SIGKILL 신호를 보낸 후에는 추가로 대기하지 않습니다.
매개변수
pname 
timeout_msec 
void loadEnvironmentVariables ( const char * home_dir , const char * env_file_path , const char * known_env_variables[] , key_value_map_t & resolved_variables , std::list<std::string> & sources )
OasisUtil.h
쉘 환경변수가 저장된 파일을 읽어서 known_env_variables 목록에 지정된 환경변수 이름과 값을 얻습니다. 높은 권한(root 등)이 있는 사용자가 다른 사용자의 source.profile 등의 파일에서 그 사용자의 환경변수를 읽어올 때 유용합니다. 파일 내의 쉘 스크립트문을 eval하지 않습니다.
매개변수
home_dir  해당 사용자의 $HOME 값입니다.
env_file_path  환경 변수 파일 경로입니다.
known_env_variables[]  알려지 환경 변수 이름 목록입니다. 마지막 요소는 nullptr 이어야 합니다.
resolved_variables  OUT 환경변수 이름을 키이름으로 한 key-value map을 리턴합니다.
sources  env_file_path 내에 다른 환경변수 파일을 참조할 경우, 참조하는 다른 환경변수 파일 경로 목록입니다.

/etc/profile 파일 내용이 아래와 같은 경우,

export PATH="/bin:/sbin:/usr/bin:/usr/sbin"

if [ "$PS1" ]; then
        if [ "`id -u`" -eq 0 ]; then
                export PS1='# '
        else
                export PS1='$ '
        fi
fi

export EDITOR='/bin/vi'

# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
        if [ -r "$i" ]; then
                . $i
        fi
done
unset i

PATHEDITOR 환경 변수 값을 알고자 할 때,

const char *known_env_variables[] = { "PATH", "EDITOR", nullptr };
key_value_map_t vars;
std::list<std::string> sources;
loadEnvironmentVariables("/" , "/etc/profile" , known_env_variables , vars , sources);

dumpParameters("loadEnvironmentVariables", vars);

실행 하면, 아래 같은 결과를 볼 수 있습니다.

loadEnvironmentVariables parameters[PATH] /bin:/sbin:/usr/bin:/usr/sbin
loadEnvironmentVariables parameters[EDITOR] /bin/vi