File: porting.html

package info (click to toggle)
silc-toolkit 1.1.10-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 34,068 kB
  • ctags: 8,578
  • sloc: ansic: 79,872; sh: 9,948; cpp: 1,480; asm: 1,001; makefile: 188; perl: 126
file content (872 lines) | stat: -rw-r--r-- 42,501 bytes parent folder | download | duplicates (2)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-a" />
 <meta http-equiv="Content-Language" content="en" />
 <meta name="description" content="SILC Secure Internet Live Conferencing" />
 <meta name="keywords" content="SILC, secure, chat, protocol, cipher, encrypt, SKE" />
 <meta content="INDEX, FOLLOW" name="ROBOTS" />
 <style type="text/css">
  <!--
  body { color: #000000; background: #f0f0f0; font-family: Helvetica, Arial, Sans-serif; }
  a:link { text-decoration: none; color: #2f488f; }
  a:visited { text-decoration: none;color: #2f488f; }
  a:active { text-decoration: none; color: #2f488f; }
  -->
 </style>
</head>

<body topmargin="0" leftmargin="0" marginheight="0" marginwidth="0">

<table border="0" cellspacing="0" cellpadding="6" width="100%">
 <tr valign="top" bgcolor="#dddddd">
  <td><small>Copyright &copy; 2001 - 2007 SILC Project<br />
    <a href="http://silcnet.org">SILC Project Website</a></small></td>
  <td align="right"><small>
   <a href="index.html">SILC Toolkit Reference Manual</a><br />
   <a href="toolkit_index.html">Index</a></small></td>
   </small></td>
 </tr>
</table>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr bgcolor="#444444"><td><img src="space.gif" width="1" height="1"border="0" alt="" ></td></tr>
</table>

<table cellpadding="0" cellspacing="0" border="0">
 <tr valign="top">

  <td width="200" bgcolor="#f0f0f0">
   <img src="space.gif" width="1" height="1" border="0" alt="">
   <table width="100%" cellpadding="2" cellspacing="2" border="0">
    <tr valign="top"><td>
<br />
<small>
<!-- Template file for the big index that appears in the Toolkit reference
manual on the left side.  With this file it is possible to add other than
automatically generated links to that list. -->

<a href="index.html"><img src="box.gif" border="0" alt="">SILC Toolkit Reference Manual</a><br />


<a href=silcvcardlib.html><img src=box.gif border=0 alt=>SILC VCard Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcvcard.html><img src=box2.gif border=0 alt=>SILC VCard Interface</a><br />
<a href=silccryptlib.html><img src=box.gif border=0 alt=>SILC Crypto Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcrng_intro.html><img src=box2.gif border=0 alt=>Introduction to SILC RNG</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcrng.html><img src=box2.gif border=0 alt=>SILC RNG Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silccipher.html><img src=box2.gif border=0 alt=>SILC Cipher API</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcpkcs.html><img src=box2.gif border=0 alt=>SILC PKCS API</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcpk.html><img src=box2.gif border=0 alt=>SILC Public Key API</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcpkcs1.html><img src=box2.gif border=0 alt=>SILC PKCS #1 API</a><br />
&nbsp;&nbsp;&nbsp; <a href=silchash.html><img src=box2.gif border=0 alt=>SILC Hash Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silchmac.html><img src=box2.gif border=0 alt=>SILC HMAC Interface</a><br />
<a href=silcclientlib.html><img src=box.gif border=0 alt=>SILC Client Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcclient_using.html><img src=box2.gif border=0 alt=>Using SILC Client Library Tutorial</a><br />
&nbsp;&nbsp;&nbsp; <a href=command_reply_args.html><img src=box2.gif border=0 alt=>Arguments for <b>command_reply</b> Client Operation</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcstatus_args.html><img src=box2.gif border=0 alt=>SilcStatus Error Arguments in <b>command_reply</b> Client Operation</a><br />
&nbsp;&nbsp;&nbsp; <a href=notifyargs.html><img src=box2.gif border=0 alt=>Arguments for <b>notify</b> Client Operation</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcclient_unicode.html><img src=box2.gif border=0 alt=>Unicode and UTF-8 Strings in Client Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcclient.html><img src=box2.gif border=0 alt=>Client Library Interface Reference</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcclient_entry.html><img src=box2.gif border=0 alt=>Client Entry Interface Reference</a><br />
<a href=silcmathlib.html><img src=box.gif border=0 alt=>SILC Math Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcmp.html><img src=box2.gif border=0 alt=>SILC MP Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcmath.html><img src=box2.gif border=0 alt=>SILC Math Interface</a><br />
<a href=silcaputillib.html><img src=box.gif border=0 alt=>SILC Application Utility Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcapputil.html><img src=box2.gif border=0 alt=>SILC Application Utilities</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcidcache.html><img src=box2.gif border=0 alt=>SILC ID Cache Interface</a><br />
<a href=silcskrlib.html><img src=box.gif border=0 alt=>SILC Key Repository Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcskr.html><img src=box2.gif border=0 alt=>SILC SKR Interface</a><br />
<a href=silcasn1lib.html><img src=box.gif border=0 alt=>SILC ASN.1 Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcasn1.html><img src=box2.gif border=0 alt=>SILC ASN.1 Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcber.html><img src=box2.gif border=0 alt=>SILC BER interface</a><br />
<a href=silcskelib.html><img src=box.gif border=0 alt=>SILC Key Exchange Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcske.html><img src=box2.gif border=0 alt=>SILC SKE Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcconnauth.html><img src=box2.gif border=0 alt=>SILC Connection Authentication Interface</a><br />
<a href=silcsftplib.html><img src=box.gif border=0 alt=>SILC SFTP Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcsftp.html><img src=box2.gif border=0 alt=>SILC SFTP Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcsftp_fs.html><img src=box2.gif border=0 alt=>SFTP Filesystems Interface</a><br />
<a href=silccorelib.html><img src=box.gif border=0 alt=>SILC Core Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcauth.html><img src=box2.gif border=0 alt=>SILC Authentication Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcmessage.html><img src=box2.gif border=0 alt=>SILC Message Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcchannel.html><img src=box2.gif border=0 alt=>SILC Channel Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silccommand.html><img src=box2.gif border=0 alt=>SILC Command Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcnotify.html><img src=box2.gif border=0 alt=>SILC Notify Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcstatus.html><img src=box2.gif border=0 alt=>SILC Status Types</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcmode.html><img src=box2.gif border=0 alt=>SILC Modes</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcid.html><img src=box2.gif border=0 alt=>SILC ID Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcargument.html><img src=box2.gif border=0 alt=>SILC Argument Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcattrs.html><img src=box2.gif border=0 alt=>SILC Attributes Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcpacket.html><img src=box2.gif border=0 alt=>Packet Engine Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcpubkey.html><img src=box2.gif border=0 alt=>SILC Public Key Payload Interface</a><br />
<a href=silcutillib.html><img src=box.gif border=0 alt=>SILC Utility Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silctypes.html><img src=box2.gif border=0 alt=>Basic Types and Definitions</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcbuffer.html><img src=box2.gif border=0 alt=>Data Buffer Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcbuffmt.html><img src=box2.gif border=0 alt=>Data Buffer Format Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silchashtable.html><img src=box2.gif border=0 alt=>Hash Table Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcmemory.html><img src=box2.gif border=0 alt=>Memory Allocation Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcstack.html><img src=box2.gif border=0 alt=>Data Stack (memory pool) Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcfsm.html><img src=box2.gif border=0 alt=>Finite State Machine Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcthread.html><img src=box2.gif border=0 alt=>Thread Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcmutex.html><img src=box2.gif border=0 alt=>Mutual Exclusion Lock Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silccond.html><img src=box2.gif border=0 alt=>Condition Variable Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcatomic.html><img src=box2.gif border=0 alt=>Atomic Operations Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcnet.html><img src=box2.gif border=0 alt=>Network (TCP and UDP) Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcschedule.html><img src=box2.gif border=0 alt=>Scheduler Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcasync.html><img src=box2.gif border=0 alt=>Asynchronous Operation Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcstream.html><img src=box2.gif border=0 alt=>Abstract Stream Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcsocketstream.html><img src=box2.gif border=0 alt=>Socket Stream Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcfdstream.html><img src=box2.gif border=0 alt=>File Descriptor Stream Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcfileutil.html><img src=box2.gif border=0 alt=>File Utility Functions</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcstrutil.html><img src=box2.gif border=0 alt=>String Utility Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcsnprintf.html><img src=box2.gif border=0 alt=>Snprintf Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcutf8.html><img src=box2.gif border=0 alt=>UTF-8 String Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcstringprep.html><img src=box2.gif border=0 alt=>Stringprep Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcutil.html><img src=box2.gif border=0 alt=>Utility Functions</a><br />
&nbsp;&nbsp;&nbsp; <a href=silclist.html><img src=box2.gif border=0 alt=>List Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcdlist.html><img src=box2.gif border=0 alt=>Dynamic List Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcmime.html><img src=box2.gif border=0 alt=>MIME Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silctime.html><img src=box2.gif border=0 alt=>Time Utility Functions</a><br />
&nbsp;&nbsp;&nbsp; <a href=silclog.html><img src=box2.gif border=0 alt=>Logging Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silcconfig.html><img src=box2.gif border=0 alt=>Config File Interface</a><br />
<a href=silchttplib.html><img src=box.gif border=0 alt=>SILC HTTP Library</a><br />
&nbsp;&nbsp;&nbsp; <a href=silchttpserver.html><img src=box2.gif border=0 alt=>SILC HTTP Server Interface</a><br />
&nbsp;&nbsp;&nbsp; <a href=silchttpphp.html><img src=box2.gif border=0 alt=>SILC HTTP PHP Translator</a><br />

<br />
<b>Resource Links</b>
<br />
<a href="http://silcnet.org"><img src="box.gif" border="0" alt="">SILC Project Website</a><br />
<a href="http://silcnet.org/support/documentation/"><img src="box.gif" border="0" alt="">SILC Protocol Documentation</a><br />
<a href="http://silcnet.org/support/documentation/wp/"><img src="box.gif" border="0" alt="">SILC White Paper</a><br />
<a href="http://silcnet.org/support/faq/"><img src="box.gif" border="0" alt="">SILC FAQs</a><br />

</small>
<br /><br /><br /><br />
    </td></tr>
   </table>
  </td>

  <td bgcolor="#cccccc" background="dot.gif">
   <img src="space.gif" width="1" height="1" border="0" alt=""></td>

  <td width="720" bgcolor="#ffffff">
   <img src="space.gif" width="1" height="1" border="0" alt="">
   <table cellpadding="2" cellspacing="6" width="100%">
    <tr><td valign="top">
<br />
<big><b>Porting from Toolkit 1.0 to 1.1</b></big>

<br />&nbsp;<br />
This documents describes the differences between the SILC Toolkit 1.0 and
1.1 and should help application programmers to port their SILC applications
to the new Toolkit version.

<br />&nbsp;<br />
<li><a href="#general">General</a><br />
<li><a href="#platform">Platform changes</a>
<li><a href="#client">Client library</a><br />
<li><a href="#util">Utility library</a><br />
<li><a href="#apputil">Application utility library</a>
<li><a href="#crypto">Crypto library</a>
<li><a href="#skr">Key Repository library</a>
<li><a href="#vcard">VCard library</a>
<li><a href="#http">HTTP library</a>
<li><a href="#asn1">ASN.1 library</a>

<br />&nbsp;<br />
<h3><a name="general"></a>General changes</h3>

The main SILC Toolkit header file has changed its name from silcincludes.h
to silc.h.  The first task in porting from 1.0 to 1.1 is to change these
filenames in your source tree.


<br />&nbsp;<br />
<h3><a name="platform"></a>Platform changes</h3>

The Windows support has been made better by improving the SILC scheduler
and network routines.  Calling silc_net_win32_init and silc_net_win32_uninit
is not needed anymore.  The network routines on Windows are enabled
automatically.


<br />&nbsp;<br />
<h3><a name="client"></a>Client library, lib/silcclient/</h3>

The client library in Toolkit 1.1 has been partially rewritten.  It was
rewritten to work out some technical issues and to increase performance
and decrease memory consumption.  The client library API has also faced
some changes, altough most of it has remained the same.  Most major change
in the client library is that is now fully supports multiple threads.  In
the past making multithreaded SILC client application was always a bit hard
but with Toolkit 1.1 it should be relatively straightforward.

<h4>SilcClientOperations structure</h4>

The SilcClientOperations structure has changed significantly.  It no longer
has `connected', `disconnected' and `failure' function pointers.  Instead a
new SilcClientConnectCallback has been defined that is given as argument to
functions like silc_client_connect_to_server, silc_client_connect_to_client
and silc_client_key_exchange (last two being entirely new functions in the
API).  That callback is called when connection is established and when it
is disconnected, or if a protocol failure occurred during connecting.  That
callback also delivers a detailed error information when error occurs.  New
connection related status types in SilcClientConnectionStatus has also been
added, see the API for the details.

<br />&nbsp;<br />
Also the `detach' client operation function pointer has been removed.  Instead
the detachment data is now simply delivered in the SILC_COMMAND_DETACH
command reply.

<br />&nbsp;<br />
Some of the remaining client operation function pointers have changed a bit.
Most major change is the `command' operation now having the arguments that
user gave on the user interface sent back to application.  The `command_reply'
does not anymore include the SilcCommandPayload as an argument.  Also the
variable argument lis is now delivered as va_list.  Also the boolean
success indicator is removed and SilcStatus error argument instead is telling
the exact error if the SilcStatus status is other than SILC_STATUS_OK.

<br />&nbsp;<br />
The `get_auth_method' client operation now includes the authentication method
that has been resolved from the remote server.  The application no longer
needs to resolve it and the function silc_client_request_authentication_method
has been removed from the API.

<br />&nbsp;<br />
The `verify_public_key' client operation now include the SilcPublicKey pointer
instead of the public key in raw encoded form.  Also the connection type
argument has changed to SilcConnectionType.

<br />&nbsp;<br />
The `key_agreement' client operation now includes a new protocol argument
which tells whether the key agremeent is supposed to be done on TCP or on
UDP transport.  The new Toolkit 1.1 supports both.

<h4>SilcClient</h4>

The SilcClientParams includes new fields and some fields have been removed
or moved to other places.  All connection timeout related fields have been
moved to SilcClientConnectionParams.  The nickname_parse callback pointer has
also been removed from SilcClientParams.  The Toolkit 1.1 now automatically
parses formatted nicknames.

<br />&nbsp;<br />
The new field boolean `threads' can be used to tell whether the new SilcClient
is to use multiple threads or not. If threads support has been compiled in
and that field is set to TRUE then the client library will create new thread
for each new connection to a remote host.  If you are going to use several
connections or some of the connections are high throughput connections (like
multimedia connections) then using threads is recommended for performance.
Note that your application needs to be multithreaded and, if necessary to,
perform concurrencly control in client operation callbacks which may be
called from multiple threads at the same time for different connections.
However, it is always guaranteed that for one connection the client
operations cannot be called from multiple threads.  The multithreads
support in Toolkit 1.1 client library means that each new connection and
everything related to that connection is handled in own dedicated thread.

<br />&nbsp;<br />
The silc_client_init function now takes several new arguments.  It now takes
the username, hostname and realname as argument that used to be required
by the application to update directly to SilcClient pointer.  This is not
longer required.  Also the nickname is no longer required to be put to
SilcClient context as it has been made SilcClientConnection specific.
The function also takes a SilcClientRunning callback as argument which will
be called when the client library is running.  Only after the callback is
delivered may the application start using other client library API functions.
For example, connecting to a server will fail if it is performed before
the SilcClientRunning callback is called.  The callback is called after the
silc_client_run or silc_client_run_one has been called.

<br />&nbsp;<br />
The silc_client_stop function takes new SilcClientStopped callback as
argument, and it will be called after the client library has been completely
stopped.  The application should not quit before that is called in order
to clean up all resources allocation by the client library.

<br />&nbsp;<br />
It is also not required to put the public key pair (SilcPublicKey and
SilcPrivateKey) into SilcClient.  They have been made connection specific so
you simply give them as argument when you create new connection.  This way
it is now possible to use different key pairs with different connections,
one that was not possible in Toolkit 1.0 without creating new SilcClient
instance for each new connection.

<h4>SilcClientConnection</h4>

The SilcClientConnection represents connection to a remote host.  In new
Toolkit 1.1 this structure now includes all connection related data and
no connection related data is anymore included in SilcClient.  For this
reason it is no longer necessary to create multiple SilcClient instances
just because you want to create multiple connections.

<br />&nbsp;<br />
The SilcClientConnectionParams structure has many new fields.  This structure
is given as argument to any function that is able to create a new connection
or to create a network listener or to create a new SILC sessions.  See the
API documentation for all the details but the following one field of special
relevance when creating new SILC server connections.  The nickname field is
now included in this structure and it is the nickname user would like to
initially use in the SILC network.

<br />&nbsp;<br />
The functions silc_client_connect_to_server, silc_client_connect_to_client
and silc_client_key_exchange can all be used to create new SILC session with
a remote.  To connect SILC server use silc_client_connect_to_server.  You
now give the SilcClientConnectionParams as argument which includes the 
nicknameuser wants to use, you now can give the public key pair as argument that is
to be used in the connecting.  The new SilcClientConnectCallback will be
called once the connection has been established and it delivers the
SilcClientConection context to the application.  It will be later called
again to indicated disconnection from the remote host.  These functions
now return SilcAsyncOperation context which can be used to cancel the
connecting, if necessary.  In the past canceling connection was not possible.

<br />&nbsp;<br />
<pre>
SilcAsyncOperation op;
SilcClientConnectionParams params;

memset(&params, 0, sizeof(params));

/* Set nickname user wants to use */
params.nickname = nickname;

/* Set perfect forward secery for key exchange */
params.pfs = TRUE;

/* Example of creating, and then canceling a connection */
op = silc_client_connect_to_server(client, params, public_key, private_key,
                                   remote_host, remote_port, connection_cb,
				   app_context);
if (!op) {
  fatal("Connecting failed immediately"));
  exit(1);
}

...

/* Cancel connecting.  After canceling the `connection_cb' will not be
   called. */
silc_async_abort(op);
</pre>

<br />&nbsp;<br />
The old function silc_client_start_key_exchange has been replaced with
silc_client_key_exchange function.  Semantically it is equivalent to
silc_client_connect_to_server but it does not create new connection.  Instead,
it accepts SilcStream as argument which is already established connection
to a remote host and it merely starts the key exchange.  See an example
in the API documentation on how to use the silc_client_key_exchange, if
your application wishes itself to create connection instead of using the
client library to do it.

The functions silc_client_add_connection, silc_client_del_connection and
silc_client_del_socket has been removed.  They are no longer needed.

<h4>Entries</h4>

Just like in Toolkit 1.0 we now have SilcClientEntry to represent user,
SilcChannelEntry to represent channel and SilcServerEntry to represent
server.  In the past these structures and all API functions that dealt
with them were in <a href="silcclient.html">silcclient.h</a> file.  They
are now in <a href="silcclient_entry.html">silcclient_entry.h</a> in
Toolkit 1.1.

<br />&nbsp;<br />
As an general convention each of these new entries now are reference
counted and they have locks when using them in multithreaded application.
Even in one-threaded application the application must always acquire a
reference of the entry if it wishes to save the entry pointer in the
application.  The reference must be released once the entry pointer is
not needed anymore.  This ensures that the library cannot free the entry
pointer underneath the application.  An own API for taking and releasing
the reference is in Toolkit 1.1.

<br />&nbsp;<br />
<pre>
/* Take reference of the client entry I save to my own context. */
my_context->client_entry = silc_client_ref_client(client, conn, client_entry);
</pre>

<br />&nbsp;<br />
If multiple threads are used and application wants to access the entry it
must always first lock the entry.  After application has read the information
it needs from the entry it must release the entry lock.  The entry lock
should be held only for short periods of time and failure to release the
lock will result into deadlock.   An own API for taking and releasing the
entry lock is in Toolkit 1.1.  If you application is not multithreaded
you do not need to use the entry locking.

<br />&nbsp;<br />
<pre>
/* Read data from client entry in multithreaded environment */
silc_client_lock_client(client_entry);
fprintf(stdout, "%s\n", client_entry->nickname);
fprintf(stdout, "%s\n", silc_id_render(SILC_ID_CLIENT, &client_entry->id));
silc_client_unlock_client(client_entry);
</pre>

<br />&nbsp;<br />
From the entries all unnecessary information for application has been either
removed or moved to internal structure that is not accessible by the
application.  As a result the entry structures are much smaller and cleaner.

<br />&nbsp;<br />
The SilcClientEntry now includes nickname_normalized field and it is the
normalized version of the user's nickname, in case application needs it.
It is also guaranteed in Toolkit 1.1 that the nickname inside SilcCientEntry
is always valid nickname.

<br />&nbsp;<br />
The SilcChannelEntry now includes new channel_pubkeys list, which includes
the channel public keys if they have added to the channel.  This information
was not present in Toolkit 1.0.

<br />&nbsp;<br />
The SilcServerEntry now includes new field public_key, which is the server's
public key if we have resolved it.  This information was not present in
Toolkit 1.0.

<br />&nbsp;<br />
In Toolkit 1.1 it is now easier to search and resolve entries.  As a new
feature it now also possible to search and resolve server entries from the
SILC network.  See the API documentation for all the details on searching
entries from the client library cache and from the SILC network.

<h4>Sending/Receiving messages</h4>

Sending messages has not much changed from the Toolkit 1.1.  In Toolkit 1.1
the message may now safely be sent in from multiple threads for same client
or for same channel.  In case the message are digitally signed the hash
function used in the signature computation must now be given as argument.
If this is done in multiple threads, each thread must use different SilcHash
context because SilcHash does not support multiple threads.  Simply allocate
new SilcHash for each thread where you send digitally signed messages.

<br />&nbsp;<br />
Receiving message is same as in Toolkit 1.0.  You receive private_message
or channel_message client operation.  It is always guaranteed that even in
multithreaded application the messages are received in one thread.  You need
concurrency control in your application only if you access shared data in
your client operation callbacks.

<br />&nbsp;<br />
In Toolkit 1.1 as a new feature it is also possible to wait for incoming
private messages in a thread.  New function silc_client_private_message_wait
can be used to block the calling process or thread until private message
for the specified client is received.

<h4>Calling and sending commands</h4>

Just like in Toolkit 1.0 in Toolkit 1.1 you can call command implemented
inside the client library with silc_client_command_call.  The command_reply
client operation will be called once the command reply has arrived.

<br />&nbsp;<br />
As a major change in semantics of sending commands with the
silc_client_command_send function is the way the command reply is handled
in Toolkit 1.1.  In the new Toolkit the command_reply client operation will
not be anymore called for commands that has been sent with
silc_client_command_send.  The command_reply client operation is called only
when silc_client_command_call function is used.  With silc_client_command_send
you can give the command reply callback, SilcClientCommandReply, as argument,
and it will be called for each command reply that is received from the
server.

<br />&nbsp;<br />
Just likein 1.0 in 1.1 it is also possible to attach to pending commands
by using silc_client_command_pending.  As a difference to 1.0 the command
identifier is not anymore available to application from the
SilcClientConnection context.  Instead the silc_client_command_call and
silc_client_command_send return the command identifier, and application needs
to save it in order to be able to attach to it at later time.  However,
this feature is not expected to be very important for application
programmers as the new silc_client_command_send already includes the
command reply callback.

<br />&nbsp;<br />
<pre>
Comparison between 1.0 and 1.1

Toolkit 1.0:
/* Send ping command.  The reply will be in the attached command reply
   and in the command_reply client operation. */
silc_client_command_send(client, conn, SILC_COMMAND_PING, ++conn->cmd_ident,
			 1, 1, server_id, server_id_len);
silc_client_command_pending(conn, SILC_COMMAND_PING, conn->cmd_ident,
                            ping_command_reply, context);

Toolkit 1.1:
/* Send ping command.  The reply will be ping_command_reply function. */
silc_client_command_send(client, conn, SILC_COMMAND_PING,
                         ping_command_reply, context,
			 1, 1, server_id, server_id_len);

</pre>

<h4>Notify arguments</h4>

In Toolkit 1.1 the following notify arguments have had changes.  See
the <a href="notifyargs.html">Notify Arguments</a> for details.  You should
go through your application and change the handling of the following notify
messages for Toolkit 1.1.

<br />&nbsp;<br />
SILC_NOTIFY_TYPE_NICK_CHANGE<br />
SILC_NOTIFY_TYPE_CMODE_CHANGE<br />
SILC_NOTIFY_TYPE_SIGNOFF<br />
SILC_NOTIFY_TYPE_SERVER_SIGNOFF<br />

<br />&nbsp;<br />
The basic changes in notify arguments from Toolkit 1.0 is that the
Toolkit 1.1 parses various lists and other raw data for the application as
opposed to sending them in the raw format.  This makes programming easier.

<h4>Command reply arguments</h4>

In Toolkit 1.1 the following command reply arguments have had changes.  See
the <a href="command_reply_args.html">Command Reply Arguments</a> for
details.  You should go through your application and change the handling
of the following command replies for Toolkit 1.1.

<br />&nbsp;<br />
SILC_COMMAND_WHOIS<br />
SILC_COMMAND_INVITE<br />
SILC_COMMAND_STATS<br />
SILC_COMMAND_JOIN<br />
SILC_COMMAND_CMODE<br />
SILC_COMMAND_BAN<br />
SILC_COMMAND_DETACH<br />
SILC_COMMAND_USERS<br />

<br />&nbsp;<br />
The basic changes in command reply arguments from Toolkit 1.0 is that the
Toolkit 1.1 parses various lists and other raw data for the application as
opposed to sending them in the raw format..  This makes programming easier.

<h4>Other changes in client library</h4>

There are many other smaller changes in Toolkit 1.1 that require you to
change your application when porting from Toolkit 1.0.  We are not listing
all of them here but briefly mention some API changes.

<br />&nbsp;<br />
Listing channel private keys now return SilcDList instead of an array.

<br />&nbsp;<br />
The key agreement API has changed a little bit and is now more cleaner and
supports all the features that are needed in full featured key agreement.
The silc_client_peform_key_agreement_fd has been replaced by
silc_client_perform_key_agreement_stream.

<br />&nbsp;<br />
The private message key API has slight changes also.  It is no longer
necessary for the caller to specify whether the private message key is for
responder or initiator use.

<br />&nbsp;<br />
The file transfer API has changed a little bit and is now more cleaner and
supports all the features that are needed in full featured file transfer.
It is now easier to send files when you are behind NAT when you can
specifically define the IPs that are used in both file sending and
receiving.

<br />&nbsp;<br />
As a new function silc_client_nickname_format can now be used to format
the nickname of a client entry.  The client library automatically formats
the nicknames but in some cases application might like to change the
nickname of a certain client entry.


<br />&nbsp;<br />
<h3><a name="util"></a>Utility library, lib/silcutil/</h3>

The Utility library (runtime library) has had several changes and has several
new interfaces.  Some interfaces has also been removed or moved to some
other library.  Removed interfaces rae: silcprotocol.h and silcsockconn.h.
Moved interfaces are: <a href="silcapputil.html">silcapputil.h</a> and
<a href="silcvcard.html">silcvcard.h</a>.

<h4>SILC Async Operation Interface</h4>

A new asynchronous operation API (<a href="silcasync.html">silcasync.h</a>)
has been added.  It can be used to control asynchronous operations, like
to cancel them.  Many asynchronous routines in SILC Toolkit now return
SilcAsyncOperation context so that the operation can be controlled by the
caller.  It especiallly provides a generic way to cancel asynchronous
operations which can be difficult.

<h4>SILC Atomic Operations Interface</h4>

A new atomic operations API (<a href="silcatomic.html">silcatomic.h</a>)
has been added.  It provides routines to perform various operations on
integeres and pointers atomically.

<h4>SILC Data Stack Interface</h4>

A new data stack (memory pool system) API
(<a href="silcstack.html">silcstack.h</a>) has been added.
It provides a fast memory allocation system.  Many routines in the SILC Toolkit
are SilcStack aware thus enabling them to use the SilcStack as their source
for memory allocation.  All routines that are SilcStack aware automatically
revert back to normal memory allocation if SilcStack is not given as
argument.  See silcstack.h for list of utility routines that support SilcStack
by default.

<h4>SILC Condition Variable Interface</h4>

A new condition variable API (<a href="silccond.html">silccond.h</a>)
has been added.  It provides condition variables for multithreaded
applications.

<h4>SILC Stream Interface</h4>

A new abstract stream API (<a href="silcstream.html">silcstream.h</a>)
has been added.  The SilcStream
provides an abstract way of representing different kinds of streams.  The
API provides functions that can be used to read, write, control and destroy
streams.  The API is not used to create streams but separate interfaces
exist for streams that use the SilcStream abstraction.  For example,
socket stream and file descriptor stream exist.

<h4>SILC FD Stream Interface</h4>

A new file descriptor stream API
(<a href="silcfdstream.html">silcfdstream.h</a>) has been added.  It
provides a blocking and non-blocking file descriptor stream through the
SilcStream abstraction.

<h4>SILC Socket Stream Interface</h4>

A new socket stream API
(<a href="silcsocketstream.html">silcsocketstream.h</a>) has been added.
It provides a blocking and non-blocking socket stream through the SilcStream
abstraction.

<h4>SILC FSM Interface</h4>

A new Finite State Machine API
(<a href="silcfsm.html">silcfsm.h</a>) has been added.  It provides
an FSM that can be used to implement all kinds of machines and protocols.
The machine also supports threads, and threads that are actually executed
in real system threads.  The SILC FSM API also supports asynchronous
events.

<h4>SILC Time Interface</h4>

A new SILC Time API
(<a href="silctime.html">silctime.h</a>) has been added.  It provides utility
functions to retrieve and represent time in different ways.  It supports
Universal and Generalized time string creation and parsing and adds a new
SilcTime structure to represent time.

<h4>SILC Snprintf Interface</h4>

A new snprintf API
(<a href="silcsnprintf.html">silcsnprintf.h</a>) has been added.  It
provides snprintf and other string formatting routines.

<h4>SILC Mutex Interface changes</h4>

The SILC Mutex API (<a href="silcmutex.html">silcmutex.h</a>)
has several changes.  A support for read/write locks has been added
(SilcRwLock).  Also silc_mutex_assert_locked function is added.

<h4>SILC Network Interface changes</h4>

The SILC Network API
(<a href="silcnet.html">silcnet.h</a>) has several changes.  The API is almost
entirely rewritten and most of the old functions have been removed.  The
API has now both TCP and UDP support, and as previously supports IPv4
and IPv6.  New functions are silc_net_tcp_create_listener,
silc_net_listener_get_port, silc_net_close_listener, silc_net_tcp_connnect,
silc_net_udp_connect, silc_net_udp_receive, silc_net_udp_send.

<h4>SILC Scheduler Interface changes</h4>

The SILC Schedule API
(<a href="silcschedule.html">silcschedule.h</a>) has several changes.  The
scheduler has been entirely rewritten but most of the API remains the same.
The SILC_TASK_GENERIC and SILC_TASK_CALLBACK_GLOCAL have been removed.
The way signal are dispatched has been changed.  The SILC Schedule is now
able to itself dispatch all signals.  New functions are
silc_schedule_task_add_fd, silc_schedule_task_add_timeout,
silc_schedule_task_add_signal, silc_task_del_by_all,
silc_schedule_get_fd_events.  The functions silc_schedule_signal_register,
silc_schedule_signal_unregister and silc_schedule_signal_call have been
removed.

<h4>SILC Types Interface changes</h4>

The SILC Type API (<a href="silctypes.html">silctypes.h</a>) has several
changes.  The bool type is replaced with SilcBool.  Sockets are now
represented by SilcSocket.

<h4>SILC String util Interface changes</h4>

The SILC string utility API
(<a href="silcstrutil.html">silcstrutil.h</a>) has changes.  The PEM encoding
and decoding routines has been renamed, silc_base64_encode,
silc_base64_encode_file and silc_base64_decode.  The silc_mime_parse has
been removed.  A new silc_string_split function has been added.

<h4>SILC Utility Interface changes</h4>


<h4>SILC File Util Interface changes</h4>

The SILC file utility API (<a href="silcfileutil.html">silcfileutil.h</a>)
has changes.  A new function silc_file_set_nonblock has been added.

<h4>SILC List and Dynamic List Interface changes</h4>

The SILC List (<a href="silclist.html">silclist.h</a>) and SILC Dynamic List
(silcdlist.h) APIs have changes. New functions silc_list_insert and
silc_dlist_insert have been added.

<h4>SILC Buffer Interface changes</h4>

The SILC Buffer API (<a href="silcbuffer.html">silcbuffer.h</a>) has several
changes.  The SilcBuffer
structure no longer contain the buffer length and true length fields
but silc_buffer_len() and silc_buffr_truelen() macros are available
instead.  Also silc_buffer_data(), silc_buffer_datalen(), silc_buffer_purge(),
silc_buffer_reset(), silc_buffer_start(), silc_buffer_end() and
silc_buffer_enlarge() has been added.  The API also supports SilcStack.

<h4>SILC Buffer Formatting Interface changes</h4>

The SILC Buffer Formatting API
(<a href="silcbuffmt.html">silcbuffmt.h</a>) has several changes.  The
silc_buffer_format now automatically allocates memory to the destination
buffer if it does not have space.  Also new the following new formatters
have been added: SILC_STR_DATA (replaces SILC_STR_UI_XNSTRING),
SILC_STR_BUFFER, SILC_STR_FUNC, SILC_STF_OFFSET and SILC_STR_ADVANCE.
The API also supports SilcStack.

<h4>SILC Memory Interface changes</h4>

The memory allocation API (<a href="silcmemory.html">silcmemory.h</a>) has
several changes.  It supports now SilcStack as memory source.  Also all
memory allocation routines can now fail and return NULL as opposed to fatally
failing when memory allocation fails.

<br />&nbsp;<br />
<h3><a name="apputil"></a>SILC Application Utility library, lib/silcapputil/</h3>

A new SILC Application Utility library has been added.  It provides
various application specific utility libraries that are not part of
the runtime library (lib/silcutil/).  The interfaces in the Application
utility library were in other libraries in Toolkit 1.0 and the library
does not contain any entirely new interfaces.

<h4>SILC Application Utility Interface</h4>

The <a href="silcapputil.html">silcapputil.h</a> contains various application
utility functions.  It
existed in Toolkit 1.0 but some of the APIs has been changed.  The
silc_create_key_pair, silc_load_key_pair and silc_show_public_key APIs
has changed.  A new silc_show_public_key_file has been added.  Functions
silc_identifier_check, silc_identifier_verify, silc_channel_name_check,
silc_channel_name_verify, silc_get_mode_list silc_get_status_message,
silc_get_packet_name, silc_get_command_name, silc_parse_version_string,
silc_version_to_num, silc_client_chmode, silc_client_chumode,
silc_client_chumode_char and silc_id_render has been moved from other
libraries into this interface in Toolkit 1.1.

<h4>SILC ID Cache Interface</h4>

The ID Cache interface (<a href="silcidcache.html">silcidcache.h</a>) has
been moved from lib/silccore into lib/silcapputil/.

<br />&nbsp;<br />
<h3><a name="skr"></a>SILC Key Repository library, lib/silcskr/</h3>

A new SILC Key Repository library has been added.  The library provides
a SILC Key Repository API (<a href="silcskr.html">silcskr.h</a>) which provides
a repository for storing and retrieving public keys.

<br />&nbsp;<br />
<h3><a name="vcard"></a>SILC VCard library, lib/silcvcard/</h3>

A new SILC VCard library has been added.  The SILC VCard API has been
moved from utility library to own library in lib/silcvcard/.

<br />&nbsp;<br />
<h3><a name="http"></a>SILC HTTP library, lib/silchttp/</h3>

A new SILC HTTP library has been added.  The library includes SILC HTTP
Server Interface and SILC HTTP PHP Translator Interface.

<h4>SILC HTTP Server Interface</h4>

The SILC HTTP Server API (<a href="silchttpserver.html">silchttpservder.h</a>)
provides a simple HTTP server implementation for applications that want to
integrate a small HTTP server.

<h4>SILC HTTP PHP Translator Interface</h4>

The SILC HTTP PHP Translator API (<a href="silchttpphp.html">silchttpphp.h</a>)
 provides PHP translates PHP code into HTML.  It can be used to serve PHP
pages in HTTP server.

<br />&nbsp;<br />
<h3><a name="asn1"></a>SILC ASN.1 library, lib/silcasn1/</h3>

A new Abstract Syntax Notation One (ASN.1) library has been added.  The
library provides SILC ASN.1 encoder and decoder interface and SILC BER
encoder and decoder interface.

<h4>SILC ASN.1 Interface</h4>

The SILC ASN.1 API (<a href="silcasn1.html">silcasn1.h</a>) provides ASN.1
encoder and decoder.  The interface provides efficient encoder and decoder
and is support SilcStack as memory source.  The interface is simple and it
supports almost all ASN.1 features.

<h4>SILC BER Interface</h4>

The SILC BER API (<a href="silcber.html">silcber.h</a>) provides BER/DER
encoder and decoder.  It is integral part of the ASN.1 library and the ASN.1
encoder and decoder.
<br /><br /><br /><br />
    </td></tr>
   </table>
  </td>

  <td bgcolor="#cccccc" background="dot.gif">
   <img src="space.gif" width="1" height="1" border="0" alt=""></td>

  <td width="180" bgcolor="#f0f0f0">
    <img src="space.gif" width="1" height="1" border="0" alt="">
    <table width="100%" cellpadding="4" cellspacing="0">
    <tr valign="top"><td>
<br />
<font face="Helvetica,Arial,Sans-serif" size="1">
</font>

<br /><br /><br /><br />
    </td></tr>
    </table>
  </td>
</tr>
</table>

<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr bgcolor="#444444"><td><img src="space.gif" width="1" height="1"border="0" alt="" ></td></tr>
</table>
<table border="0" cellspacing="0" cellpadding="6" width="100%">
 <tr valign="top" bgcolor="#dddddd">
  <td><small>Copyright &copy; 2001 - 2007 SILC Project<br />
    <a href="http://silcnet.org">SILC Project Website</a></small></td>
  <td align="right"><small>
   <a href="index.html">SILC Toolkit Reference Manual</a><br />
   <a href="toolkit_index.html">Index</a></small></td>
   </small></td>
 </tr>
</table>

</body>
</html>