Utility API#
Oasis에서 쓰이는 유용한 함수들입니다.
헤더 파일#
OasisNet.h
OasisUtil.h
네트워크#
플래그 값은 아래 값을 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검색 시 멀티캐스트를 지원하는 네트워크 인터페이스만 포함시킵니다.
- 0: 성공
- -1: 실패
- 0: 성공
- -1: 실패
- 0: 성공
- -1: 실패
- 0: 성공
- -1: 실패
- true: 같은 로컬 네트워크에 있습니다.
- false: 다른 네트워크에 있습니다.
- true: 내 네트워크 주소입니다.
- false: 내 네트워크 주소가 아닙니다.
<IPv4 주소>/<포트번호> 형식입니다.
- true: 유효합니다.
- false: 유효하지 않습니다.
- true: 네트워크 다운 상태입니다.
- false: 네트워크 업 상태입니다.
true이면 활성화하고, false이면 비활성화합니다.
- 0: 성공
- -1: 실패
- 0: 성공
- -1: 실패
true이면 시스템의 DNS 서비스를 사용합니다. false이면 Oasis DNS 서비스를 사용합니다.
- 0: 성공
- -1: 실패
- 0: 성공
- -1: 실패
아래는 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 |
| application/pdf | |
| 그외 | application/octet-stream |
문자열#
아래는 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..
- true: 숫자로만 구성되어 있습니다.
- false: 숫자 외에 다른 문자로 구성되어 있습니다.
- true: 16진수로만 구성되어 있습니다.
- false: 16진수 외에 다른 문자로 구성되어 있습니다.
printf와 동일합니다.
va_list를 받아서 서식화된 문자열을 리턴합니다. 서식은 printf와 동일합니다.
Base64#
아래는 line_length 가 0 인 경우, BASE64 인코딩한 문자열입니다.
아래는 line_length 가 32 인 경우, BASE64 인코딩한 문자열입니다.
WzVdZxkMPB3r24YZAjTFZLnerKU4bKTE<0x0a>
/vrbbV1+u7i0GB/NJFvqDzZwKDik7Zxd<0x0a>
y0gDBLSnyLKhox/+Idq21fPVohcwjCdm<0x0a>
/E+eoT06/giCAQw2qNToSncISJni/27V<0x0a>
1BHtBZ0=
Random 데이터와 UUID#
시간#
timeval 구조체를 "yyyy/mm/dd hh:mm:ss" 양식으로 변환된 문자열로 얻습니다. UTC+0 기준입니다. 예를 들어 2000/06/07 21:34:39 이런 양식으로 변환됩니다.
timeval 구조체 포인터입니다.
timeval 구조체의 차이를 리턴합니다.
timeval 구조체 포인터입니다.
timeval 구조체 포인터입니다.
x-y 값을 리턴합니다. 단위는 마이크로초 입니다.
CLOCK_MONOTONIC 값을 얻습니다. 시스템 부팅 후 단순 증가하는 타이머 값입니다.
timeval 구조체 포인터입니다.
timespec 값을 마이크로초 값으로 변환된 값을 얻습니다. timespec은 nano 초 값을 표현할 수 있습니다.
timespec 구조체 레퍼런스입니다.
timespec 값을 마이크로초 값으로 변환된 값을 얻습니다. timespec은 nano 초 값을 표현할 수 있습니다.
timespec 구조체 포인터입니다.
패러미터 맵#
key_value_map_t &
to_parameters
,
key_value_map_t &
from_parameters
,
const char *
prefix_string
= nullptr
,
bool
copy_prefixed_pair_only
= false
)
nullptr이 아니면 이 인수에 지정된 문자열을 접두어로 한 키를 from_parameters에서 찾아서 접두어를 제거한 키를 사용합니다. 예를 들어 prefix_string이 channel1- 이고, from_parameters에 channel1-fps 라는 키가 있다면, 머지될 키는 fps가 됩니다.
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
)
nullptr이 아니면 이 인수에 지정된 문자열을 접두어로 한 키를 from_parameters에서 찾아서 접두어를 제거한 키를 사용합니다. 예를 들어 prefix_string이 channel1- 이고, from_parameters에 channel1-fps 라는 키가 있다면, 머지될 키는 fps가 됩니다.
nullptr이 아니면 이 인수에 지정된 문자열을 접두어로 한 키를 from_parameters에서 찾아서 합체에서 제외시킵니다.
key_value_map_t &
,
key_value_map_t &
from_parameters
,
const char *
exclude_regex
)
key_value_map_t &
parameters
,
const char *
key
= nullptr
)
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
:[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...
- 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..
nullptr 이고, key가 발견되지 않는 경우, -1을 리턴합니다. 빈 문자열도 가능합니다.
nullptr이면, key 엔트리를 삭제합니다.
- 0: 성공
- -1: 실패
파일 경로#
아래는 몇 가지 경로에 대해 위 함수들을 적용한 예입니다.
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:
파일 I/O#
아래는 읽어온 데이터 버퍼을 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...
key_value_map_t &
parameters
,
char
delimiter
= '='
)
nullptr을 리턴합니다.
- true: Oasis 파일 시스템에 위치한 경로입니다.
- false: Oasis 파일 시스템에 위치하지 않은 경로입니다.
/dev/mmcblk0p1 과 같습니다.
nullptr이 아니고 마운팅 되었을 경우, 마운팅된 폴더 경로를 저장합니다.
nullptr이 아니고 마운팅 되었을 경우, 파일시스템 타입 문자열을 저장합니다.
- true: 마운팅 되어 있습니다.
- false: 마운팅 되어 있지 않습니다.
ext4, squashfs, devtmpfs, tmpfs, proc, sysfs, ubifs, fuse.ssfs, fuse.ntfs-3g, fuse.offs 등이 가능합니다. 파일 시스템 타입은 /proc/filesystems에서 확인할 수 있습니다.
- true: 특정 파일 시스템 타입입니다.
- false: 특정 파일 시스템 타입이 아닙니다.
자원 및 환경 변수#
key_value_map_t &
resolved_variables
,
std::list<std::string> &
sources
)
source 나 .profile 등의 파일에서 그 사용자의 환경변수를 읽어올 때 유용합니다. 파일 내의 쉘 스크립트문을 eval하지 않습니다.
nullptr 이어야 합니다.
/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
PATH 와 EDITOR 환경 변수 값을 알고자 할 때,
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