본문 바로가기

IT/Toybox

Toybox 오픈소스 프로젝트 참여하기 -2

/* 
written by kaspy (kaspyx@gmail.com)
*/ 

toybox 공식 홈페이지 : http://www.landley.net/toybox/


- 리눅스 유틸리티 프로그램

- BSD License


안녕하세요 이어서 toybox 오픈소스 프로젝트 참여하기 2부를 쓰도록 하겠습니다.


참고로 toybox는 안드로이드 및 타이젠에도 탑재된다고 하니 toybox는 앞으로도 더욱 많이 쓰여질거 같네요!!


busybox을 대체하기에도 좋은 툴인거같습니다.


아래 설명은 http://www.landley.net/toybox/code.html 에나와있는 내용을 정리한 내용입니다.


1. Toybox 코딩 스타일


vimrc


toybox 코딩스타일은 기본적으로 리눅스 커널 코딩 스타일을 따릅니다.


첨부한 vimrc라는 파일을 받아서 사용하면 됩니다. 


cp ~/vimrc ~/vimrc.bak

vi ~/.vimrc

첨부한 파일내용 저장

source ~/.vimrc

 

2. 명령어 파라미터 옵션


 저번장에서 명령어를 추가 구현하는 내용에 대해서 다루었습니다. 이번에는 명령어 구현시 필요한 명령어 파라미터 옵션에 대해서 설명을 해보도록 하겠습니다. 이에대한 내용은 /toys/example/skeleton.c 라는 파일을 참조하면 이해하기좋습니다. 이전 내용은 여기를 참조해주시구요


명령어 파라미터 옵션은 '인자' 라고 쓰도록 하겠습니다.


아래 파일을 열어서


cd toybox

vi toys/example/skeleton.c

 

16번째쯤 라인의 default n -> y로 수정해주세요




그리고 빌드를 진행해줍니다


make clean

make defconfig

make

 

이를 실행해주면 인자에 대한 입력값을 확인할수 있습니다.



그럼 이런 입력된 파라미터는 어떻게 처리해야 할까요?


바로 요놈을 보시면 됩니다. (11,12 라인 부근)



우리가 봐야할건 빨강색 박스의 첫번째 라인입니다.(두번째 라인까지는 안봐도됨)


앞에있는 (walrus) 긴 인자에 대한 입력값입니다. 예를들어 긴 인자이름에 대한 입력값은 괄호 열고 닫고로 '(asfd)' 으로 표현합니다.


"toybox skeleton --walrus" 라고 입력을 하였다면 아래와 같이 출력됩니다.



위그림처럼, walrus라는 옵션에 맞는 조건이 있다면 따로 처리해주면 됩니다. ( '--argv' 형식으로 입력)


또한 단일 인자에 대한 입력은 문자 하나로 지정해주면 됩니다. ( '-a' 형식으로 입력)


그렇다면 뒤에 붙어있는 특수한 문자는 뭘까요?


예를들어 (walrus) 뒤에있는 (also): 이거 (콜론 하나':') 말입니다. 


toybox 홈페이지에서는 입력 인자에대한 정보를 아래와 같이 설명하고있습니다.

  • : - plus a string argument, keep most recent if more than one. : 문자열을 추가로 입력받음
  • * - plus a string argument, appended to a linked list. : 문자열을 띄어쓰기로 여러개 입력받음
  • @ - plus an occurrence counter (stored in a long) : 인자가 몇번 나왔는지 셈
  • # - plus a signed long argument. : 양수 숫자를 추가로 입력받음
  • - - plus a signed long argument defaulting to negative (start argument with + to force a positive value). : 양수를 입력받으나, 음수로 처리함
  • . - plus a floating point argument (if CFG_TOYBOX_FLOAT). : 부동소수를 추가로 입력받음
    • The following can be appended to a float or double:
    • <123 - error if argument is less than this
    • >123 - error if argument is greater than this
    • =123 - default value if argument not supplied

':' 라는 옵션은 입력인자에 대한 문자열 값이 있을때 써주면됩니다.


예를들어 위의 입력 인자 선언구문


USE_SKELETON(NEWTOY(skeleton, "(walrus)(blubber):;(also):e@d*c#b:a", TOYFLAG_USR|TOYFLAG_BIN))


에서 "b:" 을 봐보도록 하겠습니다.


위에서 보면 알수있듯이 단일 입력인자 'b'는 문자열에 대한 정보를 입력받는 것입니다



위에 그림을 보는것과 같이 'b'라는 입력 인자에 추가 문자열을 넣어줬다니 잘 입력된것을 확인할수 있습니다.


만약 'b' 인자에 추가 문자열을 입력해주지 않으면 에러가 납니다. 그런 예외처리가 잘되어있어서 프로그래머에게는 편하겠군요.


나머지도 마찬가지로, 설명을 참고해주면 됩니다.


그리고 밑에 

    The following can be appended to a float or double:
  • <123 - error if argument is less than this
  • >123 - error if argument is greater than this
  • =123 - default value if argument not supplied

이것은 무슨말이냐하면, 정수를 추가로 받는 인자에 대한 기본값 및 에러값을 지정해주기 위해 사용할수 있습니다.


USE_STRINGS(NEWTOY(example, "n#=4<1", TOYFLAG_USR|TOYFLAG_BIN))


위와같이 n이라는 인자를 정수와 같이 입력받고, 입력이 없을시에는 기본값이 4이며, 1보다 작은값이 들어오면 에러라는 뜻입니다.


위에서 추가적으로 입력받는 인자들은 소스코드를 수정하여 전역변수로 선언해줘야 합니다.


아래와같은 몇개는 c언어 문법을 따르지 않습니다. 컴파일 하기전에 toybox에서 전처리 과정을 거쳐서 c언어문법에 맞게 바꿔줄것입니다.



실제로 저건 입력받는 인자들이 많아서 그런경우라서 복잡할수 있겠지만.. 한두개 인자들에대해 다루는 경우가 더 많기 때문에 위에 코드는 그냥 참고만 하시는게 좋습니다.


입력받은 인자들에대한 처리를 하는 코드를 보도록 하겠습니다. 아래 코드에대한 내용이 많아서 헛갈리수도 있겠지만 굳이 다 안알아도 되는 내용이고 참고로만 하도록 하겠습니다.



toybox의 전역변수가 있고, toys 구조체에 저장되어있는것을 볼수 있습니다.


이에 대한 접근은 toys.optflags과 같이 하면 됩니다.


전연변수를 사용하면 좋은점이 많습니다. 우선 toybox에서 공용으로 사용되는 메모리인 만큼, 메모리를 절약할수 있구요, 소스도 더 간결해집니다.


예를들어 문자열을 입력받는 버퍼를 지역버퍼로 선언하거나, 전역변수 (는 지양해야함)에 선언할수 있겠지만 


전역변수 버퍼인 toybuf를 활용하면 좋습니다.


toybox의 전역변수에 대한 더많은 내용을 보고싶다면 http://www.landley.net/toybox/code.html#top을 참고하시기 바랍니다.


3. 래퍼(wrapper) 함수


toybox에서는 자체적으로 래퍼(wrapper) 함수를 지원합니다. 아마도 보안이나 안정성을 좋게 하려고 만든것 같은데, 


아래와 같이 있습니다.

더많은 내용을 보고싶다면 http://www.landley.net/toybox/code.html#generated를 봐보시기 바랍니다.


4. 마치며


 이상으로 toybox 오픈소스 프로젝트를 참여하기 위한 기본적인 내용은 전부 다룬것 같습니다. 


추가적으로 필요한 것이 있다면 lib/dirtree.c 에 있는 함수를 설명하면 좋을것 같은데, 이것은 다음에 실제 contribution을 한 명령어를 예제로 활용하여 설명 하도록 하겠습니다.

'IT > Toybox' 카테고리의 다른 글

Toybox - strings contribution  (0) 2017.04.01
Toybox 오픈소스 프로젝트 참여하기 -1  (0) 2015.10.22
Toybox 오픈소스 프로젝트 소개  (2) 2015.09.23