Page 1 of 3

libini + libio

Posted: Tue Aug 05, 2008 2:37 am
by trolly
hello,

i come back after several month. i project to make a new dock like the CDE panel , and i want to use a text based configuration file. i know that the libini exist, but i don't know hot to use them.

I need a tutorial!!

can anybody help me?

Re: libini

Posted: Tue Aug 05, 2008 2:27 pm
by hidnplayr
You're good on luck my friend!
I started to write one on the Wiki yesterday, i'll give you a link when it's done ;)

Re: libini

Posted: Tue Aug 05, 2008 6:47 pm
by Albom
It's great! A tutorial of libini using is what I need in my Shell project. Please write also how to use libini with gcc (MinGW). Write prototypes for functions and interface to init procedure. I wrote an own prototype (with asm("")) but it crashes the program. Btw why fastcall in init procedure is used? (stdcall is used in other functions, am I right?)

Re: libini

Posted: Tue Aug 05, 2008 8:47 pm
by hidnplayr
I have no experience with GCC in kolibri, and dont have plans to use it in the near future, but i'll do my best trying to explain libINI in a common way..

The article will be placed at http://wiki.kolibrios.org/Libini, but its incomplete and probably has bugs right now.

PS: Albom, just curious, why do you write your shell in gcc ?

Re: libini

Posted: Fri Dec 21, 2012 8:12 pm
by IgorA
Нашел серйозный глюк в библиотеке libio
При вызове функции file.close с нулевым указателем не делается проверка на то что он нулевой и в результате затирается системная память.
Глюк может проявлятся в случаях когда программа использует библиотеку libini, но при этом самого файла ini на диске нет. В таком случае идет попытка закрыть нулевой указатель на файл, что приводит к последующему вылету приложения, которое пыталось считать настройки из несуществующего файла.
Предлагаю такой вариант функции file.close :

Code: Select all

;;================================================================================================;;
proc file.close _filed ;//////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Close file                                                                                     ;;
;;------------------------------------------------------------------------------------------------;;
;> _filed = file descriptor (see `file.open`) <InternalFileInfo*>                                 ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = -1 (error) / file pointer position <dword>                                               ;;
;;------------------------------------------------------------------------------------------------;;
;# call `file.err` to obtain extended error information                                           ;;
;;================================================================================================;;
        cmp eax,32
        jb .exit_error
        mov     eax, [_filed]
        mov     [eax + InternalFileInfo.Mode], 0
        mov     [eax + InternalFileInfo.FileName], 0
        invoke  mem.free, eax
        xor     eax, eax
        jmp @f
        .exit_error:
        or      eax, -1
        @@:
        ret
endp
Если никто не против, то обновлю файл libio.asm . У меня просто вызывает сомнение коментарий:
eax = -1 (error) / file pointer position
Т. е. судя по коментарию в случае ошибки должно вернуться -1, но я не знаю стоит ли это значение возвращать ? Просто судя по всему оно вообще нигде не использовалось, нужно ли оно ?
Т. е. строка в моем коде:

Code: Select all

or      eax, -1
вроди бы и не нужна ...

Re: libini

Posted: Fri Dec 21, 2012 8:49 pm
by CleverMouse
[sarcasm]Ещё более страшный глюк в libio: если в file.close передать взятое с потолка число, то file.close просто уронит программу!!![/sarcasm]

Re: libini

Posted: Fri Dec 21, 2012 9:03 pm
by IgorA
CleverMouse wrote:Ещё более страшный глюк в libio: если в file.close передать взятое с потолка число, то file.close просто уронит программу!!!
делаем вот что :
1) из папки rd/1/develop удаляем файл t_edit.ini
2) запускаем программу t_edit
3) тянем скроллинг вниз
... и программа завершается с ошибкой ...
Я почти весь загрузочный код в t_edit облазил, пока не понял что ошибка в самой библиотеке libini а не в программе t_edit.
Я более чем уверен что подобный фокус сработает с любой программой использующей ini файлы.
После сделанных мною исправлений глюк пропадает.

Re: libini

Posted: Fri Dec 21, 2012 9:04 pm
by CleverMouse
Ну так тогда это баг в libini, а не в libio, и исправлять его надо в libini.

Re: libini

Posted: Fri Dec 21, 2012 10:04 pm
by IgorA
ревизия 3130
Исправил в libio, потому что в libini функция file.close вызывается 8 раз. Также по правилам программирования попытка удалить объект с нулевым указателем не должна заканчиватся ошибкой. Учитывая выше сказанное исправил в libio.
Также немного оптимизировал файл editbox.mac.

Re: libini

Posted: Fri Dec 21, 2012 10:29 pm
by CleverMouse
Обе причины не принимаются. Копипаста в каком-то коде - не повод ставить костыли специально для этого кода где-то в нормально работающем месте. Про правила программирования я предлагаю порассказывать авторам libc:

Code: Select all

$ cat 1.c
#include <stdio.h>
int main() { fclose(NULL); return 0; }
$ gcc 1.c && ./a.out
Segmentation fault
Я откатила изменения в libio в r3131 и закоммитила фикс в правильное место libimg. Заодно выяснилось, что в ini_set_str была утечка памяти.

Re: libini

Posted: Fri Dec 21, 2012 11:18 pm
by IgorA
CleverMouse wrote:Заодно выяснилось, что в ini_set_str была утечка памяти.
это очень хорошо что оно выяснилось
CleverMouse wrote:Про правила программирования я предлагаю порассказывать авторам libc:
Большую часть судя по авторству написали diamond и mikedld, оба покинули проэкт. А вот что я нашел на wiki в описании функции file.close
file_close

Закрыть файл.

Прототип:
proc file.close _filed

Аргументы:
_filed → InternalFileInfo*
дескриптор файла (см. file_open)

Результат:
eax → dword
-1 (ошибка) / 0
Судя по всему авторы планировали что при каких-то случаях будет возвращатся -1, вот только теперь не ясно при каких. Видимо wiki прийдется поправить. Вообще не понятно что должна возвращать функция file.close ? Сейчас она всегда возвращает 0.

Re: libini

Posted: Fri Dec 21, 2012 11:34 pm
by SoUrcerer
Большую часть судя по авторству написали diamond и mikedld, оба покинули проэкт. А вот что я нашел на wiki в описании функции file.close
Я так понимаю, имелась в виду POSIX.1 C Library
Библиотека libio ставит перед собой цель сделать ассемблерные функции, эквивалентные файловым операциям из LibC. Соответственно,
int fclose( FILE *stream );

Closes the given file stream. Any unwritten buffered data are flushed to the OS. Any unread buffered data are discarded.

Whether or not the operation succeeds, the stream is no longer associated with a file, and the buffer allocated by setbuf or setvbuf, if any, is also disassociated and deallocated if automatic allocation was used.
Parameters
stream - the file stream to close
Return value

​0​ on success, EOF otherwise
Однако, fclose при передаче неверного указателя вызывает сегфолт на всех проверенных мной библиотеках libc - newlib, GNU libc (Linux), GNU libc (mingw), libtcc1. Если копнуть глубже, видимо, так и должно быть по стандарту.

Re: libini

Posted: Fri Dec 21, 2012 11:38 pm
by SoUrcerer
Хм, банальное гугление https://www.google.com/search?q=fclose(NULL) - дает ответ, что fclose(NULL) есть undefined behavior, и закрывать можно только 100%-валидные потоки.

Re: libini

Posted: Tue Mar 12, 2013 2:50 pm
by Jaeger
Правильно ли я понял по коду, что, если _callback возвращает 0, то enum_sections и enum_keys немедленно завершаются?
Можно я допишу это в Wiki?

Posted: Fri Jul 05, 2013 5:34 pm
by punk_joker
А есть полный перечень функций библиотеки? И еще, есть ли общий способ узнать имена функций любой библиотеки?