home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume40 / ipp / part03 < prev    next >
Text File  |  1993-11-24  |  67KB  |  1,913 lines

  1. Newsgroups: comp.sources.misc
  2. From: db15@ukc.ac.uk (Damiano Bolla)
  3. Subject: v40i161:  ipp - IPP Routing Architecture Toolkit, Part03/06
  4. Message-ID: <1993Nov24.193624.7596@sparky.sterling.com>
  5. X-Md4-Signature: d5c462157c62fc14baeca2850bec1486
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Computing Lab, University of Kent at Canterbury, UK.
  8. Date: Wed, 24 Nov 1993 19:36:24 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: db15@ukc.ac.uk (Damiano Bolla)
  12. Posting-number: Volume 40, Issue 161
  13. Archive-name: ipp/part03
  14. Environment: INET
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # Contents:  IPP/include/debug.h IPP/include/router.h
  21. #   IPP/lib/route/CloseIf.c IPP/lib/route/FindRoute.c
  22. #   IPP/lib/route/RouteAdd.c IPP/lib/route/ShowRoute.c
  23. #   IPP/lib/utils/RcvPack.c IPP/lib/utils/SndPack.c
  24. #   IPP/lib/utils/ipp_utils.c IPP/logd/logd.c IPP/router/ProcessCall.c
  25. #   IPP/router/SetInterface.c
  26. # Wrapped by kent@sparky on Wed Nov 24 11:50:59 1993
  27. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  28. echo If this archive is complete, you will see the following message:
  29. echo '          "shar: End of archive 3 (of 6)."'
  30. if test -f 'IPP/include/debug.h' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'IPP/include/debug.h'\"
  32. else
  33.   echo shar: Extracting \"'IPP/include/debug.h'\" \(4051 characters\)
  34.   sed "s/^X//" >'IPP/include/debug.h' <<'END_OF_FILE'
  35. X/* ----------------------------------------------------------------------
  36. X * AUthor: Damiano Bolla, 1993
  37. X * All this project is covered by the GNU Copyright.
  38. X */
  39. X
  40. X#ifndef DEBUG_H
  41. X#define DEBUG_H
  42. X
  43. X/* Debugging in this project is a major problem since there will be MANY
  44. X * concurrently running programs.. Fro this reason there MUST be a well defined
  45. X * interface to debugging. 
  46. X * A structure for each process will hold relevant information that will be
  47. X * useful to trak the process down and possibly understand the problem.
  48. X */
  49. X
  50. X#define ERR_LEN        255    /* I like this number :-)            */
  51. X#define ERR_PACKET    ERR_LEN*4
  52. X
  53. X/* The type definition of an error is as follows                */
  54. X/* The message will describe better why the function failed.            */
  55. X
  56. X#define ERR_OK        0
  57. X#define ERR_MSG        1    /* A message to show nothing really important    */
  58. X#define ERR_NOLISTEN    2    /* Cannot create a socket for listening        */
  59. X#define ERR_NOACCEPT    3    /* Cannot accept a connection             */
  60. X#define ERR_SELECT    4    /* Select has problems                 */
  61. X#define ERR_SREAD    5    /* SafeRead had problems             */
  62. X#define ERR_NOCOMM    6    /* No command is given when expected         */
  63. X#define ERR_BADADDR    7    /* Bad net address is given             */
  64. X#define ERR_NOHOST    8    /* Cannot get informations on this host        */
  65. X#define ERR_NOSOCK    9    /* Cannot create a new socket to use        */
  66. X#define ERR_BADCONN    10    /* Connect could not connect to remote node    */
  67. X#define ERR_BADRCV    11    /* The Receive packet had problems        */
  68. X#define ERR_ALARM    12    /* Got an alarm sihgnal from the WatchDog sys    */
  69. X#define ERR_SIGNAL    13    /* Got a signal.. I just dont' know what to do    */
  70. X#define ERR_BADSND    14    /* There is a problem sending a packet...    */
  71. X#define ERR_CONFIG    15    /* The config file is bad in some way        */
  72. X#define ERR_NOCHECK    16    /* Cannot check the given descriptor...        */
  73. X#define ERR_NOTECH    17    /* This link technology is not supported    */
  74. X#define ERR_BADLINK    18    /* Something is wrong with link spec        */
  75. X#define ERR_LNKUSED    19    /* Warning the link was used...            */
  76. X#define ERR_BADROUTE    20    /* The given route is bad...            */
  77. X#define ERR_NOTIMPL    21    /* This function is not implemented yet        */
  78. X#define ERR_NOTCLOSE    22    /* Cannot close this socket now...        */
  79. X#define ERR_TTL        23    /* TTL field got to zero... too bad        */
  80. X#define ERR_NOROUTE    24    /* There is no route to the desired host    */
  81. X#define ERR_BADPLACE    25    /* Hey... I should not be in this part of code    */
  82. X#define ERR_BADDEPTH    26    /* The depth parameter is wrong..        */
  83. X#define ERR_MEMFAULT    27    /* I am writing on a wrong memory area        */
  84. X#define ERR_BADPACK    28    /* The given packet is BAD in some way        */
  85. X#define ERR_BADNEXT    29    /* The received next address is NOT for me    */
  86. X#define ERR_NOSPACE    30    /* There is no space in the buffer to write    */
  87. X#define ERR_NULL    31    /* You passed a NULL pointer !!!        */
  88. X#define ERR_LOOP    32    /* I am probably having a routing loop        */
  89. X
  90. X
  91. X#define DEBUG_TEXT    0    /* This level show a text messages        */
  92. X#define DEBUG_NOTICE    2    /* This level will show all notice mesages    */
  93. X#define DEBUG_ALERT    4    /* Getting worse,,.. serious problems        */
  94. X#define DEBUG_CRITICAL  6    /* Even worse, this should not really fail    */
  95. X#define DEBUG_PANIC    8    /* With this we are really bad, we can't go on    */
  96. X#define DEBUG_CRASH    10    /* The worse of all, should NOT happena t all    */
  97. X
  98. X/* The next one defines the initial level of the debug system when started    */
  99. X#define DEBUG_LEVEL    DEBUG_NOTICE
  100. X
  101. Xstruct Debug
  102. X   {
  103. X   u_long  logd_host;    /* The host where the logd is running            */
  104. X   u_short logd_port;    /* The port where the logd is listening            */
  105. X   int  send_socket;    /* The open socket to use totalk             */
  106. X   int  pid;    /* The process id of the process generating the fault        */
  107. X   int  type;    /* A code describing the type of error                */
  108. X   int  current_level;    /* The current debug level                */
  109. X   int  debug_level;    /* The debug level of the message             */
  110. X   char prog[ERR_LEN+2];    /* The type of program running            */
  111. X   char ident[ERR_LEN+2];    /* An identifier for the program, usually NetId    */
  112. X   char msg[ERR_LEN+2];        /* The error message                */
  113. X   char MsgBuff[ERR_PACKET+2];     /* Preallocated working buffer            */
  114. X   };
  115. X
  116. X#endif
  117. END_OF_FILE
  118.   if test 4051 -ne `wc -c <'IPP/include/debug.h'`; then
  119.     echo shar: \"'IPP/include/debug.h'\" unpacked with wrong size!
  120.   fi
  121.   # end of 'IPP/include/debug.h'
  122. fi
  123. if test -f 'IPP/include/router.h' -a "${1}" != "-c" ; then 
  124.   echo shar: Will not clobber existing file \"'IPP/include/router.h'\"
  125. else
  126.   echo shar: Extracting \"'IPP/include/router.h'\" \(5081 characters\)
  127.   sed "s/^X//" >'IPP/include/router.h' <<'END_OF_FILE'
  128. X/* ----------------------------------------------------------------------
  129. X * AUthor: Damiano Bolla, 1993
  130. X * All this project is covered by the GNU Copyright.
  131. X */
  132. X
  133. X#ifndef ROUTER_H
  134. X#define ROUTER_H
  135. X
  136. X/* Each router has this max num of interfaces numbered 1 to IF_MAX included    */
  137. X/* A value of zero as interface id means that that interface is invalid        */
  138. X#define    IF_MAX        5    
  139. X
  140. X/* Each destination can have all this possible alternative routes        */
  141. X/* They range from 1 to ROUTE_MAX since Zero is an invalid value        */
  142. X#define ROUTE_MAX    4    
  143. X
  144. X/* This part is used by the functoin WhatIsIt to determine what and address    */
  145. X/* I in relation of the address of the current host.                */
  146. X#define IS_THISHOST    1    /* This packet is for this host            */
  147. X#define IS_SAMENET    2    /* This packet is for this subnet        */
  148. X#define IS_SUBNET    3    /* This packet is for a subnet of this router    */
  149. X#define IS_PARENTNET    4    /* This packet is to go up in the tree        */
  150. X
  151. X/* One general rule is that if something has a value of Zero it means that is 
  152. X * an invalid entry. 
  153. X */
  154. X
  155. X
  156. X/* -------------------------------------------------------------------------------
  157. X * This defines what is an Id table for packets received in this domain.
  158. X * Each sender in this domain set the sender number and the packId
  159. X * For each packet it goes up one..
  160. X * A receiver will then ceck if the new packet is > in ID than the old packet
  161. X */
  162. Xstruct SeenTime
  163. X   {
  164. X   u_short Sec;
  165. X   };
  166. X
  167. X/* Warning... ADDR_NUM IS NOT the same thing...                */
  168. Xtypedef struct SeenTime SeenData[ADDR_NUM][ADDR_NUM];
  169. X
  170. X/* -------------------------------------------------------------------------------
  171. X * This defines a routing entry. I.e. an entry that contains information on how
  172. X * to reach a chosen destination. 
  173. X * You may have to reach the destination via another host or the chosen 
  174. X * destination may be directly connected...
  175. X * So: For an entry to ve "valid" Next MUST be != 0
  176. X */
  177. Xstruct Route
  178. X   {
  179. X   u_char Next;        /* The next hop that I will use, MUST be != 0         */
  180. X   u_char Interface;    /* The interface I am using, 0==NOT_USED        */
  181. X   u_char Cost;        /* How much does it cost to send here ?            */
  182. X   u_int  Cumulated;    /* How much have I spent so far ??            */
  183. X   u_char Flag;        /* This is used by the sort routine...            */
  184. X   };
  185. X
  186. X/* -------------------------------------------------------------------------------
  187. X * The Try entry is there to speed up the search of the "best" interface to 
  188. X * use to send data.
  189. X */
  190. Xstruct HostEntry
  191. X   {
  192. X   u_char Direct;            /* This indicate a Direct route to dest */
  193. X   u_char Another;            /* This is another route to try ..    */
  194. X   struct Route Link[ROUTE_MAX+1];    /* Links are numbered 1->ROUTE_MAX    */
  195. X   };
  196. X
  197. Xstruct NetEntry
  198. X   {
  199. X   u_char Try;                /* The Route entry to try next        */
  200. X   u_char Direct;            /* This indicate a Direct route to dest */
  201. X   struct Route Link[ROUTE_MAX+1];    /* Links are numbered 1->ROUTE_MAX    */
  202. X   };
  203. X
  204. X/* Host data holds informations on how to send data to the same subnet         */
  205. Xtypedef struct HostEntry HostData[ADDR_NUM];
  206. X
  207. X/* Net data holds informations on how to send data to a  subnet         */
  208. Xtypedef struct NetEntry NetData[ADDR_NUM];
  209. X
  210. X/* A route to the parent is a single entry on the REntry structure        */
  211. Xtypedef struct NetEntry ParentData;
  212. X
  213. X/* -------------------------------------------------------------------------------
  214. X * I need a structure that describes an INTERFACE, I.e. the pure link, not the 
  215. X * relations of the link to the hosts. This is used by select...
  216. X * Again since the interfaces are numbered 1 to IF_MAX....
  217. X * An interface is "active" if Line != 0 but.. it can be listening for incoming
  218. X * calls on the "Ring" FD.
  219. X */
  220. Xstruct Interface
  221. X   {
  222. X   int   Line;        /* The descriptor of the interface.. if 0 == NOT USED    */
  223. X   int   Technology;    /* can be sock or atm                    */
  224. X   int   Ring;        /* A file descriptor where you can wait for ringss..    */
  225. X   char  RingHost[IP_NAMLEN+2];    /* The host where the ring waits        */
  226. X   int   RingPort;    /* The sock port where the router listen for ring    */
  227. X   u_int Sent;        /* Number of packets received                */
  228. X   u_int Received;    /* Number of packets sent                */
  229. X   };
  230. X
  231. Xtypedef struct Interface InterfaceData[IF_MAX+1];
  232. X
  233. X/* -------------------------------------------------------------------------------
  234. X * Ok. all the structures have been definedI need to put them in a big thing
  235. X * So I can handle the mess in a nice way.. :-)
  236. X */
  237. X
  238. Xstruct Routing
  239. X   {
  240. X   struct IPPaddr MyAddr;    /* My address :-)                */
  241. X   u_char       PackId;    /* To generate "unique" packet ID        */
  242. X   InterfaceData  ifdata;    /* Information for the interfaces in the system    */
  243. X   HostData     hostdata;    /* Holds all the routing info for same level    */
  244. X   NetData      netdata;    /* Holds routing info for subnet routing    */
  245. X   ParentData   parentdata;    /* Holds infor for parent routing        */
  246. X   SeenData    seendata;    /* Holds seen info            */
  247. X   fd_set       readfds;    /* Used by select...                */
  248. X   u_int     Idle;        /* Keep trak of idle time...            */
  249. X   u_int    BadCount;    /* Bad packets counter...            */
  250. X   u_int    LoopCount;    /* Counts the looped packets            */
  251. X   u_int    TTLCount;    /* Counts the TTL expired packets        */
  252. X   };
  253. X
  254. X
  255. X
  256. X#endif
  257. END_OF_FILE
  258.   if test 5081 -ne `wc -c <'IPP/include/router.h'`; then
  259.     echo shar: \"'IPP/include/router.h'\" unpacked with wrong size!
  260.   fi
  261.   # end of 'IPP/include/router.h'
  262. fi
  263. if test -f 'IPP/lib/route/CloseIf.c' -a "${1}" != "-c" ; then 
  264.   echo shar: Will not clobber existing file \"'IPP/lib/route/CloseIf.c'\"
  265. else
  266.   echo shar: Extracting \"'IPP/lib/route/CloseIf.c'\" \(4281 characters\)
  267.   sed "s/^X//" >'IPP/lib/route/CloseIf.c' <<'END_OF_FILE'
  268. X/* ---------------------------------------------------------------------------
  269. X * Ident: CloseIf.c
  270. X * AUthor: Damiano Bolla 1993
  271. X * All this project is covered by the GNU Copyright.
  272. X */
  273. X
  274. X#include <stdio.h>
  275. X#include <unistd.h>
  276. X#include <string.h>
  277. X#include <sys/types.h>
  278. X#include <sys/time.h>
  279. X#include "defs.h"
  280. X#include "debug.h"
  281. X#include "packet.h"
  282. X#include "router.h"
  283. X#include "commands.h"
  284. X#include "func_defs.h"
  285. X
  286. Xextern struct Debug dbg;
  287. X
  288. Xvoid CloseHostRoute ( struct HostEntry *rdata, int Interface );
  289. Xvoid CloseNetRoute ( struct NetEntry *rdata, int Interface );
  290. Xvoid CloseParentRoute ( struct NetEntry *rdata, int Interface );
  291. X
  292. X/* This closes an interface on demand. It usually happens when there is an
  293. X * EOF on the FD associated with this interface.
  294. X * NOTE: A Ring interface will still retain it's ring property.
  295. X */
  296. Xint CloseIf ( struct Routing *rinfo, int Interface )
  297. X   {
  298. X   int Line;    /* The Fd of this interface                    */
  299. X
  300. X   Line = rinfo->ifdata[Interface].Line;
  301. X   if ( Line == NOT_USED )
  302. X      {
  303. X      /* really strange... somebody is asking me to close an already closed IF    
  304. X       * I give a warning but I still go on ... should I ?? Damiano    
  305. X       */
  306. X      sprintf (dbg.msg,"CloseInterface: Tryng to close an already closed line ");
  307. X      DebugCall ( ERR_NOTCLOSE, DEBUG_NOTICE );
  308. X      }
  309. X   else close ( Line ); 
  310. X
  311. X   /* Ok, this is all I have to do to say that this If is not in use anymore    */
  312. X   rinfo->ifdata[Interface].Line = NOT_USED;
  313. X   rinfo->ifdata[Interface].Sent = 0;
  314. X   rinfo->ifdata[Interface].Received = 0;
  315. X
  316. X   /* Now the difficult part.. going on the routing table and delete all routes    
  317. X    * That are using this interface... log job..
  318. X    */
  319. X   CloseHostRoute ( rinfo->hostdata, Interface);
  320. X   CloseNetRoute ( rinfo->netdata, Interface );
  321. X   CloseParentRoute ( &rinfo->parentdata, Interface );
  322. X
  323. X   return (DONE);
  324. X   }
  325. X
  326. X
  327. X/* This function does once what othervise should be done three times.
  328. X * It is very similar to the above...
  329. X */
  330. Xvoid CloseHostRoute ( struct HostEntry *rdata, int Interface )
  331. X   {
  332. X   int c,d;
  333. X
  334. X   for (c=1; c< ADDR_NUM; c++)
  335. X      {
  336. X      /* The following check if there is any data to check in the route        */
  337. X      if ( rdata[c].Direct == NOT_USED )continue;
  338. X
  339. X      for (d=1; d<=ROUTE_MAX; d++ )
  340. X         {
  341. X         /* This check if there is data in the routing entry...            */
  342. X         if ( rdata[c].Link[d].Next == NOT_USED ) continue;
  343. X
  344. X         /* Ok, this is a valid route entry.. is this one using the close If    */
  345. X         if ( rdata[c].Link[d].Interface == Interface )
  346. X            rdata[c].Link[d].Next = NOT_USED;
  347. X
  348. X         } /* End of the fro trough the routes                    */
  349. X
  350. X      /* This will readjust the Try value for a good Link (If any)        */
  351. X      RouteHostMgr ( &rdata[c] );
  352. X
  353. X      } /* End of the for trough the hosts                    */
  354. X   }
  355. X
  356. X/* This function does once what othervise should be done three times.
  357. X * It is very similar to the above...
  358. X */
  359. Xvoid CloseNetRoute ( struct NetEntry *rdata, int Interface )
  360. X   {
  361. X   int c,d;
  362. X
  363. X   for (c=1; c< ADDR_NUM; c++)
  364. X      {
  365. X      /* The following check if there is any data to check in the route        */
  366. X      if ( rdata[c].Try == NOT_USED )continue;
  367. X
  368. X      for (d=1; d<=ROUTE_MAX; d++ )
  369. X         {
  370. X         /* This check if there is data in the routing entry...            */
  371. X         if ( rdata[c].Link[d].Next == NOT_USED ) continue;
  372. X
  373. X         /* Ok, this is a valid route entry.. is this one using the close If    */
  374. X         if ( rdata[c].Link[d].Interface == Interface )
  375. X            rdata[c].Link[d].Next = NOT_USED;
  376. X
  377. X         } /* End of the fro trough the routes                    */
  378. X
  379. X      /* This will readjust the Try value for a good Link (If any)        */
  380. X      RouteNetMgr ( &rdata[c] );
  381. X
  382. X      } /* End of the for trough the hosts                    */
  383. X   }
  384. X
  385. Xvoid CloseParentRoute ( struct NetEntry *rdata, int Interface )
  386. X   {
  387. X   int d;
  388. X
  389. X   for (d=1; d<=ROUTE_MAX; d++ )
  390. X      {
  391. X      /* This check if there is data in the routing entry...            */
  392. X      if ( rdata->Link[d].Next == NOT_USED ) continue;
  393. X
  394. X      /* Ok, this is a valid route entry.. is this one using the close If    */
  395. X      if ( rdata->Link[d].Interface == Interface )
  396. X         rdata->Link[d].Next = NOT_USED;
  397. X
  398. X      } /* End of the for trough the routes                    */
  399. X
  400. X   /* This will readjust the Try value for a good Link (If any)        */
  401. X   RouteNetMgr ( rdata );
  402. X   }
  403. END_OF_FILE
  404.   if test 4281 -ne `wc -c <'IPP/lib/route/CloseIf.c'`; then
  405.     echo shar: \"'IPP/lib/route/CloseIf.c'\" unpacked with wrong size!
  406.   fi
  407.   # end of 'IPP/lib/route/CloseIf.c'
  408. fi
  409. if test -f 'IPP/lib/route/FindRoute.c' -a "${1}" != "-c" ; then 
  410.   echo shar: Will not clobber existing file \"'IPP/lib/route/FindRoute.c'\"
  411. else
  412.   echo shar: Extracting \"'IPP/lib/route/FindRoute.c'\" \(4765 characters\)
  413.   sed "s/^X//" >'IPP/lib/route/FindRoute.c' <<'END_OF_FILE'
  414. X/* -------------------------------------------------------------------------
  415. X * Ident: FindRoute.c
  416. X * Author: Damiano Bolla 1993
  417. X * All this project is covered by the GNU Copyright.
  418. X */
  419. X
  420. X#include <stdio.h>
  421. X#include <sys/types.h>
  422. X#include <sys/time.h>
  423. X#include "defs.h"
  424. X#include "debug.h"
  425. X#include "packet.h"
  426. X#include "router.h"
  427. X#include "func_defs.h"
  428. X
  429. Xextern struct Debug dbg;
  430. X
  431. X/* This tryes to find a route to the desired destination...
  432. X * It wants the routing table, the destination, depth, and returns
  433. X * what is the right next with the given depth and the interface.
  434. X * NOTE: The interface returned is NOT a file descriptor it is anumber
  435. X * indicating what interface to use !!!
  436. X */
  437. Xint FindRoute ( struct Routing *rinfo, struct IPP *ipp, int *Interf )
  438. X   {
  439. X   struct IPPaddr Dest;
  440. X   int    DestIs;
  441. X   int    SelPos;    
  442. X   int    error;
  443. X   u_char DestNet;
  444. X   u_char DestHost;
  445. X   u_char Mylastbyte;
  446. X   u_char NextRouter;
  447. X   u_char NextHop;
  448. X
  449. X   Mylastbyte = rinfo->MyAddr.Addr[rinfo->MyAddr.Al -1];
  450. X   NextRouter = ipp->NextRouter;
  451. X   ipp_RtoA (ipp,&Dest);
  452. X
  453. X   /* First.. if we have a NextRouter we just have to go there..        */
  454. X   /* I know that I have to use the host table to find NextHop + Interface    */
  455. X   /* What I can change is just the From and the NextHop of the packet        */
  456. X   /* ALl the rest remains the same                        */
  457. X   if ( NextRouter && (NextRouter != Mylastbyte) )
  458. X      {
  459. X      error = FindHostRoute ( rinfo, ipp->From, NextRouter, &NextHop, Interf );
  460. X      if ( error ) return (NOT_DONE);
  461. X      ipp->From = Mylastbyte;
  462. X      ipp->NextHop = NextHop;
  463. X      return (DONE);
  464. X      }
  465. X
  466. X   /* Ok.. I have to find out what to do..                    */
  467. X   DestIs = WhatIsIt ( &rinfo->MyAddr, &Dest );
  468. X   if ( DestIs == NOT_DONE )
  469. X      {
  470. X      sprintf (dbg.msg,"FindRoute: No match Dest %s ",ipp_ntoa(&Dest));
  471. X      DebugCall ( ERR_BADADDR, DEBUG_CRITICAL );
  472. X      return (NOT_DONE);
  473. X      }
  474. X
  475. X   if ( DestIs == IS_THISHOST )
  476. X      {
  477. X      sprintf (dbg.msg,"FindRoute: Given destination match to this host ");
  478. X      DebugCall ( ERR_BADADDR, DEBUG_CRITICAL );
  479. X      return (NOT_DONE);
  480. X      }
  481. X
  482. X   /* The SelPos is the position of the byte that decides the routing
  483. X    * in the Dest address. It depends on where we are in the net...
  484. X    * and therefore depends on the current address.
  485. X    * The -1 is because bytes are stored in position 0,1,2,3...
  486. X    */
  487. X   SelPos = rinfo->MyAddr.Al - Dest.Depth -1;
  488. X
  489. X   /* I have to find a route to a host I am not allowed to change the Sender
  490. X    * or the PackId, I can safely turn to zero the NextRouter, 
  491. X    */
  492. X   if ( DestIs == IS_SAMENET )
  493. X      {
  494. X      DestHost = Dest.Addr[SelPos];
  495. X      error = FindHostRoute ( rinfo, ipp->From, DestHost, &NextHop, Interf );
  496. X      if ( error ) return (NOT_DONE);
  497. X      ipp->From = Mylastbyte;
  498. X      ipp->NextHop = NextHop;
  499. X      ipp->NextRouter = NOT_USED;
  500. X      return (DONE);
  501. X      }
  502. X
  503. X   /* I am finding a route to a subnet, now the NextRouter is zeroed depending if
  504. X    * this is a direct route or not. If it is a direct one it is ZEro.
  505. X    */
  506. X   if ( DestIs == IS_SUBNET )
  507. X      {
  508. X      DestNet = Dest.Addr[SelPos];
  509. X      error = FindSubnetRoute ( rinfo, DestNet, &NextRouter, &NextHop, Interf);
  510. X      if ( error ) return (NOT_DONE);
  511. X      if ( NextRouter )
  512. X     {
  513. X     /* This is NOT a direct link and I am the originator of this packet
  514. X      * Since this packet will try to reach the next router.
  515. X      */
  516. X         ipp->From = Mylastbyte;
  517. X     ipp->Sender = Mylastbyte;
  518. X     ipp->PackId = ++rinfo->PackId;
  519. X     ipp->NextRouter = NextRouter;
  520. X     ipp->NextHop = NextHop;
  521. X     return (DONE);
  522. X     }
  523. X      else
  524. X     {
  525. X     /* This is a direct link down 
  526. X      * I have to zero the Sender, the PackId, the NextRouter, even the from
  527. X      */
  528. X         ipp->From = NOT_USED;
  529. X     ipp->Sender = NOT_USED;
  530. X     ipp->PackId = NOT_USED;
  531. X     ipp->NextRouter = NOT_USED;
  532. X     ipp->NextHop = NextHop;
  533. X     return (DONE);
  534. X     }
  535. X      }
  536. X
  537. X
  538. X   if ( DestIs == IS_PARENTNET )
  539. X      {
  540. X      error = FindParentRoute ( rinfo, &NextRouter, &NextHop, Interf );
  541. X      if ( error ) return (NOT_DONE);
  542. X      if ( NextRouter )
  543. X     {
  544. X     /* This is NOT a direct link and I am the originator of this packet
  545. X      * Since this packet will try to reach the next router.
  546. X      */
  547. X         ipp->From = Mylastbyte;
  548. X     ipp->Sender = Mylastbyte;
  549. X     ipp->PackId = ++rinfo->PackId;
  550. X     ipp->NextRouter = NextRouter;
  551. X     ipp->NextHop = NextHop;
  552. X     return (DONE);
  553. X     }
  554. X      else
  555. X     {
  556. X     /* This is a direct link UP
  557. X      * I have to zero the Sender, the PackId, the NextRouter, even the from
  558. X      */
  559. X         ipp->From = NOT_USED;
  560. X     ipp->Sender = NOT_USED;
  561. X     ipp->PackId = NOT_USED;
  562. X     ipp->NextRouter = NOT_USED;
  563. X     ipp->NextHop = NextHop;
  564. X     return (DONE);
  565. X     }
  566. X      }
  567. X
  568. X   sprintf (dbg.msg,"FindRoute: I should not be in this part of the code");
  569. X   DebugCall ( ERR_BADPLACE, DEBUG_CRITICAL );
  570. X   return (NOT_DONE);
  571. X   }
  572. END_OF_FILE
  573.   if test 4765 -ne `wc -c <'IPP/lib/route/FindRoute.c'`; then
  574.     echo shar: \"'IPP/lib/route/FindRoute.c'\" unpacked with wrong size!
  575.   fi
  576.   # end of 'IPP/lib/route/FindRoute.c'
  577. fi
  578. if test -f 'IPP/lib/route/RouteAdd.c' -a "${1}" != "-c" ; then 
  579.   echo shar: Will not clobber existing file \"'IPP/lib/route/RouteAdd.c'\"
  580. else
  581.   echo shar: Extracting \"'IPP/lib/route/RouteAdd.c'\" \(6390 characters\)
  582.   sed "s/^X//" >'IPP/lib/route/RouteAdd.c' <<'END_OF_FILE'
  583. X/* ---------------------------------------------------------------------------
  584. X * Ident: RouteAdd.c
  585. X * Author: Damiano Bolla 1993
  586. X * All this project is covered by the GNU Copyright.
  587. X */
  588. X
  589. X#include <stdio.h>
  590. X#include <string.h>
  591. X#include <sys/types.h>
  592. X#include <sys/time.h>
  593. X#include "defs.h"
  594. X#include "debug.h"
  595. X#include "packet.h"
  596. X#include "router.h"
  597. X#include "commands.h"
  598. X#include "func_defs.h"
  599. X
  600. Xextern struct Debug dbg;
  601. Xint InsHostRoute ( struct HostEntry *Entry, int NextHop, int Interf, int Cost );
  602. Xint InsNetRoute ( struct NetEntry *Entry, int NextHop, int Interf, int Cost );
  603. X
  604. X/* Thsi part receives a route spec and try to install it
  605. X * The route spec is in ascii format.
  606. X * The given string format is the following
  607. X * 1) net/host/parent indicatin if the route is for ...
  608. X * 2) num    Indicate the entry to modify
  609. X * 3) num    Indicate the interface to use
  610. X * 4) num    Indicate the host of a route
  611. X */
  612. X
  613. Xint RouteAdd ( struct Routing *rinfo, char *Arg )
  614. X   {
  615. X   char *Level;        /* For what level is this route ??            */
  616. X   char Null[2]={0};
  617. X   int  Key;        /* What is the entry key ?                */
  618. X   int  NextHop;    /* IPP (One byte) of the next hop            */
  619. X   int  Interf;        /* The interface to use (If none == 0 )            */
  620. X   int  Cost;        /* The cost of this route( relally 1->254)        */
  621. X
  622. X
  623. X   if ((Level=strtok (Arg, CMD_SEP))==NULL) Level=Null;
  624. X   Key     = ipp_atoi (strtok (NULL,CMD_SEP));
  625. X   NextHop = ipp_atoi (strtok (NULL,CMD_SEP));
  626. X   Interf  = ipp_atoi (strtok (NULL,CMD_SEP));
  627. X   Cost    = ipp_atoi (strtok (NULL,CMD_SEP));
  628. X
  629. X   /* Key can be == 0 if we are talking of a route up to the tree        */
  630. X   if ( (Key<0) || (Key>=ADDR_NUM) || (NextHop<=0) || (NextHop>=ADDR_NUM-1) ||
  631. X    (Interf<0) || (Interf>IF_MAX) || (Cost<=0) || (Cost>MAX_COST) )
  632. X      {
  633. X      sprintf (dbg.msg,"RouteAdd: Bad Params %d %d %d %d",Key,NextHop,Interf,Cost);
  634. X      DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  635. X      return (NOT_DONE);
  636. X      }
  637. X
  638. X   if ( strcasecmp (Level,LEV_NET) == 0 )
  639. X      {
  640. X      if ( Key > 0 ) 
  641. X         InsNetRoute ( &rinfo->netdata[Key], NextHop, Interf, Cost );
  642. X      return (DONE);
  643. X      }
  644. X
  645. X   if ( strcasecmp (Level,LEV_HOST) == 0 )
  646. X      {
  647. X      /* A route for a host MUST give the interface to use to reach the next hop    */
  648. X      if ( Interf <= 0 )
  649. X         {
  650. X         sprintf (dbg.msg,"RouteAdd: A host route MUST have an interface ");
  651. X         DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  652. X         return (NOT_DONE);
  653. X         }
  654. X      if ( (Key > 0) ) 
  655. X         InsHostRoute ( &rinfo->hostdata[Key], NextHop, Interf, Cost );
  656. X      return (DONE);
  657. X      }
  658. X
  659. X   if ( strcasecmp (Level,LEV_PARENT) == 0 )
  660. X      {
  661. X      if ( rinfo->MyAddr.Al <= 1 )
  662. X         {
  663. X         sprintf (dbg.msg,"RouteAdd: Cannot insert a parent route of top level");
  664. X         DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  665. X         return (NOT_DONE);
  666. X         }
  667. X      InsNetRoute ( &rinfo->parentdata, NextHop, Interf, Cost );
  668. X      return (DONE);
  669. X      }
  670. X
  671. X   sprintf (dbg.msg,"RouteAdd: Bad level given '%s' ",Level);
  672. X   DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  673. X   return (NOT_DONE);
  674. X   }
  675. X
  676. X/* ------------------------------------------------------------------------
  677. X * This insert a route in the appropriate slot...
  678. X * This assumes that the informations given are correct I.e. they
  679. X * are "legal" routings but may not be the "real" situation
  680. X * This allow to set routes for not existing hosts or subnet.
  681. X */
  682. Xint InsNetRoute ( struct NetEntry *Entry, int NextHop, int Interf, int Cost )
  683. X   {
  684. X   int Found;
  685. X   int c;
  686. X
  687. X   /* First thing to do is ... find a free space...
  688. X    * There is ONE case that reject the route add completly and that is 
  689. X    * when there is already the next how with the same interface
  690. X    */ 
  691. X   Found = FALSE;
  692. X   for ( c=1; c<=ROUTE_MAX; c++ )
  693. X      {
  694. X      if ( (Entry->Link[c].Next == NextHop) && 
  695. X           (Entry->Link[c].Interface == Interf) ) 
  696. X           {
  697. X           sprintf (dbg.msg,"InsRoute: You gave me an existing route" );
  698. X           DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  699. X           return (NOT_DONE);
  700. X           }
  701. X
  702. X      /* Of course if the slot is empty this is a good thing            */
  703. X      if ( Entry->Link[c].Next == NOT_USED ) { Found = TRUE; break;   }
  704. X
  705. X      }
  706. X
  707. X   if ( Found )
  708. X      {
  709. X      Entry->Link[c].Next = NextHop;
  710. X      Entry->Link[c].Interface = Interf;
  711. X      Entry->Link[c].Cost = Cost;
  712. X      Entry->Link[c].Cumulated = 0;
  713. X      Entry->Link[c].Flag = 0;
  714. X      /* Since this route is new, I may as well try it :-)            */
  715. X      Entry->Try = c;    
  716. X      /* If this is a direct link then I say so !                */
  717. X      if ( Interf ) Entry->Direct = c;
  718. X      return (DONE);
  719. X      }
  720. X
  721. X   /* I really don't know where to put this route. you have to delete one !    */
  722. X   sprintf (dbg.msg,"InsRoute: Canot find a free slot to insert route" );
  723. X   DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  724. X   return (NOT_DONE);
  725. X   }
  726. X
  727. X/* ------------------------------------------------------------------------
  728. X * This insert a route in the appropriate slot...
  729. X * This assumes that the informations given are correct I.e. they
  730. X * are "legal" routings but may not be the "real" situation
  731. X * This allow to set routes for not existing hosts or subnet.
  732. X */
  733. Xint InsHostRoute ( struct HostEntry *Entry, int NextHop, int Interf, int Cost )
  734. X   {
  735. X   int Found;
  736. X   int c;
  737. X
  738. X   /* First thing to do is ... find a free space...
  739. X    * There is ONE case that reject the route add completly and that is 
  740. X    * when there is already the next how with the same interface
  741. X    */ 
  742. X   Found = FALSE;
  743. X   for ( c=1; c<=ROUTE_MAX; c++ )
  744. X      {
  745. X      if ( (Entry->Link[c].Next == NextHop) && 
  746. X           (Entry->Link[c].Interface == Interf) ) 
  747. X           {
  748. X           sprintf (dbg.msg,"InsRoute: Route exist Next %d If %d",NextHop, Interf );
  749. X           DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  750. X           return (NOT_DONE);
  751. X           }
  752. X
  753. X      /* Of course if the slot is empty this is a good thing            */
  754. X      if ( Entry->Link[c].Next == NOT_USED ) { Found = TRUE; break;   }
  755. X
  756. X      }
  757. X
  758. X   if ( Found )
  759. X      {
  760. X      Entry->Link[c].Next = NextHop;
  761. X      Entry->Link[c].Interface = Interf;
  762. X      Entry->Link[c].Cost = Cost;
  763. X      Entry->Link[c].Cumulated = 0;
  764. X      Entry->Link[c].Flag = 0;
  765. X      Entry->Direct = c;    
  766. X      return (DONE);
  767. X      }
  768. X
  769. X   /* I really don't know where to put this route. you have to delete one !    */
  770. X   sprintf (dbg.msg,"InsRoute: Canot find a free slot to insert route" );
  771. X   DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  772. X   return (NOT_DONE);
  773. X   }
  774. END_OF_FILE
  775.   if test 6390 -ne `wc -c <'IPP/lib/route/RouteAdd.c'`; then
  776.     echo shar: \"'IPP/lib/route/RouteAdd.c'\" unpacked with wrong size!
  777.   fi
  778.   # end of 'IPP/lib/route/RouteAdd.c'
  779. fi
  780. if test -f 'IPP/lib/route/ShowRoute.c' -a "${1}" != "-c" ; then 
  781.   echo shar: Will not clobber existing file \"'IPP/lib/route/ShowRoute.c'\"
  782. else
  783.   echo shar: Extracting \"'IPP/lib/route/ShowRoute.c'\" \(4908 characters\)
  784.   sed "s/^X//" >'IPP/lib/route/ShowRoute.c' <<'END_OF_FILE'
  785. X/* ---------------------------------------------------------------------------
  786. X * Ident: ShowRoute.c
  787. X * Author: Damiano Bolla 1993
  788. X * All this project is covered by the GNU Copyright.
  789. X */
  790. X
  791. X#include <stdio.h>
  792. X#include <string.h>
  793. X#include <sys/types.h>
  794. X#include <sys/time.h>
  795. X#include "defs.h"
  796. X#include "debug.h"
  797. X#include "packet.h"
  798. X#include "router.h"
  799. X#include "commands.h"
  800. X#include "func_defs.h"
  801. X
  802. Xextern struct Debug dbg;
  803. X
  804. Xvoid ShowNetRoute ( struct NetEntry *rdata, char *Buff, int Bufflen );
  805. Xvoid ShowHostRoute ( struct HostEntry *rdata, char *Buff, int Bufflen );
  806. X
  807. X/* This one looks at the tree tables of routing and try to print them
  808. X * in a nice way. The difficult thing is NOT to ooverflow th buffer.
  809. X */
  810. Xint ShowRoute ( struct Routing *rinfo, char *Buff, int Bufflen )
  811. X   {
  812. X   int d;
  813. X   char *ptr;
  814. X   char Lbuff[IPP_DATA+2];    /* This must be enough.. for one line        */
  815. X   int  Len;
  816. X
  817. X   ptr = Buff;
  818. X
  819. X   sprintf (ptr,"        Hosts routing \n");
  820. X   ptr += strlen (ptr); 
  821. X   sprintf (ptr,"Host \t Route \t Next \t If \t Cost \t Cumulated \n");
  822. X   ptr += strlen (ptr); 
  823. X   Len = Bufflen-strlen(Buff);
  824. X   ShowHostRoute ( rinfo->hostdata, ptr, Len);
  825. X
  826. X   ptr = Buff + strlen(Buff);
  827. X   sprintf (ptr,"        Net routing \n");
  828. X   ptr += strlen (ptr); 
  829. X   sprintf (ptr,"Net \t Route \t Next \t If \t Cost \t Cumulated \n");
  830. X   ptr += strlen (ptr); 
  831. X   Len = Bufflen-strlen(Buff);
  832. X   ShowNetRoute ( rinfo->netdata, ptr, Len );
  833. X
  834. X   ptr = Buff + strlen(Buff);
  835. X   sprintf (ptr,"        Parent routing \n");
  836. X   ptr += strlen (ptr); 
  837. X   sprintf (ptr,"Parent \t Route \t Next \t If \t Cost \t Cumulated \n");
  838. X   ptr += strlen (ptr); 
  839. X
  840. X   Len = Bufflen-strlen(Buff);
  841. X
  842. X   for (d=1; d<=ROUTE_MAX; d++ )
  843. X      {
  844. X      /* This check if there is data in the routing entry...            */
  845. X      if ( rinfo->parentdata.Link[d].Next == 0 ) continue;
  846. X
  847. X      sprintf (Lbuff,"Parent \t %d \t %d \t %d \t %d \t %d \n",d,
  848. X          rinfo->parentdata.Link[d].Next, rinfo->parentdata.Link[d].Interface, 
  849. X             rinfo->parentdata.Link[d].Cost, rinfo->parentdata.Link[d].Cumulated );
  850. X      if ( strlen(Buff)+strlen(Lbuff) >= Bufflen )
  851. X         {
  852. X     sprintf (Buff,"Failure");        /* Better than nothing...        */
  853. X         sprintf (dbg.msg,"ShowRoute: Buffer too small for all routing info");
  854. X           DebugCall ( ERR_MEMFAULT, DEBUG_ALERT );
  855. X           return (DONE);
  856. X         }
  857. X      strcpy (ptr, Lbuff);
  858. X      ptr += strlen (Lbuff);
  859. X      } /* End of the fro trough the routes                    */
  860. X   return (DONE);
  861. X   }
  862. X
  863. X
  864. X/* This function does once what othervise should be done three times.
  865. X * It is very similar to the above...
  866. X */
  867. Xvoid ShowNetRoute ( struct NetEntry *rdata, char *Buff, int Bufflen )
  868. X   {
  869. X   int c,d;
  870. X   char *ptr;
  871. X   char Lbuff[IPP_DATA+2];    /* This must be enough.. for one line        */
  872. X
  873. X   ptr = Buff;
  874. X
  875. X   for (c=1; c< ADDR_NUM; c++)
  876. X      {
  877. X      /* The following check if there is any data to show...            */
  878. X      if ( rdata[c].Try==0 )continue;
  879. X
  880. X      for (d=1; d<=ROUTE_MAX; d++ )
  881. X         {
  882. X         /* This check if there is data in the routing entry...            */
  883. X         if ( rdata[c].Link[d].Next == 0 ) continue;
  884. X
  885. X         sprintf (Lbuff,"%d \t %d \t %d \t %d \t %d \t %d \n",c,d,
  886. X             rdata[c].Link[d].Next, rdata[c].Link[d].Interface, 
  887. X                rdata[c].Link[d].Cost, rdata[c].Link[d].Cumulated );
  888. X         if ( strlen(Buff)+strlen(Lbuff) >= Bufflen )
  889. X            {
  890. X              sprintf (Buff,"Failure");        /* Better than nothing...        */
  891. X              sprintf (dbg.msg,"ShowRoute: Buffer too small for all routing info");
  892. X              DebugCall ( ERR_MEMFAULT, DEBUG_ALERT );
  893. X              return;
  894. X            }
  895. X         strcpy (ptr, Lbuff);
  896. X         ptr += strlen (Lbuff);
  897. X         } /* End of the fro trough the routes                    */
  898. X      } /* End of the for trough the hosts                    */
  899. X   }
  900. X
  901. Xvoid ShowHostRoute ( struct HostEntry *rdata, char *Buff, int Bufflen )
  902. X   {
  903. X   int c,d;
  904. X   char *ptr;
  905. X   char Lbuff[IPP_DATA+2];    /* This must be enough.. for one line        */
  906. X
  907. X   ptr = Buff;
  908. X
  909. X   for (c=1; c< ADDR_NUM; c++)
  910. X      {
  911. X      /* The following check if there is any data to show...            */
  912. X      if ( rdata[c].Direct==0 )continue;
  913. X
  914. X      for (d=1; d<=ROUTE_MAX; d++ )
  915. X         {
  916. X         /* This check if there is data in the routing entry...            */
  917. X         if ( rdata[c].Link[d].Next == 0 ) continue;
  918. X
  919. X         sprintf (Lbuff,"%d \t %d \t %d \t %d \t %d \t %d \n",c,d,
  920. X             rdata[c].Link[d].Next, rdata[c].Link[d].Interface, 
  921. X                rdata[c].Link[d].Cost, rdata[c].Link[d].Cumulated );
  922. X         if ( strlen(Buff)+strlen(Lbuff) >= Bufflen )
  923. X            {
  924. X              sprintf (Buff,"Failure");        /* Better than nothing...        */
  925. X              sprintf (dbg.msg,"ShowRoute: Buffer too small for all routing info");
  926. X              DebugCall ( ERR_MEMFAULT, DEBUG_ALERT );
  927. X              return;
  928. X            }
  929. X         strcpy (ptr, Lbuff);
  930. X         ptr += strlen (Lbuff);
  931. X         } /* End of the fro trough the routes                    */
  932. X      } /* End of the for trough the hosts                    */
  933. X   }
  934. X
  935. END_OF_FILE
  936.   if test 4908 -ne `wc -c <'IPP/lib/route/ShowRoute.c'`; then
  937.     echo shar: \"'IPP/lib/route/ShowRoute.c'\" unpacked with wrong size!
  938.   fi
  939.   # end of 'IPP/lib/route/ShowRoute.c'
  940. fi
  941. if test -f 'IPP/lib/utils/RcvPack.c' -a "${1}" != "-c" ; then 
  942.   echo shar: Will not clobber existing file \"'IPP/lib/utils/RcvPack.c'\"
  943. else
  944.   echo shar: Extracting \"'IPP/lib/utils/RcvPack.c'\" \(4614 characters\)
  945.   sed "s/^X//" >'IPP/lib/utils/RcvPack.c' <<'END_OF_FILE'
  946. X/* ----------------------------------------------------------------------------
  947. X * Ident: RcvPack.c
  948. X * Author: Damiano Bolla 1993
  949. X * All this project is covered by the GNU Copyright.
  950. X */
  951. X
  952. X#include <unistd.h>
  953. X#include <stdio.h>
  954. X#include <sys/types.h>
  955. X#include <netinet/in.h>
  956. X#include "defs.h"
  957. X#include "debug.h"
  958. X#include "packet.h"
  959. X#include "func_defs.h"
  960. X
  961. Xextern struct Debug dbg;
  962. X
  963. X/* This function receives a IPP network packet from the given FD.
  964. X * At the moment I assume that a read from an FD will behave in the
  965. X * same way for all possible Link type... Damiano
  966. X * It requires the structure err for distributed debugging.
  967. X * It also requires the structure describing the packet locally.
  968. X * This function will check the packet for integrity using the given checksum
  969. X * but it will NOT deal with addresses at all.
  970. X * There is an additional problem... the EOF..
  971. X * This function is the best candidate for a check on EOF on a fd.
  972. X * If I get an EOF I will the report it.
  973. X * This function will return DONE (0) if a good packet is received
  974. X * or NOT_DONE if a bad packet is received.
  975. X * NOTE: That the EOF flag may be set in both cases !!!
  976. X */
  977. X
  978. Xint RcvPack ( struct IPP *ipp, int fd, int *Eof )
  979. X   {
  980. X   char buff[IPP_DATA*2];    /* This should be more than enough        */
  981. X   int     Letti;        /* Char num read from fd            */
  982. X   char    *ptr;        /* A workig pointer                */
  983. X   char    *Tptr;        /* A workig pointer Tempory            */
  984. X   u_short Tshort;        /* A tmp , I need it                */
  985. X   u_short PackLen;        /* The received packet lenght            */
  986. X   u_long  Tlong;        /* A tmp , I need it                */
  987. X   u_long  Checksum;        /* The received checksum            */
  988. X
  989. X   Letti = read (fd, buff, IPP_DATA*2 );
  990. X   if ( Letti < 0 )
  991. X      {
  992. X      /* We have an error here... let's report it ! ..                 */
  993. X      sprintf (dbg.msg,"RcvPack: Read failed ");
  994. X      DebugCall ( ERR_BADRCV, DEBUG_ALERT );
  995. X      /* Should I set the EOF falg ? maybe a bit more testing of the exit code     */
  996. X      /* Have a look later, ok ?    Damiano                    */
  997. X      return (NOT_DONE);
  998. X      }
  999. X
  1000. X   if ( Letti == 0 )
  1001. X      {
  1002. X      /* We have got an EOF and this is not too bad...                */
  1003. X      sprintf (dbg.msg,"RcvPack: Read reached an EOF ");
  1004. X      DebugCall ( ERR_BADRCV, DEBUG_NOTICE );
  1005. X      *Eof = TRUE;
  1006. X      return (NOT_DONE);
  1007. X      }
  1008. X
  1009. X   ptr = buff;    /* I use a temporary work pointer                */
  1010. X   /* If I am here I know I have some chars in the buffer, lets scan it        */
  1011. X   memcpy ((char *)&Tshort, ptr, 2 );
  1012. X   PackLen = ntohs (Tshort);
  1013. X   ptr += 2;
  1014. X
  1015. X   if ( PackLen > (IPP_DATA*2) )
  1016. X      {
  1017. X      /* Hey ! I am not ready for giant packets at the moment..            */
  1018. X      sprintf (dbg.msg,"RcvPack: Read received a giant packet size %d bytes ",PackLen);
  1019. X      DebugCall ( ERR_BADRCV, DEBUG_ALERT );
  1020. X      return (NOT_DONE);
  1021. X      }
  1022. X
  1023. X   ipp->Sl = (((u_char)*ptr)&0xF0) >> 4;    /* Msb is the Sender length    */
  1024. X   ipp->Rl = ((u_char)*ptr++)&0x0F;    /* Lsb is the Receiver length        */
  1025. X
  1026. X   memcpy (ipp->SndAddr, ptr, ipp->Sl );
  1027. X   ptr += ipp->Sl;
  1028. X
  1029. X   memcpy (ipp->RcvAddr, ptr, ipp->Rl );
  1030. X   ptr += ipp->Rl;
  1031. X
  1032. X   ipp->Depth = ((u_char)*ptr++)&0x0F;    /* Lsb is the common tree depth valuel    */
  1033. X
  1034. X   ipp->From        = *ptr++;
  1035. X   ipp->Sender      = *ptr++;
  1036. X   ipp->PackId      = *ptr++;
  1037. X   ipp->NextRouter  = *ptr++;
  1038. X   ipp->NextHop     = *ptr++;
  1039. X   ipp->TTL         = *ptr++;
  1040. X   ipp->Type        = *ptr++;
  1041. X
  1042. X   memcpy ( (char *)&Tshort, ptr, 2 );
  1043. X   ptr += 2;        /* I MUST know that a short is this long        */
  1044. X   ipp->DataLen = ntohs ( Tshort );    /* All network data are in net format    */
  1045. X
  1046. X   if ( ipp->DataLen > IPP_DATA )
  1047. X      {
  1048. X      /* I obviously have a problem... I can't deal with this thing...        */
  1049. X      sprintf (dbg.msg,"RcvPack: A packet has too much data %d byes ",ipp->DataLen);
  1050. X      DebugCall ( ERR_BADRCV, DEBUG_ALERT );
  1051. X      return (NOT_DONE);
  1052. X      }
  1053. X
  1054. X   /* Ok, If I am here I can fit the data... let's do it            */
  1055. X   memcpy ( ipp->Data, ptr, ipp->DataLen );
  1056. X   ptr += ipp->DataLen;
  1057. X
  1058. X   memcpy ( (char *)&Tlong, ptr, 4 );
  1059. X   /* NOTE: I am not adding the last 4 bytes !! Damiano                */
  1060. X   Checksum = ntohl ( Tlong );
  1061. X
  1062. X   /* Ok, good all is full... I just need to calculate the checksum        */
  1063. X   /* The checksum is just the sum from the beginning to where ptr is of all    */
  1064. X   Tlong = 0;    /* Reset the sum...                        */
  1065. X   for ( Tptr=buff; Tptr < ptr; Tlong += *(Tptr++) );
  1066. X
  1067. X   if ( Tlong !=  Checksum )
  1068. X      {
  1069. X      /* Nooooo, not possible... wrong checksum ??? how is it possible ???    */
  1070. X      sprintf (dbg.msg,"RcvPack: A packet has wrong checksum !! ");
  1071. X      DebugCall ( ERR_BADRCV, DEBUG_ALERT );
  1072. X      return (NOT_DONE);
  1073. X      }
  1074. X
  1075. X   /* Ahhhh, ok, all is fine now. the packet is full and good            */
  1076. X   return (DONE);
  1077. X   }
  1078. X
  1079. END_OF_FILE
  1080.   if test 4614 -ne `wc -c <'IPP/lib/utils/RcvPack.c'`; then
  1081.     echo shar: \"'IPP/lib/utils/RcvPack.c'\" unpacked with wrong size!
  1082.   fi
  1083.   # end of 'IPP/lib/utils/RcvPack.c'
  1084. fi
  1085. if test -f 'IPP/lib/utils/SndPack.c' -a "${1}" != "-c" ; then 
  1086.   echo shar: Will not clobber existing file \"'IPP/lib/utils/SndPack.c'\"
  1087. else
  1088.   echo shar: Extracting \"'IPP/lib/utils/SndPack.c'\" \(4170 characters\)
  1089.   sed "s/^X//" >'IPP/lib/utils/SndPack.c' <<'END_OF_FILE'
  1090. X/* ----------------------------------------------------------------------------
  1091. X * Ident: SndPack.c
  1092. X * AUthor: Damiano Bolla 1993
  1093. X * All this project is covered by the GNU Copyright.
  1094. X */
  1095. X
  1096. X#include <unistd.h>
  1097. X#include <stdio.h>
  1098. X#include <sys/types.h>
  1099. X#include <netinet/in.h>
  1100. X#include "defs.h"
  1101. X#include "debug.h"
  1102. X#include "packet.h"
  1103. X#include "func_defs.h"
  1104. X
  1105. Xextern struct Debug dbg;
  1106. X
  1107. X/* This function sends a IPP network packet to the given FD.
  1108. X * At the moment I assume that a write to an FD will behave in the
  1109. X * same way for all possible Link type... Damiano
  1110. X * It also requires the structure describing the packet locally.
  1111. X * This function will compute the packet checksum
  1112. X * but it will NOT deal with addresses at all.
  1113. X * It is duty of someone above to have given the right FD !
  1114. X * This function is the best candidate for a check on EOF on a fd.
  1115. X * If I get an EOF I will the report it.
  1116. X * This function will return DONE (0) if a good packet is sent
  1117. X * or NOT_DONE if it cannot send a packet.
  1118. X * NOTE: That the EOF flag may be set in both cases !!!
  1119. X */
  1120. X
  1121. Xint SndPack ( struct IPP *ipp, int fd, int *Eof )
  1122. X   {
  1123. X   char buff[IPP_DATA*2];    /* This should be more than enough        */
  1124. X   int     Scritti;        /* umber of chars written into FD        */
  1125. X   char    *ptr;        /* A workig pointer                */
  1126. X   char    *Tptr;        /* A workig pointer Tempory            */
  1127. X   u_short Tshort;        /* A tmp , I need it                */
  1128. X   u_short PackLen;        /* The total packet length            */
  1129. X   u_long  Tlong;        /* A tmp , I need it                */
  1130. X   u_long  Checksum;        /* The checksum i am going to send        */
  1131. X
  1132. X   /* The firt thing to do is to build the packet from the given IPP structure    */
  1133. X   ptr = buff;    /* I use a temporary work pointer                */
  1134. X   
  1135. X   PackLen = 17 + ipp->Sl + ipp->Rl + ipp->DataLen;
  1136. X   if ( PackLen > (IPP_DATA * 2) )
  1137. X      {
  1138. X      sprintf (dbg.msg,"SndPack: Tryng to send a %d bytes long packet ",PackLen);
  1139. X      DebugCall ( ERR_BADSND, DEBUG_ALERT );
  1140. X      return (NOT_DONE);
  1141. X      }
  1142. X
  1143. X   if ( ipp->DataLen > IPP_DATA )
  1144. X      {
  1145. X      sprintf (dbg.msg,"SndPack: Tryng to send a %d bytes Data ",ipp->DataLen);
  1146. X      DebugCall ( ERR_BADSND, DEBUG_ALERT );
  1147. X      return (NOT_DONE);
  1148. X      }
  1149. X
  1150. X   /* I have to convert this in a network format... REMEBAR !!!            */
  1151. X   Tshort = htons (PackLen);
  1152. X   memcpy ( ptr, (char *)&Tshort, 2);
  1153. X   ptr += 2;
  1154. X
  1155. X   /* Sl is in the MSB and Rl is in tle LSB                    */
  1156. X   *ptr++ = (ipp->Sl << 4) | (ipp->Rl & 0x0F);
  1157. X
  1158. X   memcpy (ptr, ipp->SndAddr, ipp->Sl );
  1159. X   ptr += ipp->Sl;
  1160. X
  1161. X   memcpy (ptr, ipp->RcvAddr, ipp->Rl );
  1162. X   ptr += ipp->Rl;
  1163. X
  1164. X   /* Unused is in the MSB and Depth is in tle LSB                */
  1165. X   *ptr++ = 0 | (ipp->Depth & 0x0F);
  1166. X
  1167. X   *ptr++ = ipp->From;
  1168. X   *ptr++ = ipp->Sender;
  1169. X   *ptr++ = ipp->PackId;
  1170. X   *ptr++ = ipp->NextRouter;
  1171. X   *ptr++ = ipp->NextHop;
  1172. X   *ptr++ = ipp->TTL;    
  1173. X   *ptr++ = ipp->Type;
  1174. X
  1175. X   Tshort = htons (ipp->DataLen);
  1176. X   memcpy ( ptr, (char *)&Tshort, 2);
  1177. X   ptr += 2;
  1178. X  
  1179. X   memcpy (ptr, ipp->Data, ipp->DataLen);
  1180. X   ptr += ipp->DataLen;
  1181. X
  1182. X   /* Ok, good all is full... I just need to calculate the checksum        */
  1183. X   /* The checksum is just the sum from the beginning to where ptr is of all    */
  1184. X   Checksum = 0;    /* Reset the sum...                        */
  1185. X   for ( Tptr=buff; Tptr < ptr; Checksum += *(Tptr++) );
  1186. X
  1187. X   Tlong = htonl(Checksum);
  1188. X   memcpy (ptr, (char *)&Tlong, 4);
  1189. X
  1190. X   /* Done, the packet is ready to send.. let's tr to send it            */
  1191. X   Scritti = write (fd, buff, PackLen );
  1192. X
  1193. X   if ( Scritti < 0 )
  1194. X      {
  1195. X      /* Hey we have a serious problem here !,, it failed completly !        */
  1196. X      /* We must have goten and EOF... BUT CHECK Damiano            */
  1197. X      *Eof = TRUE;
  1198. X      sprintf (dbg.msg,"SndPack: Write failed completly, possible EOF");
  1199. X      DebugCall ( ERR_BADSND, DEBUG_ALERT );
  1200. X      return (NOT_DONE);
  1201. X      }
  1202. X
  1203. X   if ( Scritti != PackLen )
  1204. X      {
  1205. X      /* This is really difficult to handle... the pachet is lost anyway    */
  1206. X      /* I HAVE to get the manual and see what the write errcode are !        */
  1207. X      /* Get down to this !    Damiano                        */
  1208. X      sprintf (dbg.msg,"SndPack: Write Did NOT send all data");
  1209. X      DebugCall ( ERR_BADSND, DEBUG_ALERT );
  1210. X      return (NOT_DONE);
  1211. X      }
  1212. X
  1213. X   /* Oh, well if I am here it is all fine and well.. happy hacking        */
  1214. X   return (DONE);
  1215. X   }
  1216. X
  1217. END_OF_FILE
  1218.   if test 4170 -ne `wc -c <'IPP/lib/utils/SndPack.c'`; then
  1219.     echo shar: \"'IPP/lib/utils/SndPack.c'\" unpacked with wrong size!
  1220.   fi
  1221.   # end of 'IPP/lib/utils/SndPack.c'
  1222. fi
  1223. if test -f 'IPP/lib/utils/ipp_utils.c' -a "${1}" != "-c" ; then 
  1224.   echo shar: Will not clobber existing file \"'IPP/lib/utils/ipp_utils.c'\"
  1225. else
  1226.   echo shar: Extracting \"'IPP/lib/utils/ipp_utils.c'\" \(5870 characters\)
  1227.   sed "s/^X//" >'IPP/lib/utils/ipp_utils.c' <<'END_OF_FILE'
  1228. X/* ---------------------------------------------------------------------------
  1229. X * Ident: ipp_utils.c
  1230. X * Author: Damiano Bolla 1993
  1231. X * All this project is covered by the GNU Copyright.
  1232. X */
  1233. X
  1234. X#include <stdio.h>
  1235. X#include <unistd.h>
  1236. X#include <malloc.h>
  1237. X#include <sys/types.h>
  1238. X#include <string.h>
  1239. X#include "defs.h"
  1240. X#include "packet.h"
  1241. X#include "debug.h"
  1242. X#include "func_defs.h"
  1243. X
  1244. Xextern struct Debug dbg;
  1245. X
  1246. X/* This transform an address into an ascii string
  1247. X * it returns the converted string if OK otherwise NULL
  1248. X * It does not care of the Depth... should it ?
  1249. X */
  1250. Xchar *ipp_ntoa ( struct IPPaddr *addr )
  1251. X   {
  1252. X   int c;
  1253. X   int addrlen;
  1254. X   char tmp[10];    
  1255. X   static char Risul[ADDR_DEPTH*5];    
  1256. X   char *ptr;
  1257. X
  1258. X   /* All this code is EXTREMLY UGLY... I just want to go to sleep...        */
  1259. X   addrlen = addr->Al;
  1260. X   if ( (addrlen>=ADDR_DEPTH) || (addrlen<=0) ) return (NULL);
  1261. X
  1262. X   ptr = Risul;
  1263. X   for ( c=0; c<addrlen; c++)
  1264. X      {
  1265. X      sprintf (tmp,"%d.",addr->Addr[c]);
  1266. X      strcpy (ptr,tmp);
  1267. X      ptr += strlen (tmp);
  1268. X      }
  1269. X
  1270. X   /* Ok, now.. there is a trailing dot... let's take that away..        */
  1271. X   *(--ptr) = 0;
  1272. X   return (Risul);
  1273. X   }
  1274. X
  1275. X/* This converts an ascii reppresentation of an address into the corresponding
  1276. X * Machine rappresentation.
  1277. X * If something goes wrong it returns a NULL pointer..
  1278. X * The from address remains unchanged...
  1279. X * It is assumed that a given address is ALWAYS from depth Zero.
  1280. X */
  1281. Xstruct IPPaddr *ipp_aton ( char *from )
  1282. X   {
  1283. X   int c;
  1284. X   int tmp;
  1285. X
  1286. X   char *from1;
  1287. X   char *from1orig;
  1288. X   static struct IPPaddr risul;
  1289. X
  1290. X   from1 = (char *)malloc (strlen(from)+2);
  1291. X   if ( from1 == NULL ) return (NULL);
  1292. X   from1orig = from1;    /* Have to remembar this...                */
  1293. X
  1294. X   risul.Al = 0;
  1295. X   risul.Depth = 0;
  1296. X
  1297. X   strcpy (from1, from);
  1298. X   strtok (from1,".");
  1299. X
  1300. X   c=0;
  1301. X   /* I have to check that there is something to convert to a number AND
  1302. X    * That I am not running wild away somewhere AND
  1303. X    * That the converted address hos no zeros inside...
  1304. X    */
  1305. X   while (from1 && (c<ADDR_DEPTH) )
  1306. X      {
  1307. X      if ( (tmp=atoi(from1)) == 0) break;
  1308. X      risul.Addr[c++]=tmp;    /* This is a good one    */
  1309. X      from1=strtok(NULL,".");
  1310. X      }
  1311. X
  1312. X   free (from1orig);
  1313. X
  1314. X   if ( c <= 0 ) return (NULL);
  1315. X
  1316. X   risul.Al = c;
  1317. X   return (&risul);
  1318. X   }
  1319. X
  1320. X/* ---------------------------------------------------------------------------
  1321. X * This one copy an address into the Sender field of a packet...
  1322. X * Returns DONE if all ok NOT_DONE othewise
  1323. X * In theory... the packet depth and Sender depth should be the same...
  1324. X * So.. this will jsut stomp over the packet depth.. ? Damiano
  1325. X */
  1326. Xint ipp_AtoS ( struct IPPaddr *src, struct IPP *dest )
  1327. X   {
  1328. X   if ( (src == NULL) || (dest == NULL) ) return (NOT_DONE);
  1329. X   if ( src->Al >= ADDR_DEPTH ) return (NOT_DONE);
  1330. X
  1331. X   dest->Sl = src->Al;
  1332. X   memcpy (dest->SndAddr, src->Addr, src->Al );
  1333. X
  1334. X   dest->Depth = src->Depth;
  1335. X   return (DONE);
  1336. X   }
  1337. X
  1338. X/* ---------------------------------------------------------------------------
  1339. X * This one copy an address into the Receiver field of a packet...
  1340. X * Returns DONE if all ok NOT_DONE othewise
  1341. X * Same as above for the depth.. Damiano
  1342. X */
  1343. Xint ipp_AtoR ( struct IPPaddr *src, struct IPP *dest )
  1344. X   {
  1345. X   if ( (src == NULL) || (dest == NULL) ) return (NOT_DONE);
  1346. X   if ( src->Al >= ADDR_DEPTH ) return (NOT_DONE);
  1347. X
  1348. X   dest->Rl = src->Al;
  1349. X   memcpy (dest->RcvAddr, src->Addr, src->Al );
  1350. X
  1351. X   dest->Depth = src->Depth;
  1352. X   return (DONE);
  1353. X   }
  1354. X
  1355. X
  1356. X/* ---------------------------------------------------------------------------
  1357. X * This one copy an address from the Sender field of a packet...
  1358. X * Returns DONE if all ok NOT_DONE othewise
  1359. X */
  1360. Xint ipp_StoA ( struct IPP *src, struct IPPaddr *dest )
  1361. X   {
  1362. X   if ( (src == NULL) || (dest == NULL) ) return (NOT_DONE);
  1363. X   if ( src->Sl >= ADDR_DEPTH ) return (NOT_DONE);
  1364. X
  1365. X   dest->Al = src->Sl;
  1366. X   memcpy (dest->Addr, src->SndAddr, src->Sl );
  1367. X
  1368. X   dest->Depth = src->Depth;
  1369. X   return (DONE);
  1370. X   }
  1371. X
  1372. X/* ---------------------------------------------------------------------------
  1373. X * This one copy an address from the Receiver field of a packet...
  1374. X * Returns DONE if all ok NOT_DONE othewise
  1375. X */
  1376. Xint ipp_RtoA ( struct IPP *src, struct IPPaddr *dest )
  1377. X   {
  1378. X   if ( (src == NULL) || (dest == NULL) ) return (NOT_DONE);
  1379. X   if ( src->Rl >= ADDR_DEPTH ) return (NOT_DONE);
  1380. X
  1381. X   dest->Al = src->Rl;
  1382. X   memcpy (dest->Addr, src->RcvAddr, src->Rl );
  1383. X
  1384. X   dest->Depth = src->Depth;
  1385. X   return (DONE);
  1386. X   }
  1387. X
  1388. X
  1389. X/* ---------------------------------------------------------------------------
  1390. X * This one copy an address from an IPPaddr to another IPPaddr...
  1391. X * Returns DONE if all ok NOT_DONE othewise
  1392. X */
  1393. Xint ipp_AtoA ( struct IPPaddr *dest, struct IPPaddr *src )
  1394. X   {
  1395. X   if ( (src == NULL) || (dest == NULL) ) return (NOT_DONE);
  1396. X   if ( src->Al >= ADDR_DEPTH ) return (NOT_DONE);
  1397. X
  1398. X   dest->Al = src->Al;
  1399. X   memcpy (dest->Addr, src->Addr, src->Al );
  1400. X
  1401. X   dest->Depth = src->Depth;
  1402. X   return (DONE);
  1403. X   }
  1404. X
  1405. X/* ---------------------------------------------------------------------------
  1406. X * This one is asimple one :-) It gets apointer to what should be an INT
  1407. X * and return the number if all is OK 0 otherwise
  1408. X */
  1409. Xint ipp_atoi ( char *Arg )
  1410. X   {
  1411. X   if ( Arg ) return (atoi(Arg));
  1412. X   else return (0);
  1413. X   }
  1414. X
  1415. X/* ---------------------------------------------------------------------------
  1416. X * This function will set the packet sender and receiver according with the
  1417. X * information given in the Snd and Rcv data.
  1418. X * It will take care of generating the "right depth" from the two addresses
  1419. X */
  1420. Xint SetPackAddr ( struct IPP *ipp, struct IPPaddr *Snd, struct IPPaddr *Rcv )
  1421. X   {
  1422. X   if ( (ipp==NULL) || (Snd == NULL) || (Rcv == NULL) ) return (NOT_DONE);
  1423. X
  1424. X   if ( Snd->Depth || Rcv->Depth )
  1425. X      {
  1426. X      sprintf (dbg.msg,"SetPackAddr: Depth different than zero  ");
  1427. X      DebugCall ( ERR_BADDEPTH, DEBUG_ALERT );
  1428. X      return (NOT_DONE);
  1429. X      }
  1430. X
  1431. X   ipp_AtoS ( Snd, ipp);
  1432. X   ipp_AtoR ( Rcv, ipp);
  1433. X
  1434. X   return (DONE);
  1435. X   }
  1436. END_OF_FILE
  1437.   if test 5870 -ne `wc -c <'IPP/lib/utils/ipp_utils.c'`; then
  1438.     echo shar: \"'IPP/lib/utils/ipp_utils.c'\" unpacked with wrong size!
  1439.   fi
  1440.   # end of 'IPP/lib/utils/ipp_utils.c'
  1441. fi
  1442. if test -f 'IPP/logd/logd.c' -a "${1}" != "-c" ; then 
  1443.   echo shar: Will not clobber existing file \"'IPP/logd/logd.c'\"
  1444. else
  1445.   echo shar: Extracting \"'IPP/logd/logd.c'\" \(3661 characters\)
  1446.   sed "s/^X//" >'IPP/logd/logd.c' <<'END_OF_FILE'
  1447. X/* ----------------------------------------------------------------------
  1448. X * Ident: logd.c
  1449. X * Author: Damiano Bolla, 1993
  1450. X * All this project is covered by the GNU Copyright.
  1451. X */
  1452. X
  1453. X/* This program open a socket and then read debugging info from it.
  1454. X * Once data arrives it reads it and then display it.
  1455. X * It also prints who sent the data and when it was sent
  1456. X */
  1457. X
  1458. X#include <stdio.h>
  1459. X#include <sys/types.h>
  1460. X#include <sys/socket.h>
  1461. X#include <sys/time.h>
  1462. X#include <netdb.h>
  1463. X#include <netinet/in.h>
  1464. X#include <signal.h>
  1465. X#include <sys/utsname.h>
  1466. X#include "defs.h"    
  1467. X#include "debug.h"
  1468. X
  1469. Xmain ()
  1470. X   {
  1471. X   int listen_socket;
  1472. X   int listen_port;
  1473. X   struct sockaddr_in address;
  1474. X   struct hostent *host_name;
  1475. X   int address_len;
  1476. X   int error;
  1477. X   time_t now;
  1478. X
  1479. X   /* I need a buffer for the messages...                */
  1480. X   char MsgBuff[ERR_PACKET+2];
  1481. X
  1482. X   listen_socket = socket ( PF_INET, SOCK_DGRAM, 0); 
  1483. X   if ( listen_socket < 0)
  1484. X      {
  1485. X      fprintf (stderr,"logd: Cannot create the SOCK_DGRAM socket \n");
  1486. X      exit (1);
  1487. X      }
  1488. X
  1489. X   /* Let's fille the sturcture with good data...            */
  1490. X   address_len = sizeof (struct sockaddr_in);
  1491. X   if ( getsockname (listen_socket, 
  1492. X           (struct sockaddr *)&address, 
  1493. X           &address_len ) )
  1494. X      {
  1495. X      fprintf (stderr,"Cannot get info on the SOCK_DGRAM socket \n");
  1496. X      close ( listen_socket );    /* Do not forget this            */
  1497. X      return (1);
  1498. X      }
  1499. X
  1500. X   /* I have to try to bind this socket to a port that is NOT in use...    */
  1501. X   /* The magic numbers here have nothing magic.. see the socket manual    */
  1502. X   for (listen_port=1234; listen_port<32000; listen_port++ )
  1503. X      {
  1504. X      address.sin_port = htons(listen_port);    
  1505. X      if ( bind ( listen_socket,
  1506. X           (struct sockaddr *)&address,
  1507. X                   sizeof(address))==0) break;
  1508. X      else
  1509. X         perror ("Cannot bind");
  1510. X      }
  1511. X
  1512. X   /* I assume I got a port, If I havent the getsockname will tell me..    */
  1513. X   address_len = sizeof (struct sockaddr_in);
  1514. X   if ( getsockname (listen_socket, 
  1515. X           (struct sockaddr *)&address, 
  1516. X           &address_len ) )
  1517. X      {
  1518. X      fprintf (stderr,"Cannot get info on the SOCK_DGRAM socket \n");
  1519. X      close ( listen_socket );    /* Do not forget this            */
  1520. X      return (1);
  1521. X      }
  1522. X
  1523. X   gethostname(MsgBuff,ERR_PACKET);
  1524. X   printf ("LogdHost %s \n",MsgBuff );
  1525. X   printf ("LogdPort %d \n",ntohs(address.sin_port)); 
  1526. X
  1527. X   /* Now it is time to start listening for messages            */
  1528. X   for (;;)
  1529. X      {
  1530. X      address_len = sizeof (struct sockaddr_in);
  1531. X      error = recvfrom (listen_socket,     /* The socket from where to get data    */
  1532. X        MsgBuff,         /* Destination buffer            */
  1533. X        ERR_PACKET,         /* Size of the buffer            */
  1534. X        0,            /* Options                */
  1535. X        (struct sockaddr *)&address,     /* A place where to store     */
  1536. X        &address_len         /* The length of address        */
  1537. X        );
  1538. X      if ( error > 0 )
  1539. X     {
  1540. X     printf ("---------------------------------------------------------\n");
  1541. X
  1542. X     /* Then let's write down when this happened so I know when        */
  1543. X     now=time(NULL);    /* Get the time                    */
  1544. X     printf ("At Time %s",ctime(&now) );
  1545. X
  1546. X     /* Let's see who generated it so I can track it down...            */
  1547. X         host_name = gethostbyaddr ( (char*)&address.sin_addr.s_addr,4,AF_INET);
  1548. X     if ( host_name ) printf ("From %s \n",host_name->h_name);
  1549. X         else printf ("From %s \n",inet_ntoa(address.sin_addr) );
  1550. X
  1551. X         /* Then we can display the message we received                */
  1552. X     /* If I received n chars the Zero goes at the Nth char            */
  1553. X     MsgBuff[error] = 0;    /* This works because the +2            */
  1554. X     printf ("%s \n",MsgBuff);
  1555. X     }
  1556. X      else
  1557. X     {
  1558. X     perror ("Logd failed bcause recvfrom error");
  1559. X     break;
  1560. X     }
  1561. X
  1562. X      } /* End of the newerending for loop                    */
  1563. X
  1564. X   /* No point to make a fuss out of it..                    */
  1565. X   exit (0);
  1566. X   }
  1567. END_OF_FILE
  1568.   if test 3661 -ne `wc -c <'IPP/logd/logd.c'`; then
  1569.     echo shar: \"'IPP/logd/logd.c'\" unpacked with wrong size!
  1570.   fi
  1571.   # end of 'IPP/logd/logd.c'
  1572. fi
  1573. if test -f 'IPP/router/ProcessCall.c' -a "${1}" != "-c" ; then 
  1574.   echo shar: Will not clobber existing file \"'IPP/router/ProcessCall.c'\"
  1575. else
  1576.   echo shar: Extracting \"'IPP/router/ProcessCall.c'\" \(5742 characters\)
  1577.   sed "s/^X//" >'IPP/router/ProcessCall.c' <<'END_OF_FILE'
  1578. X/* ---------------------------------------------------------------------------
  1579. X * Ident: ProcessCall.c
  1580. X * Author: Damiano Bolla 1993
  1581. X * All this project is covered by the GNU Copyright.
  1582. X */
  1583. X
  1584. X#include <stdio.h>
  1585. X#include <unistd.h>
  1586. X#include <string.h>
  1587. X#include <sys/types.h>
  1588. X#include <sys/socket.h>
  1589. X#include <sys/time.h>
  1590. X#include <netinet/in.h>
  1591. X#include "defs.h"
  1592. X#include "debug.h"
  1593. X#include "packet.h"
  1594. X#include "router.h"
  1595. X#include "commands.h"
  1596. X#include "func_defs.h"
  1597. X
  1598. Xextern struct Debug dbg;
  1599. X
  1600. X/* This function has a newly created FD to talk with and it has a message
  1601. X * just sent in the channel describing what is needed.
  1602. X * It then needs to look at what it has and decide waht to do
  1603. X * If it decides that the new socket is not needed it can close it !
  1604. X */
  1605. X
  1606. Xint ProcessCall ( struct Routing *rinfo, 
  1607. X    int Interface,
  1608. X    int Newsocket,
  1609. X    char *Msg )
  1610. X   {
  1611. X   char *Cmd;
  1612. X   char *Arg;
  1613. X   char Null[2]={0};
  1614. X   struct IPPaddr *RemAddr;
  1615. X   int NextHop;
  1616. X   int Cost;
  1617. X   int Shortest;
  1618. X
  1619. X   if ((Cmd=strtok (Msg, CMD_SEP))==NULL) Cmd=Null;
  1620. X   if ((Arg=strtok (NULL, CMD_SEP))==NULL) Arg=Null;
  1621. X
  1622. X   sprintf (dbg.msg,"ProcessCall: Received '%s' '%s'",Cmd,Arg);
  1623. X   DebugCall ( ERR_MSG, DEBUG_TEXT );
  1624. X
  1625. X   /* The only thing that I am able to do at connection setup is address    */
  1626. X   if ( strcasecmp (Cmd,CMD_ADDR) != 0 )
  1627. X      {
  1628. X      sprintf (dbg.msg,"ProcessCall: Instead of address i got '%s'",Cmd);
  1629. X      DebugCall ( ERR_NOCOMM, DEBUG_NOTICE );
  1630. X      close (Newsocket);
  1631. X      return (NOT_DONE);
  1632. X      }
  1633. X
  1634. X   /* Good good let me see now.. is the given address a valid one ?        */
  1635. X   /* Oh boy if this part is going to be tedious...                */
  1636. X   RemAddr = ipp_aton(Arg);
  1637. X   if ( RemAddr==NULL )
  1638. X      {
  1639. X      sprintf (dbg.msg,"ProcessCall: Got an illegal address '%s'",Arg);
  1640. X      DebugCall ( ERR_BADADDR, DEBUG_NOTICE );
  1641. X      close (Newsocket);
  1642. X      return (NOT_DONE);
  1643. X      }
  1644. X
  1645. X   if ( RemAddr->Al > rinfo->MyAddr.Al+1  )
  1646. X      {
  1647. X      sprintf (dbg.msg,"ProcessCall: Call with address too deep '%s'",Arg);
  1648. X      DebugCall ( ERR_BADADDR, DEBUG_NOTICE );
  1649. X      close (Newsocket);
  1650. X      return (NOT_DONE);
  1651. X      }
  1652. X
  1653. X   if ( (rinfo->MyAddr.Al==1) && (RemAddr->Al==0) )
  1654. X      {
  1655. X      sprintf (dbg.msg,"ProcessCall: There is no parent of a top level '%s'",Arg);
  1656. X      DebugCall ( ERR_BADADDR, DEBUG_NOTICE );
  1657. X      close (Newsocket);
  1658. X      return (NOT_DONE);
  1659. X      }
  1660. X
  1661. X   if ( RemAddr->Al < rinfo->MyAddr.Al-1 )
  1662. X      {
  1663. X      sprintf (dbg.msg,"ProcessCall: Cannot link a two level up parent '%s'",Arg);
  1664. X      DebugCall ( ERR_BADADDR, DEBUG_NOTICE );
  1665. X      close (Newsocket);
  1666. X      return (NOT_DONE);
  1667. X      }
  1668. X
  1669. X   Shortest = min(RemAddr->Al,rinfo->MyAddr.Al);
  1670. X   if ( strncmp(RemAddr->Addr,rinfo->MyAddr.Addr,Shortest-1) != 0 )
  1671. X      {
  1672. X      sprintf (dbg.msg,"ProcessCall: router and caller don't match '%s'",Arg);
  1673. X      DebugCall ( ERR_BADADDR, DEBUG_NOTICE );
  1674. X      close (Newsocket);
  1675. X      return (NOT_DONE);
  1676. X      }
  1677. X
  1678. X   /* Ok.. I have the new nice descriptor here, but where do I put it ??    */
  1679. X   /* Let's make a simple rule... an interface with a Ring will hold        */
  1680. X   /* It's own newly created channell.. otherwise it become too complicatde    */
  1681. X   if ( rinfo->ifdata[Interface].Line ) 
  1682. X      {
  1683. X      if ( ExistFd ( rinfo->ifdata[Interface].Line , SOCK_TECH) )
  1684. X         {
  1685. X         sprintf (dbg.msg,"ProcessCall: Channel already exist");
  1686. X         DebugCall ( ERR_NOTCLOSE, DEBUG_ALERT );
  1687. X         close (Newsocket);
  1688. X         return (NOT_DONE);
  1689. X         }
  1690. X      else close (  rinfo->ifdata[Interface].Line ); 
  1691. X      }
  1692. X
  1693. X   /* Ok, now I am shure that this line if free, let's set it            */
  1694. X   rinfo->ifdata[Interface].Line = Newsocket;
  1695. X
  1696. X   /* good, I just have to set up the routing ttable...                */
  1697. X   /* This is good since this is a direct link to whatever is the address    */
  1698. X   if (RemAddr->Al > rinfo->MyAddr.Al)
  1699. X      {
  1700. X      struct NetEntry *Entry;
  1701. X      Entry = &rinfo->netdata[RemAddr->Addr[RemAddr->Al-2]];
  1702. X      NextHop = RemAddr->Addr[RemAddr->Al-1];
  1703. X      Cost = 1;
  1704. X      if ( InsNetRoute ( Entry, NextHop, Interface, Cost ) )
  1705. X         {
  1706. X         /* Too bad that this failed.. now i have to clean up !!!            */
  1707. X         rinfo->ifdata[Interface].Line = 0;    /* Say that this line is free    */
  1708. X         close ( Newsocket );            /* Not used anymore..        */
  1709. X         sprintf (dbg.msg,"ProcessCall: Cannot setup Network route");
  1710. X         DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  1711. X         return (NOT_DONE);
  1712. X         }
  1713. X      return (DONE);
  1714. X      }
  1715. X      
  1716. X   if (RemAddr->Al == rinfo->MyAddr.Al)
  1717. X      {
  1718. X      struct HostEntry *Entry;
  1719. X      Entry = &rinfo->hostdata[RemAddr->Addr[RemAddr->Al-1]];
  1720. X      NextHop = RemAddr->Addr[RemAddr->Al-1];
  1721. X      Cost = 1;
  1722. X      if ( InsHostRoute ( Entry, NextHop, Interface, Cost ) )
  1723. X         {
  1724. X         /* Too bad that this failed.. now i have to clean up !!!            */
  1725. X         rinfo->ifdata[Interface].Line = 0;    /* Say that this line is free    */
  1726. X         close ( Newsocket );            /* Not used anymore..        */
  1727. X         sprintf (dbg.msg,"ProcessCall: Cannot setup Host route");
  1728. X         DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  1729. X         return (NOT_DONE);
  1730. X         }
  1731. X      return (DONE);
  1732. X      }
  1733. X
  1734. X   if (RemAddr->Al < rinfo->MyAddr.Al )
  1735. X      {
  1736. X      struct NetEntry *Entry;
  1737. X      Entry = &rinfo->parentdata;
  1738. X      NextHop = RemAddr->Addr[RemAddr->Al-1];
  1739. X      Cost = 1;
  1740. X      if ( InsNetRoute ( Entry, NextHop, Interface, Cost ) )
  1741. X         {
  1742. X         /* Too bad that this failed.. now i have to clean up !!!            */
  1743. X         rinfo->ifdata[Interface].Line = 0;    /* Say that this line is free    */
  1744. X         close ( Newsocket );            /* Not used anymore..        */
  1745. X         sprintf (dbg.msg,"ProcessCall: Cannot setup Host route");
  1746. X         DebugCall ( ERR_BADROUTE, DEBUG_ALERT );
  1747. X         return (NOT_DONE);
  1748. X         }
  1749. X      return (DONE);
  1750. X      }
  1751. X
  1752. X   return (DONE);
  1753. X   }
  1754. X
  1755. END_OF_FILE
  1756.   if test 5742 -ne `wc -c <'IPP/router/ProcessCall.c'`; then
  1757.     echo shar: \"'IPP/router/ProcessCall.c'\" unpacked with wrong size!
  1758.   fi
  1759.   # end of 'IPP/router/ProcessCall.c'
  1760. fi
  1761. if test -f 'IPP/router/SetInterface.c' -a "${1}" != "-c" ; then 
  1762.   echo shar: Will not clobber existing file \"'IPP/router/SetInterface.c'\"
  1763. else
  1764.   echo shar: Extracting \"'IPP/router/SetInterface.c'\" \(4729 characters\)
  1765.   sed "s/^X//" >'IPP/router/SetInterface.c' <<'END_OF_FILE'
  1766. X/* ---------------------------------------------------------------------------
  1767. X * Ident: SetInterface.c
  1768. X * Author: Damiano Bolla 1993
  1769. X * All this project is covered by the GNU Copyright.
  1770. X */
  1771. X
  1772. X#include <stdio.h>
  1773. X#include <unistd.h>
  1774. X#include <string.h>
  1775. X#include <sys/types.h>
  1776. X#include <sys/time.h>
  1777. X#include "defs.h"
  1778. X#include "debug.h"
  1779. X#include "packet.h"
  1780. X#include "router.h"
  1781. X#include "commands.h"
  1782. X#include "func_defs.h"
  1783. X
  1784. Xextern struct Debug dbg;
  1785. X
  1786. X/* This function receives a string that describes the interface to set up
  1787. X * The string is a series of tokens separated by spaces or tabs.. :-)
  1788. X * The string format is the following
  1789. X * 1) The interface number to set up from 1 onward to IF_MAX included
  1790. X * 2) The technology used, currently is tcp, even if prevision for atm 
  1791. X * 3) yes/no indicatin if the interface receives incoming calls or not
  1792. X * 4) A strings describing optional params, in cas of tcp with no Ring
  1793. X *    The string is a hostname and a port number where to set a link
  1794. X * If one interface overwrite a previous one a warning is issued
  1795. X * but the program continues.
  1796. X */
  1797. Xint SetInterface ( struct Routing *rinfo, char *Arg )
  1798. X   {
  1799. X   int  LinkNum;    /* Int identifing the link num                */
  1800. X   int  EndPort;    /* An integer indicating the end port to connect    */
  1801. X   char *Tech;        /* Technology used for this link            */
  1802. X   char *Ring;        /* Can this link ring or not ?                */
  1803. X   char *EndNam;    /* A string indicating the name of the endpoint(host)    */
  1804. X   char Null[2]={0};
  1805. X
  1806. X   LinkNum = ipp_atoi(strtok (Arg,CMD_SEP));
  1807. X   if ((Tech=strtok (NULL,CMD_SEP))==NULL) Tech=Null;
  1808. X   if ((Ring=strtok (NULL,CMD_SEP))==NULL) Ring=Null;
  1809. X   if ((EndNam=strtok (NULL,CMD_SEP))==NULL) EndNam=Null;
  1810. X   EndPort = ipp_atoi(strtok (NULL,CMD_SEP));
  1811. X
  1812. X   if ( (LinkNum <= 0) || (LinkNum >IF_MAX) )
  1813. X      {
  1814. X      sprintf (dbg.msg,"SetInetrface: Out of range Link Number %d",LinkNum);
  1815. X      DebugCall ( ERR_BADLINK, DEBUG_ALERT );
  1816. X      return (NOT_DONE);
  1817. X      }
  1818. X
  1819. X   if ( strcasecmp(Tech,SOCK_TECH_NAM) != 0 )
  1820. X      {
  1821. X      sprintf (dbg.msg,"SetInetrface: This technology is not supported %s",Tech);
  1822. X      DebugCall ( ERR_NOTECH, DEBUG_ALERT );
  1823. X      return (NOT_DONE);
  1824. X      }
  1825. X
  1826. X   /* Ok, we are talking sockets here...                    */
  1827. X   if ( strcasecmp (Ring,SAY_YES) == 0 )
  1828. X      {
  1829. X      /* Ok we have a ringing interface here...                    */
  1830. X      /* What I have to do is to set it listen.... and report the params    */
  1831. X      int ListenSock;
  1832. X      int ListenPort;
  1833. X      char ListenHost[IP_NAMLEN+2];
  1834. X
  1835. X      if ( Listen ( &ListenSock, ListenHost, &ListenPort ) ) return (NOT_DONE);
  1836. X
  1837. X      /* I have to do it here after I know I have new good params...            */
  1838. X      if ( rinfo->ifdata[LinkNum].Line || rinfo->ifdata[LinkNum].Ring )
  1839. X         {
  1840. X         sprintf (dbg.msg,"SetInetrface: The Link %d was already configured",LinkNum);
  1841. X         DebugCall ( ERR_LNKUSED, DEBUG_NOTICE );
  1842. X         /* NOTE NOTE... NEWER close channle 0 !!!!                */
  1843. X         if ( rinfo->ifdata[LinkNum].Line ) close (rinfo->ifdata[LinkNum].Line);
  1844. X         if ( rinfo->ifdata[LinkNum].Ring ) close (rinfo->ifdata[LinkNum].Ring);
  1845. X         }
  1846. X
  1847. X      rinfo->ifdata[LinkNum].Ring = ListenSock;
  1848. X      rinfo->ifdata[LinkNum].RingPort = ListenPort;
  1849. X      strcpy(rinfo->ifdata[LinkNum].RingHost,ListenHost);
  1850. X      rinfo->ifdata[LinkNum].Technology = SOCK_TECH;
  1851. X      rinfo->ifdata[LinkNum].Sent = 0;
  1852. X      rinfo->ifdata[LinkNum].Received = 0;
  1853. X
  1854. X      /* Ok, we have all what is needed, I just have to output what interface     */
  1855. X      /* Is listening on what port....                        */
  1856. X
  1857. X      printf ("ListeningPort %d %s %d \n",LinkNum,ListenHost,ListenPort );
  1858. X      return (DONE);
  1859. X      }
  1860. X
  1861. X   if ( strcasecmp (Ring,SAY_NO) == 0 )
  1862. X      {
  1863. X      /* no ringing interface :-), I need to connect to a peer...            */
  1864. X      int Line;    
  1865. X      
  1866. X      if ( Connect ( EndNam, EndPort, &Line, &rinfo->MyAddr ) ) return (NOT_DONE);
  1867. X
  1868. X      /* I have to do it here after I know I have new good params...            */
  1869. X      if ( rinfo->ifdata[LinkNum].Line || rinfo->ifdata[LinkNum].Ring )
  1870. X         {
  1871. X         sprintf (dbg.msg,"SetInetrface: The Link %d was already configured",LinkNum);
  1872. X         DebugCall ( ERR_LNKUSED, DEBUG_NOTICE );
  1873. X         /* NOTE NOTE... NEWER close channle 0 !!!!                */
  1874. X         if ( rinfo->ifdata[LinkNum].Line ) close (rinfo->ifdata[LinkNum].Line);
  1875. X         if ( rinfo->ifdata[LinkNum].Ring ) close (rinfo->ifdata[LinkNum].Ring);
  1876. X         }
  1877. X
  1878. X      /* OK, boy... just record the mess...                    */
  1879. X      rinfo->ifdata[LinkNum].Line = Line;
  1880. X      rinfo->ifdata[LinkNum].Technology = SOCK_TECH;
  1881. X      rinfo->ifdata[LinkNum].Sent = 0;
  1882. X      rinfo->ifdata[LinkNum].Received = 0;
  1883. X      return (DONE);
  1884. X      }
  1885. X
  1886. X   sprintf (dbg.msg,"SetInterface: Wrong parameters ");
  1887. X   DebugCall ( ERR_CONFIG, DEBUG_ALERT );
  1888. X   return (NOT_DONE);
  1889. X   }
  1890. END_OF_FILE
  1891.   if test 4729 -ne `wc -c <'IPP/router/SetInterface.c'`; then
  1892.     echo shar: \"'IPP/router/SetInterface.c'\" unpacked with wrong size!
  1893.   fi
  1894.   # end of 'IPP/router/SetInterface.c'
  1895. fi
  1896. echo shar: End of archive 3 \(of 6\).
  1897. cp /dev/null ark3isdone
  1898. MISSING=""
  1899. for I in 1 2 3 4 5 6 ; do
  1900.     if test ! -f ark${I}isdone ; then
  1901.     MISSING="${MISSING} ${I}"
  1902.     fi
  1903. done
  1904. if test "${MISSING}" = "" ; then
  1905.     echo You have unpacked all 6 archives.
  1906.     rm -f ark[1-9]isdone
  1907. else
  1908.     echo You still must unpack the following archives:
  1909.     echo "        " ${MISSING}
  1910. fi
  1911. exit 0
  1912. exit 0 # Just in case...
  1913.