To ja może podsumuję tutaj znane mi problemy pod MSVC i Win32 ogólnie:

- Na Win32 obecnie nie można polegać na errno, bo funkcje Windows
Sockets go nie ustawiają. Mam na to prawie gotową łatę w duchu
sugestii Wojtka z tego wątku.

- Na Win32 gniazda trzeba zamykać za pomocą closesocket(), ale pliki
nadal za pomocą close() (właściwie _close(), ale close() też działa).
Ja mam na to łatę w postaci funkcji gg_closesocket() opakowującej
odpowiednią funkcję systemową. Jedyne, co mi tu się troszkę nie
podoba, to ta nazwa wskazująca na gniazdo, a muszę jej używać również
w przypadku deskryptorów resolvera. Technicznie oczywiście nie ma tu
problemu, bo na Win32 one muszą być gniazdami, a gdzie indziej i tak
to się sprowadza do zwykłego close().

- Na Win32 deskryptory gniazd to liczby bez znaku (w 32-bitowej
bibliotece rozmiaru inta, w 64-bitowej niestety większe, czym zacznę
się martwić po rozwiązaniu tutaj opisanych problemów) i zgodnie z MSDN
nic nie stoi na przeszkodzie, aby wartością tej liczby było np.
UINT_MAX-1 (UINT_MAX to INVALID_SOCKET, co na szczęście odpowiada -1).
A widziałem w jednym miejscu kod typu if ((fd = sockfunc(...)) < 1),
który na taką wartość nie jest "odporny". Myślę, że trzeba by
zlokalizować takie miejsca i warunek zamienić na przykład na (fd == 0
|| fd == -1).

- MSVC odmawia kompilacji pustej struktury gg_dcc7_dunno1. Jak dla
mnie można by ją spokojnie usunąć lub zakomentować.

- MSVC nie posiada nagłówków unistd.h i inttypes.h. Ten drugi jest
używany w message.h nie patrząc się na config.h, co chyba można by
jakoś zmienić.

- Pliki dcc.c, dcc7.c i sha1.c w katalogu src pod MSVC potrzebują
nagłówka io.h, który definiuje część rzeczy znanych z unistd.h w GCC.

- MSVC nie definiuje S_IWUSR, natomiast definiuje jego przedposixowy
synonim S_IWRITE.

- MSVC nie posiada funkcji snprintf, posiada natomiast _snprintf,
która jest co prawda niezgodna z C99, ale na potrzebny libgadu powinna
wystarczyć.

- MSVC nie posiada funkcji strcasecmp ani strncasecmp, ale posiada ich
dokładne odpowiedniki stricmp i strnicmp.

- MSVC nie akceptuje "arg..." jako argument makra. Wydaje mi się, że
mam na to proste rozwiązanie, ale muszę je przetestować.

Powrzucałbym skończone łatki, jakie mam, do repozytorium libgadu, ale
nie mam do końca wyczucia, które z kilku możliwych rozwiązań każdego
problemu jest najbardziej pożądane. Chyba wrzucę to wszystko do
jakiegoś zewnętrznego repozytorium, tak jak zresztą już wcześniej
planowałem.

Pozdrawiam,
Bartosz
_______________________________________________
libgadu-devel mailing list
libgadu-devel@lists.ziew.org
http://lists.ziew.org/mailman/listinfo/libgadu-devel

Reply via email to