05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

19 {<br />

6.3 Open<strong>SSL</strong>-Basisfunktionalität 349<br />

20 /* Typumwandlung von pthread_t nach unsigned long */<br />

21 return( (unsigned long)pthread_self() );<br />

22 }<br />

23<br />

24 void openssl_mutex_lock( int mode, int n, const char *file,<br />

25 int line )<br />

26 {<br />

27 if( mode & CRYPTO_LOCK ) /* Lock oder Unlock? */<br />

28 pthread_mutex_lock( &openssl_mutex[n] );<br />

29 else<br />

30 pthread_mutex_unlock( &openssl_mutex[n] );<br />

31 }<br />

15–16<br />

18–22<br />

24–31<br />

Anschließend vereinbaren wir <strong>mit</strong> openssl_mutex einen Zeiger auf ein Feld<br />

von Mutex-Variablen, welches wir später anlegen <strong>und</strong> initialisieren werden.<br />

Das Feld dient dem <strong>mit</strong> CRYPTO_set_locking_callback() gesetzten statischen<br />

Mutex-Callback als Mutex-Vorrat“.<br />

”<br />

Die Funktion openssl_thread_id() liefert die von Open<strong>SSL</strong> zur Identifikation<br />

bzw. Unterscheidung der einzelnen <strong>Threads</strong> benötigte Thread-ID als<br />

unsigned long. DerRückgabewert entsteht durch eine Typumwandlung der<br />

von pthread_self() gelieferten opaquen Thread-ID pthread_t in eine vorzeichnlose<br />

lange Ganzzahl. 23<br />

Mit Hilfe der openssl_mutex_lock()-Funktion kann der n-te Mutex des statisch<br />

vereinbarten Mutex-Felds gesperrt oder freigegeben werden. Ist in mode<br />

das CRYPTO_LOCK-Flag gesetzt, so wird der Mutex gesperrt, andernfalls wird<br />

er wieder freigegeben.<br />

Beispiel 6.3. openssl-thread-init.c, Teil 2<br />

33 struct CRYPTO_dynlock_value *openssl_dl_create(<br />

34 const char *file, int line )<br />

35 {<br />

36 int st;<br />

37 struct CRYPTO_dynlock_value *dl;<br />

38<br />

23 Die hier gezeigte Typumwandlung ist eigentlich nicht ganz ”<br />

sauber“, denn der<br />

POSIX-Standard trifft keine Aussage über den Aufbau der opaquen Datenstruktur<br />

pthread_t. Insofern ist leider nicht zu 100% sichergestellt, daß die vorgenommene<br />

Umwandlung tatsächlich eine eindeutige Identifikation des <strong>Threads</strong> durch<br />

den von openssl_thread_id() zurückgelieferten Wert erlaubt. Andererseits funktioniert<br />

das Verfahren für alle gängigen <strong>Unix</strong>-Systeme <strong>und</strong> so ist die hier vorgestellte<br />

Implementierung auch die in der Literatur geläufige Umsetzung für diese<br />

Callback-Funktion.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!