gug-bg-herd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [kazehakase]: FTBFS под GNU/Hurd: mozilla.cpp:132: error: 'PATH_MAX'


From: Yavor Doganov
Subject: Re: [kazehakase]: FTBFS под GNU/Hurd: mozilla.cpp:132: error: 'PATH_MAX' was not declared in this scope
Date: Fri, 21 Aug 2009 15:40:34 +0300

В 17:40 +0000 на 20.08.2009 (чт), Dimitur Kirov написа:
> strlen трябва да се избягва, освен ако не сме сигурни, че xpcomPath
> съдържа \0, а като гледам - не сме

Нали в Си (надявам се и C++) всеки низ съхраняван в (указател на) char
по конвенция завършва с \0?  Или нещо не съм разбрал...

> ако GRE_GetGREPathWithProperties не е променила xpcomPath тогава

Възможна ли е тази ситуация?  На мен ми се струва, че не е.

> (ако наистина се налага този алгоритъм)

Със сигурност се налага да не се ползва PATH_MAX.  По мои спомени и
наблюдения от debian-hurd най-често се ползва този механизъм.  Сега
погледнах напътствията:

Every unconditionalized use of PATH_MAX, MAX_PATH or MAXPATHLEN is a
POSIX incompatibility. If there is no upper limit on the length of a
path (as its the case for GNU), this symbol is not defined in any header
file. Instead, you need to either use a different implementation that
does not rely on the length of a string or use sysconf() to query the
length at runtime. If sysconf() returns -1, you have to use realloc() to
allocate the needed memory dynamically. Usually it is thus simpler to
just use dynamic allocation. Sometimes the amount is actually known.
Else, a geometrically growing loop can be used: for instance, see Alioth
patch or Pulseaudio patch [1]. Note that in some cases there are GNU
extensions that just work fine: when the __GLIBC__ macro is defined,
getcwd() calls can be just replaced by get_current_dir_name() calls.

> if (NS_FAILED(rv)) {
>         if (rv != NS_ERROR_FILE_NAME_TOO_LONG) {
>                 goto out;
>         }
> } else {
>         break;
> }

Така няма никакво излизане от цикъла -- пробвай го само да видиш как за
нула време се поставя машината на колене :-D.

> От кръпката личи, че етикетът out винаги ще се изпълни, което 
> означава, че функцията винаги връща FALSE.

:-(.  Бях го сложил накрая, но не се компилира:

mozilla.cpp: In function ‘gboolean xulrunner_init()’:
mozilla.cpp:183: error: jump to label ‘out’
mozilla.cpp:172: error:   from here
mozilla.cpp:174: error:   crosses initialization of ‘char* lastSlash’

Освен да разкарам етикета и да дублирам кода, нищо друго не виждам като
решение.

> [1] http://mxr.mozilla.org/mozilla/source/xpcom/glue/nsGREGlue.cpp#150

Великите модзиладжии ползват MAXPATHLEN в имплементацията на тази
функция (и най-вероятно на много други места), което обяснява защо няма
xulrunner на тази платформа.  Което пък означава, че кръпката за Kz не е
особено необходима поне засега :-).

[1]
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=patch-pulse;att=1;bug=522100

reply via email to

[Prev in Thread] Current Thread [Next in Thread]