10월, 2014의 게시물 표시

OS/2 codes: How to override standard functions in kLIBC

Sometimes there is a time when it is needed to override the functionality of some functions. To do this, at least two ways can be considered. Macros First is to use macros. For examples, if you want to override pipe(), then you can write the codes like this. Colored By Color Scripter ™ 1 2 3 4 5 6 7 8 9 10 #include  <io.h> int  my_pipe( int  *ph) {     some_codes;      return  (pipe)(ph); } #define  pipe(ph) my_pipe(ph) At line 7, a parenthesis is used to prevent pipe() from being expaned to my_pipe() by a macro. This way has an advantage that this can be applied to all the functions. But this has a disadvantage that this can be applied only locally. If you want to apply globally, then you should create a header for a macro and all the sources should include that header. Alias The other way is to use alias. kLIBC provides aliases for standard functions, which do not have a leading underscore. Standard functions have at least two names.

OS/2 codes: How to link statically against kLIBC

Originally, it is not supposed to link statically against kLIBC. That is, all the programs linked against kLIBC will depend on libcxxx.dll. Neverthelss, it is not impossible. Do the following. gcc -Zomf -static -o test.exe test.c -lc_omf386 Then, you can get test.exe without dependency on libcxxx.dll.

GNU Make 와 gcc 를 이용한 멀티 타겟 Makefile 만들기

예전에 GNU Make 와 gcc 를 이용한 auto-dependency Makefile 만들기 를 썼었는데, 이것은 단지 하나의 타겟만을 만들 수 있었다. 이번에는 이 부분을 개선해서 멀티 타겟 Makefile 을 만들어보자. 멀티 타겟을 지원하기 위해서는 GNU Make 의 몇 가지 함수를 먼저 살펴볼 필요가 있다. foreach 함수 foreach 함수의 문법은 다음과 같다. $(foreach var,list,text) 기능은 list 의 내용을 빈 칸을 기준으로 구분해서 var 에 각각 대입하고, 매번 text 를 확장한다. 예를 들면, l := $(foreach d,a b c d,l $(d)) 이 경우, l 은 l a l b l c l d 가 된다. call 함수 call 함수의 문법은 다음과 같다. $(call var,param,param,...) call 함수는 var 를 일종의 함수처럼 처리한다. var 뒤의 param 들은 var 의 $(1), $(2), ... 로 대체된다. 예를 들면, merge = $(1)/$(2) path := $(call merge,a,b) 이 경우 path 는 a/b 가 된다. define 지시자 define 지시자와 endef 를 통해 멀티 라인 변수를 만들 수 있다. 다음과 같이 쓰인다. define m echo foo echo $(boo) endef 만일 call 함수와 함께 쓰인다면 보통의 함수와 같은 역할을 할 수 있다. eval 함수 eval 함수의 문법은 다음과 같다. $(eval text) eval 함수는 text 의 내용을 Make 파일의 일부로 해석하게 만든다. 예를 들면, .PHONY: all define a all:     echo hello endef $(eval $(a)) 이것은 다음처럼 처리된다. .PHONY: all all:     echo hello

Porting to OS/2: Case #17 spawn...()

Many Unix programs seem not to care about command line length. So sometimes they pass a very long command line to a child program. However, OS/2 has a limitation for a command line length. It's 32KB. If a length is longer than 32KB, then OS/2 cannot execute a child program. If so, there is no way to workaround this ? Fortunately, there is a way in case of kLIBC. kLIBC supports a response file as an argument. Instead of passing arguments to a child program directly, passing arguments via a response file is the way. Here is spwanvpe() to pass a very long command line as a response file. https://github.com/komh/os2compat/blob/master/process/spawnvpe.c And a test program. https://github.com/komh/os2compat/blob/master/testcase/spawnvpe-1.c https://github.com/komh/os2compat/blob/master/testcase/spawnvpe-1-child.c How to build spawnvpe-1.exe gcc spwanvpe-1.c spawnvpe.c How to build spawnvpe-1-child.c gcc spawnvpe-1-child.c Other spawnl...() and spawnv...() can

OS/2 tricks: Useful git settings

git is more and more used in open source projects. Fortuantely, git is available on OS/2, too. Here, I would introduce some useful settings on OS/2. core.autocrlf This sets how to process eol. If this is false, git does not convert eol at all. If it is true, eol is converted to LF on check-in, but converted to CR/LF on check-out. This is useful, but sometimes some shell scripts or unixy programs trigger errors due to eol problem. This is because shells and programs ported to OS/2, do not process eol with unified way. If it is input, eol is converted to LF on check-in, but git does not care eol of files in a working tree. I recommend this. but remember that REXX scripts should have CR/LF eol. For this, append [*.cmd eol=crlf] to .gitattributes file. In order to set, use this command, git config --global core.autocrlf input apply.whitespace EOL is always a problem. Some git commands refuse to process tasks due to whitespace, Primarily CR/LF. But, if you set this var

OS/2 tricks: How to run foreign shell scripts

Generally, what to do in order to run foreign shell scripts is to run shell scripts with a shell script processor. For examples, if you want to run a shell script, test.sh for sh, then you should do sh shtest.sh But OS/2 provides a special keyword to ease this. That is extproc . By default OS/2 has two script processorst. One is a batch processor, the other one is REXX.  However, with extproc, OS/2 can process other scripts than a batch and a REXX. extproc is similar to #! of Unix worlds. If the first line of a script file is extproc, then the remaining parts are treated as an script processors. Notice that scripts files should have .cmd extension. For examples, the above command can be written like this, shtest.cmd ----- extproc sh ... orignal stuffs of test.sh ... ----- Then, you can excute shtest.cmd directly with OS/2 command processors such as CMD.EXE or 4OS2.EXE. In pratice, shtest.cmd is executed like this by OS/2, sh shtest.cmd Sometimes, extproc is n

왕좌의 게임(원작: 얼음과 불의 노래) 해설 방송

팟캐스트 방송 '그것은 알기 싫다' 에서 물뚝심송님께서 해설 방송을 하고 있다. 드라마 내용 이전의 역사와 전체적인 흐름에 대해 원작 소설과 여타 추론 등을 이용해 설명해 준다. 아울러 소설이 그러하듯, 이 작품 속에 아로 새겨진 우리가 살고 있는 세상의 모습을 살펴본다. 팟캐스트 방송: 그것은 알기 싫다 에서 '얼음과 불의 잉해' 라는 제목으로 올라와 있다.  10월 17일자로 마무리되었다.

< 공각기동대 > 를 보고...

‘공각기동대’ 를 보았다. 그런데 특이한 것은 애니의 어디를 보아도 ‘공각기동대’ 라는 말은 찾을 수가 없었다. 혹시 해적판 ? 명시적인 제목은 ‘Ghost in the Shell' 이었다. 그동안 많은 사람들의 입에서 오르내리던 작품이라 기대도 컸고, 어떤 두려움도 많았다. 단 한 번을 보고서 어떤 이야기를 쓴다는 것이 참으로 우스운 이야기이긴 하지만 그래도 느낌이니까. 한마디로 말하자면, ‘공각기동대’ 는 디지털 문명 속의 ‘실존’ 에 관한 질문이다. 몇가지 재미있는 질문들이 나온다. ‘생명’ 의 정의 ? 인형사와 6과에 있는 사람들과의 대화 속에서 각자의 생명관이 드러난다. 아마도 6 과 사람들이 고전적인 생명관을 유지하고 있다면, 인형사 - 그 위상상 - 는 보다 진보적(?)인 생명관을 주장한다. 6과들은 이렇게 얘기한다. 인간의 손으로 만들어진 것은 생명이 아니다. 너는 단지 프로그램일 뿐이다. 하지만 인형사는 이렇게 얘기한다. 비록 내가 6과의 방어벽 - 용어가 정확치 않음 ^^; - 에 쫓겨 이 곳에 있지만, 이 곳에 남은 것은 내 의지이다. 따라서 난 하나의 생명체이다. 인공성(artificiality)과 진정성(authenticity)의 대립. 인형사의 의미 심장한 한마디. ‘너희는 새로운 생명관을 확립하는 것에 소홀했다’ ‘공각기동대’ 에는 여러 종류의 생명 모델이 나온다. 순수(?) 인간, 몸의 많은 부분이 의체로 구성된 인간, 영혼을 해킹당한 인간, 인간의 통제를 벗어난 프로그램. ‘공각기동대’ 는 바로 이들 사이에 존재하는 생명의 경계를 묻고 있다. 참으로 인상적인 말. ‘과학은 생명을 정의할 수 없다’. 이 말은 차라리 지금의 과학 수준을 꼬집는 것이라기 보다는 과학에만 의존하는 생명관을 비판한다고 보아야 할 것이다. 공각기동대는 비록 우리가 생물학 수준에서 논의되고 있는 생명관조차도 많은 혼란을 겪고 있지만 이보다 나아가서 기계 수준, 더 나아가 인공지능과 디지털 문명의 발달 속에서 예견되는 디지털 생명을

< X 파일 > [ 회색지대 ] 편을 보고...

‘X 파일’은 그 제목에서 느껴지는 것처럼 참으로 많은 해석의 여지를 가지고 있다. 이번 주( 10 월 04 일 ) 에 방영되었던 ‘회색지대’ 역시 마찬가지이다. 일단 ‘회색지대’ 라는 제목이 어떤 의미를 가지고 있는가는 미루어 두기로 하자. 내용의 시작은 이렇다. ‘브라운산’을 올랐던 한 부부가 유골만 남은 채 발견된다. 당연히 이 사건은 멀더와 스컬리에게 맡겨지고, 역시 당연히 이들은 각자의 입장( 멀더는 신비주의, 스컬리는 과학주의 ) 에 입각해서 사건을 풀어나가려고 한다. 언제나처럼 둘은 충돌하지만, 역시 언제나처럼 사건은 풀리기 시작한다. 먼저 멀더는 시체 부검을 하는 스컬리를 떠나서 홀로 브라운산을 오른다. 놀랍게도 그 곳에서 이미 유골이 발견된 부부의 남편을 발견하고 그를 뒤쫓는다. 그 남편은 어느 동굴 속으로 들어가고, 멀더 역시 그를 뒤따른다. 기어코 남편을 만나게 되고, 멀더가 그로부터 듣게 되는 얘기는 멀더가 진실이라고 여기는 바로 그것이다. 이 때 어디선가 빛이 들어오게 되는데, 그 남편은 그들이라고 얘기하면 숨지만, 멀더는 ( 원래 주인공들은 다 강심장인가 ? ) 그 빛을 쫓아간다. 극 속에서 그 빛은 멀더를 찾아온 스컬리의 손전등 빛이라는 암시를 준다. 갑자기 화면이 바뀌며, 스컬리가 멀더의 방문을 두드린다. 방문은 열리고, 스컬리는 멀더의 방에 있는 부부를 보고 놀란다. 게다가 멀더가 숨겨놓은 외계인을 보며, 또 그와 텔레파시가 통하며 자신이 믿어왔던 모든 가치관을 부정해 버리며, 멀더가 옳았음을 인정한다. 그런데 멀더는 자신이 그렇게 주장하던 것들이 진실로써 판명되고 있음에도 불구하고, 의아함을 느낀다. 그리고 그는 머리에 통증을 느낀다. 하나씩 사라지는 주위 환경을 보며. 이번에는 스컬리. 스컬리는 멀더를 찾아서 브라운산으로 올라간다. 올라가던 도중 야생 버섯의 포자를 밟는다. 그리고 땅속에서 솟아나는 액체를 발견한다. 이 때 스컬리는 전에 없던 유골을 발견하게 되고, 그 유골이 멀더의 것임을 알게 된다. 이 때 같

탈학교론 비판

교육. 이만큼 관심을 끌고 있는 화두도 드물 것이다. 혹자는 이런 관심 마저도 부족한 것이라 말을 하지만 말이다. 이한씨가 쓴 '학교를 넘어서' 를 접하게 된 것은 작년, 98 년 2 학기 때였다. 그때 내게는 이 책, '학교를 넘어서' 와 천보선 김학한씨가 공저한 '신자유주의와 한국교육의 진로' 라는 책이 있었다. 굳이 구분을 짓자면, '학교를 넘어서' 는 주로 탈학교론의 입장에 서 있었고, '신자유주의와 한국교육의 진로' 는 그와는 반대 입장을 취하고 있었다. 이한씨가 '학교를 넘어서' 를 쓰면서 주로 의존했던 사람은 탈학교론의 주창자인 일리치, 그리고 라이만, 게토, 이들과는 어느 정도 거리가 있는 닐들이 있다. 우선 전자의 사람들을 살펴보자. 이들의 의견은 학교를 거시적 관점에서 바라보고 있으며, 맑스주의의 입장에서 학교를 지배계급의 의식 주입소로써 파악하고 있다. 이들은 학교의 발생 상황을 해석하면서 자본의 요구에 부합하는 노동자들을 길러내기 위해서 학교, 근대적 학교가 만들어졌다고 결론짓는다. 비록 이런 학교 때문에 노동자들의 파생적 이익은 있었지만, 어디까지나 학교의 본질은 자본가들의 이익을 대변하는 것이라고 주장한다. 비록 발생학적 분석은 아니지만, 푸코의 경우에도 이와 비슷한 문제를 제기한다. 푸코는 권력을 분석하면서, 학교와 군대가 일련의 주체를 생산하고 있다고 얘기한다. 근대적 규율 체계로써의 학교말이다. 그렇다면 닐에게서는 어떤 것을 얻고 있는가. 닐은 '자율교육' 을 주장했던 사람이다. 전자의 사람들이 계급의 관점에서 학교의 해체를 주장했다면, 닐의 경우 '권리' 의 측면으로 교육 문제를 바라보았다고 볼 수 있다. 이한씨의 경우에는 어떠한가. 이가 문제삼고 있는 것은, 학교의 경직성, 교사와 학생 사이에 벌어지는 종속 관계, 학생들의 객체화 따위이다. 그리고 이것으로부터 학교의 해체로써 나아간다. 그리고 그 대안으

< 어린왕자 > 를 읽고...

어린왕자. 내 기억으로는 이 책을 처음 접하게 된 것이 초등학교 6 학년 때쯤이었던 것 같다. 자주 들르지도 않던 책방에서 누군가가 집어준 이 책을 이제 다시 읽어보니 감회가 새롭다. 다시금 읽으면서 과연 그 때는 어떤 생각을 하며 읽었을까 ? 하는 궁금증이 생기기도 한다. 물론 그 때의 내 기억은 남아있지 않지만... ‘어린왕자’ 하면 가장 먼저 떠오르는 장면이 여우와 어린왕자가 서로를 ‘길들이는’ 장면이었다. 이번에도 역시 가장 관심 깊게 읽히는 부분은 바로 이 부분이었다. 여우는 이렇게 말한다. “넌 나에게 아직은 많은 다른 소년들과 다를 바 없는 한 소년일 뿐이야. 그래서 난 너를 필요로 하지는 않지. 또 너도 나를 필요로 하지 않고. 너에게 나는 다른 많은 여우들과 다를 바 없는 여우 한 마리에 지나지 않거든. 그렇지만 만약 네가 날 길들인다면 우리는 서로를 필요로 하게 되는 거야. 너는 나에게 이 세상에서 단 하나뿐인 존재가 되는 거고, 나도 너에게 세상에서 유일한 존재가 되는 거야...” 지금의 우리 현실을 돌이켜 보자. 여기저기서 들려오는 학교붕괴, 교실붕괴, 사제지간의 폭력과 고발... 이들은 서로 얽히고 설켜서 따로 따로 정확히 구분할 수 없지만, 어느 수준에서 각기 비슷한 원인을 가지면서도 서로 다른 결과를 가지는 현상들이다. 일단 학교붕괴는 차후에 논하기로 하고, 교실붕괴 현상을 살펴보자. 교실붕괴를 정의하자면, 학급내의 유대관계가 무너지면서 서로 간의 불신이 확산되고, 결국에는 서로가 서로에게 무관심한 개인들로 파편화되는 현상이라고 할 수 있다. 어떤 이들은 이런 교실붕괴 현상의 원인을 교실외적 요소에서 찾기도 한다. 다시 말해서, 예전에는 학교가 독점해왔던 정보 제공의 역할을 이제는 사설 입시 학원이라든지, 인터넷 따위에서 원하는 정보를 얼마든지 얻을 수 있기 때문에, 굳이 시대에 뒤떨어지는 학교에서 생활을 하지 않아도 된다는 것이다. 바로 이러한 점 때문에, 점차 학교 생활에 소홀해지게되고 그런 상황에서 학급내의 유

< 허준 > 을 보고...

한동안 모든 언론과 여론을 뜨겁게 달구었던 교육 문제가 잠시 가라앉은 상태에 있지만, MBC 에서 방송하고 있는 ‘허준’ 은 이런 측면에서 남다른 의미를 가진다고 생각된다. ‘허준’ 이라는 드라마에서 주목하는 인물은 ‘유의태’ 이다. 바로 그가 지향하고 있는 의원의 상을 분석해 봄으로써 이 시대를 점하고 있는 교육관에 대한 비판을 해보고자 한다. 드라마를 꾸준히 보았던 사람이라면 쉽게 알 수 있겠지만, 유의태라는 인물이 이상향으로 삼고 있는 의원의 모습은 ‘심의’ 이다. 그렇다면 이 ‘심의’ 라는 것은 어떤 것인가 ? 이에 대한 대답은 유의태와 나병 환자를 치료하면서 간혹 찾아오는 그의 친구, 그리고 유도지라는 유의태의 아들 사이에 있었던 대화로부터 알아볼 수 있다. 그 친구는 유도지에게 묻는다. ‘의원에게 가장 중요한 것이 무엇인가 ?’ ‘...’ ‘긍휼일세’ ( 물론 정확하게 이런 대사를 했다고 믿는 분은 없으시죠 ? 그냥 이런 의미의 대화였슴다. ^^; ) 우리는 이와 더불어 이런 대화가 어느 시점에서 이루어졌는지를 알아볼 필요가 있다. 이 대화는 유도지가, 자신의 아버지인 유의태가 어의 양외수와 벌인 구침지의 사건 때문에 의과 시험에 떨어지고 난 시점에서 이루어진 대화였다. 따라서 이 대화가 가지고 있는 의미는 유도지가 가지고 있는 의원에 대한 가치관에 대한 비판이었던 것이다. 결국 의원의 최고 경지인 심의는 어떤 벼슬 자리로서 인정받는 것이 아님을, 자신의 마음가짐을 통해서 끊임없이 정진해야 하는 것임을 알 수 있다. 이런 견해는 허준이 정경 부인의 풍을 치료하고서, 우상 대감의 서찰을 받은 것에 대한 유의태의 태도를 통해 다시 한 번, 더욱 극명하게 확인할 수 있다. 유의태는 허준이 꺼낸 서찰을 불에 태우면서 이런 말을 한다. ‘네 놈이 그 서찰을 받아둔 순간부터 너는 의원이기를 포기한 것이다.’ 그리고 다음의 대사 역시 빠뜨릴 수 없는 중요한 대사이다. ‘나에게서 배운 것을 기량을 늘리는데 쓰지 않

< 시간을 달리는 소녀 > 를 보고...

20대 초반 시절, 꽤나 철학에 빠져 있었던 적이 있었다. 그 중에서도 특히 나를 사로잡았던 사람은 질르 들뢰즈라는 철학자였다. 그를 부를 때 많은 사람들은 '긍정의 철학자' 또는 '차이의 철학자'라고 부른다. '시간을 달리는 소녀'를 얘기하다가 뜬금없이 웬 철학자 타령이냐고 ? 이 애니에서 표현하고자 하는 바가 바로 들뢰즈가 아니 내가 읽은 들뢰즈가 말하고자 하는 바였다고 느꼈기 때문이다. 들뢰즈는 그 시작을 철학사 연구에서 했다. 흔히들 얘기하는 비주류 철학자들을 역사속에서 재구성해 낸 것으로도 유명하다. 저멀리 둔스스코투스부터 스피노자 그리고 니체와 베르그송에 이르기까지. 그의 해석은 다른 사람들이 오역이라고 일컬을 만큼 독특했고 창의적이었다. 요즘에는 이러한 오역을 자의적 오역이라고도 한다. 특히 니체에 대한 해석은 하이데거의 해석에 따라 니체가 파시즘을 옹호한 철학자라는 오명을 벗겨낸 것으로 유명하다. 그에 따르면 니체는 차이를 인정한 철학자이지 결코 동일성을 옹호한 철학자는 아니다. 하이데거는 니체의 영원회귀를 해석하면서 동일한 것만이 반복된다고 말했다. 오로지 동일한 것만이 반복되고 차이나는 것은 반복되지 않는다. 다시 말하면 차이나는 것은 사라지고 없어져야 하는 것이다. 아마도 이러한 생각이 게르만 우월주의와 파시즘적 사고를 지탱하는 근거가 아니었을까 ? 그리고 저 끔찍한 홀로코스트에 대한 사상적 배경임과 동시에... 하지만 들뢰즈는 니체의 영원회귀를 하이데거와는 다르게 해석한다. 바로 차이나는 것만이 반복된다는 것이다. 얼핏 들으면 모순이 될 듯한 말이지만, 결코 그렇지 않다는 것이 들뢰즈의 생각이며, 나 역시 동의한다. 그리고 이 애니에 이것이 그대로 드러나 있다. 굳이 도형을 이용해서 설명하자면 하이데거의 영원회귀가 완전한 원이라면, 들뢰즈의 영원회귀는 나선이라고 볼 수 있다. 이 둘의 비교는 일상을 통해서 보면 더욱 확실히 알 수 있다. 하이데거의 경우, 일상은 언제나

내 맘대로 비교하기: SubGit vs git-svn

이미지
svn 은 그 자체로 훌륭한 VCS 이지만, 로컬에서 패치를 관리해야 하는 순간, 지옥의 나락으로 떨어진다. 이를 해소하기 위한 방법에  git 가 있다. git 는 자체적으로 svn 저장소에 접근할 수 있는 기능이 있다. 바로 git-svn 이다. 이를 이용하면 svn 클라이언트가 없더라도 git 를 이용해서 svn 저장소를 관리할 수 있다. 그런데 불행히도 내가 주로 사용하는  OS/2 에서는 git-svn 이 제공되지 않고 있다. 이렇다 보니, git-svn 을 대신할 프로그램이 필요했는데, SubGit 이라는 프로그램이 있었다. 예전에는 SubGit 을 이용해서 svn 저장소를 git 저장소로 바꾸는데 이용했었는데, 이번에는 svn 저장소에 지속적으로 접근할 필요가 있었다. git-svn 처럼 SubGit 도 이런 기능을 제공하고 있었다. 그렇다면, git-svn 과 SubGit 중에 어느 것이 더 괜찮을까 ? 각각의 장단점을 간단하게나마 살펴보자. git-svn git-svn 은 git 가 대부분의 OS 에서 기본적으로 지원하고 있다. 따라서 별도의 프로그램이 필요없고 svn 저장소를 직접 접근하므로 별도의 저장소가 필요없다는 장점이 있다. 하지만 git-svn 은 기존의 git 명령 체계와는 다른 별도의 git-svn 명령 체계를 써야 한다는 점이 불편한다. 자칫 잘못해서 git-svn 대신 git 명령을 사용하면 로컬 저장소가 엉망이 될 수도 있다. SubGit SubGit 을 쓰기 위해서는 Java 1.6 이상이 필요하다. git-svn 과는 달리 별도의 프로그램이 필요하다는 것이 단점일 수 있겠지만, Java 는 이미 기본 프로그램으로 자리잡고 있으므로, 큰 문제는 아니라고 본다. 하지만 더 큰 문제는 git-svn 과는 다르게 SubGit 은 별도의 git 저장소를 만든다는 점이다. 따라서 SubGit 은 두 개의 저장소가 필요하다. 하나는 svn 저장소를 git 형태로 바꾼 git 서버 저장소. 다른 하나는 사용

OS/2 tricks: Qt Creator and Perforce

이미지
If you are developing with Qt 4 on OS/2, Qt Creator is your best tool. By the way, Right after Qt Creator is started, a system is frozen during about 30 seconds. Unfortuantely, I could not find the cause of this. So just waited for a system to be unfrozen. Meanwhlie, some messages related to Perforce(p4) are being printed on a message window. I'm using p4 to access 4os2 repository. Hoping to fix this problem, I removed it from Qt Creator settings([Tools] - [Options] - [Version Control] - [Perfoce] - [Configuration] - [P4 command]). By this, the problem was fixed really. If you are using Perfoce(p4) and Qt Creator cause a system to be frozen, remove the settings for P4 from Qt Creator.

Porting to OS/2: Case #16 mmap()

mmap() is used to map a file into memory. It is known that using mmap() is more efficiency than using file-related functions such as read()/write(). So many projects are using it. Unfortunately, however, OS/2 kLIBC does not support mmap(). And OS/2 itself does not have features corresponding to mmap() directly. Because of this, there is need to implement mmap() by ourselves. When I was porting binary codec support of MPlayer to OS/2, mmap() was needed. Although it does not have all the features which mmap() has, it is useful generally. // ----- 2014/11/04 It support MAP_PRIVATE, partially MAP_FIXED but not MAP_SHARED. It supports MAP_PRIVATE, MAP_SHARED and partially MAP_FIXED. // ----- mmap.c mmap.h mmap-1.c mmap-1.c is a test program for mmap(). To build, gcc -o mmap-1.exe mmap-1.c mmap.c Finally, you should be careful for translation mode. If opening in text mode, translation of CR/LF to LF may cause unexpected behaviors. And even if opening in binary mode, you sho

OS/2 codes: Get an error message from an OS/2 error code

Sometimes, it is needed to get an error message from an error code. In C, strerror() does it. Of course, there are OS/2 APIs for this. It is DosGetMessage(). However, this is a general function not only for an error message. So let's introduce a special function to get an error message using DosGetMessage(). dosgeterrormessage.c dosgeterrormessage.h What DosGetErrorMessage() does is simple. It gets an error message from OSO001.MSG with DosGetMessage(). And replaces CR/LF to LF. Finally removes LF right before EOF.

Porting to OS/2: Case #15 fast mutex

Mutex(mutual-exclusive) is used to synchronize executions of threads. Of course, OS/2 supports mutex very well. But, there is one caution. OS/2 mutex is a recursive mutex. That is, if a thread requests a mutex which is already owned by a different thread, that thread is blocked. But if a thread which already owns a mutex requests the same mutex, then it succeeds. This is a recursive mutex. In general, this works well. However, sometimes a non-recursive mutex, so called fast mutex, is needed. That is, even if an owner thread requests its owning mutex, that thread should be blocked, get an error at least. A fast mutex can be implemented easily with a recursive mutex of OS/2. The following are the codes. Colored By Color Scripter ™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 #define  INCL_DOS #include  <os2.h

Porting to OS/2: Case #14 open() and DASD access

On Unix-like systems, open() can open various devices including files, storages and so on. On OS/2 kLIBC as well, open() does like that. However, open() of kLIBC does not support DASD. If you open [x:] expecting to open a drive x: in DASD mode, your expectation will go wrong. Although open() for x: succeeds, it is not for DASD mode, but for a directory. The handle returned can be used with functions which do not alter a file position and contents. For examples, fchdir() and fstat(). Then what is how to open in DASD mode ? Use a wrapper function for DosOpen(). The following are the codes used by libdvdnav.  Colored By Color Scripter ™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #ifdef  __OS2__ #define  INCL_DOS #include  <os2safe.h> #include  <os2.h> #include  <io.h>      /* setmode() */ #include  <fcntl.h>   /* O_BINARY  */ #endif #ifdef  __OS2__ #define  open os2_open static   int  os2_open( const   char  *name, 

Porting to OS/2: Case #13 iconv()

iconv() is used to convert one charset  to the other charset. OS/2 kLIBC supports iconv() natively using Uni*() APIs of OS/2. By the way, it has some limitations which Uni*() APIs have. That is, kLIBC iconv() does not support charsets which is not supported by Uni*() APIs. For examples, Uni*() APIs does not support UTF charsets except UTF-8. And some extensions are not supported. For examples, //TRANSLIT and //IGNORE. So if you use kLIBC iconv() with some projects, iconv() may fail due to these. To workaround these, you may use a wrapper function like this. Colored By Color Scripter ™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #if   defined (__KLIBC__) && ! defined (iconv_open) /* kLIBC iconv_open() does not support UTF-16LE and //TRANSLIT */ static  iconv_t os2_iconv_open ( const   char  *tocode,  const   char  *fromcode) {      char  to[strlen(tocode) + 1];      char  from[strlen(fromcode) + 1];      char  *p;

Porting to OS/2: Case #12 readdir_r() and struct dirent

readdir() and readdir_r() are used to read directory entries. And readdir_r() is a re-entrant version of readdir(). Because of this, readdir_r() requires additional arguments. Let's see prototypes of them. struct dirent *readdir(DIR * dirp );   int readdir_r(DIR * dirp , struct dirent * entry , struct dirent ** result ); As you see, readdir_r() requires [struct dirent *entry]. And entry should be large enough for a dirent. For this, the recommended portable codes are like this. Colored By Color Scripter ™ 1 2 3 4 5 name_max = pathconf(dirpath, _PC_NAME_MAX); if  (name_max == -1)          /* Limit not defined, or error */     name_max = 255;          /* Take a guess */ len = offsetof( struct  dirent, d_name) + name_max + 1; entryp = malloc(len); By the way, this code does not work on kLIBC. Why ? First, let's see [struct dirent]. In general, It is defined like this, Colored By Color Scripter ™ 1 2 3 4 5 6 7 8 struct  dirent {     ino_t          d_i