design.txt - clic - Clic is an command line interactive client for gopher written in Common LISP
 (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
       design.txt (3830B)
       ---
            1 
            2                                                         -*- text -*-
            3 
            4 $Id$
            5 
            6 
            7                   usocket: Universal sockets library
            8                   ==================================
            9 
           10 Contents
           11 ========
           12 
           13  * Motivation
           14  * Design goal
           15  * Functional requirements
           16  * Class structure
           17 
           18 
           19 
           20 Motivation
           21 ==========
           22 
           23 There are 2 other portability sockets packages [that I know of]
           24 out there:
           25 
           26  1) trivial-sockets
           27  2) acl-compat (which is a *lot* broader, but contains sockets too)
           28 
           29 The first misses some functionality which is fundamental when
           30 the requirements stop being 'trivial', such as finding out the
           31 addresses of either side connected to the tcp/ip stream.
           32 
           33 The second, being a complete compatibility library for Allegro,
           34 contains much more than only sockets.  Next to that, as the docs
           35 say, is it mainly directed at providing the functionality required
           36 to port portable-allegroserve - meaning it may be (very) incomplete
           37 on some platforms.
           38 
           39 So, that's why I decided to inherit Erik Enge's project to build
           40 a library with the intention to provide portability code in only
           41 1 area of programming, targeted at 'not so trivial' programming.
           42 
           43 Also, I need this library to extend cl-irc with full DCC functionality.
           44 
           45 
           46 
           47 Design goal
           48 ===========
           49 
           50 To provide a portable TCP/IP socket interface for as many
           51 implementations as possible, while keeping the portability layer
           52 as thin as possible.
           53 
           54 
           55 
           56 Functional requirements
           57 =======================
           58 
           59 The interface provided should allow:
           60  - 'client'/active sockets
           61  - 'server'/listening sockets
           62  - provide the usual stream methods to operate on the connection stream
           63    (not necessarily the socket itself; maybe a socket slot too)
           64 
           65 For now, as long as there are no possibilities to have UDP sockets
           66 to write a DNS client library: (which in the end may work better,
           67 because in this respect all implementations are different...)
           68  - retrieve IP addresses/ports for both sides of the connection
           69 
           70 Several relevant support functionalities will have to be provided too:
           71  - long <-> quad-vector operators
           72  - quad-vector <-> string operators
           73  - hostname <-> quad-vector operators (hostname resolution)
           74 
           75 
           76 Minimally, I'd like to support:
           77  - SBCL
           78  - CMUCL
           79  - ABCL (ArmedBear)
           80  - clisp
           81  - Allegro
           82  - LispWorks
           83  - OpenMCL
           84 
           85 
           86 Comments on the design above
           87 ============================
           88 
           89 I don't think it's a good idea to implement name lookup in the
           90 very first of steps: we'll see if this is required to get the
           91 package accepted; not all implementations support it.
           92 
           93 Name resolution errors ...
           94 Since there is no name resolution library (yet), nor standardized
           95 hooks into the standard C library to do it the same way on
           96 all platforms, name resolution errors can manifest themselves
           97 in a lot of different ways.  How to marshall these to the
           98 library users?
           99 
          100 Several solutions come to mind:
          101 
          102 1) Map them to 'unknown-error
          103 2) Give them their own errors and map to those
          104    ... which implies that they are actually supported atm.
          105 3) ...
          106 
          107 Given that the library doesn't now, but may in the future,
          108 include name resolution officially, I tend to think (1) is the
          109 right answer: it leaves it all undecided.
          110 
          111 These errors can be raised by the nameresolution service
          112 (netdb.h) as values for 'int h_errno':
          113 
          114 - HOST_NOT_FOUND (1)
          115 - TRY_AGAIN      (2) /* Server fail or non-authoritive Host not found */
          116 - NO_RECOVERY    (3) /* Failed permanently */
          117 - NO_DATA        (4) /* Valid address, no data for requested record */
          118 
          119 int *__h_errno_location(void) points to thread local h_errno on
          120 threaded glibc2 systems.
          121 
          122 
          123 Class structure
          124 ===============
          125 
          126  usocket
          127   |
          128   +- datagram-usocket
          129   +- stream-usocket
          130   \- stream-server-usocket
          131 
          132 The usocket class will have methods to query local properties, such
          133 as:
          134 
          135  - get-local-name: to query to which interface the socket is bound
          136  - <other socket and protocol options such as SO_REUSEADDRESS>