home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / auucp+-1.02 / fuucp_plus_src.lzh / uucplib / libinit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-07  |  2.8 KB  |  116 lines

  1. /*
  2.    libinit.c
  3.  
  4.    EnthΣlt Standard Library Funtionen der amigauucpplus.library.
  5.  
  6.    Copyright (C) 1991 Ingo Feulner. Alle Rechte vorbehalten.
  7. */
  8.  
  9. #include "uucpbase.h"
  10. #include "uucpproto.h"
  11.  
  12. // Prototypes
  13. ULONG __asm LibExpunge(register __a6 struct UUCPBase *libbase);
  14. struct UUCPBase *__asm LibInit(register __d0 ULONG,
  15.                                register __a0 ULONG);
  16. struct UUCPBase *__asm LibOpen(register __a6 struct UUCPBase *);
  17. ULONG __asm LibClose(register __a6 struct UUCPBase *);
  18. ULONG __asm LibNull(VOID);
  19.  
  20.  
  21.  
  22.  
  23. struct UUCPBase *__asm LibInit(register __d0 ULONG lb,
  24.                                register __a0 ULONG seglist)
  25. {
  26.   struct UUCPBase *UUCPBase;
  27.  
  28.   UUCPBase               = (struct UUCPBase *)lb;
  29.   UUCPBase->ub_SegList   = seglist;
  30.   UUCPBase->ConfigBuffer = NULL;
  31.   UUCPBase->TempCounter  = 0;
  32.   UUCPBase->Error        = NULL;
  33.  
  34.   // DOS Library V36 ÷ffnen (OS 2.0)
  35.   UUCPBase->ub_DOSBase = (struct DosLibrary *)OpenLibrary(DOSNAME, 36L);
  36.   if(UUCPBase->ub_DOSBase != NULL)
  37.   {
  38.     /* Memory Liste und Semaphore initialisieren */
  39.     NewList((struct List *)&(UUCPBase->ub_MemList.ml_List));
  40.     InitSemaphore(&(UUCPBase->ub_MemList.ml_Semaphore));
  41.  
  42.     return UUCPBase;
  43.   }
  44.  
  45.   return NULL;
  46. }
  47.  
  48. ULONG __asm LibExpunge(register __a6 struct UUCPBase *UUCPBase)
  49. {
  50.   ULONG seglist;
  51.  
  52.   if(UUCPBase->LibNode.lib_OpenCnt == 0)
  53.   {
  54.     /* really expunge: remove libbase and freemem        */
  55.     Remove((struct Node *)UUCPBase);
  56.  
  57.     seglist = UUCPBase->ub_SegList;
  58.  
  59.     /* Meinen eigens allozierten Speicher wieder freigeben: */
  60.     if(UUCPBase->ConfigBuffer != NULL)
  61.       FreeMem(UUCPBase->ConfigBuffer, UUCPBase->CB_Length);
  62.  
  63.     UUFreeAllMem(NULL);
  64.  
  65.     /* Die DosLibrary wieder Schlie▀en: */
  66.     CloseLibrary((struct Library *)UUCPBase->ub_DOSBase);
  67.  
  68.     FreeMem((void *)(((long)UUCPBase) - UUCPBase->LibNode.lib_NegSize),
  69.              UUCPBase->LibNode.lib_NegSize + UUCPBase->LibNode.lib_PosSize);
  70.  
  71.     return (ULONG)seglist;
  72.   }
  73.   else
  74.   {
  75.     UUCPBase->LibNode.lib_Flags |= LIBF_DELEXP;
  76.     return (ULONG)0;
  77.   }
  78. }
  79.  
  80. struct UUCPBase *__asm LibOpen(register __a6 struct UUCPBase *UUCPBase)
  81. {
  82.   /* mark us as having another customer */
  83.   UUCPBase->LibNode.lib_OpenCnt++;
  84.  
  85.   /* clear delayed expunges (standard procedure)                */
  86.   UUCPBase->LibNode.lib_Flags &= ~LIBF_DELEXP;
  87.  
  88.   return UUCPBase;
  89. }
  90.  
  91. ULONG __asm LibClose(register __a6 struct UUCPBase *UUCPBase)
  92. {
  93.   ULONG retval = 0;
  94.  
  95.   UUCPBase->LibNode.lib_OpenCnt--;
  96.  
  97.   // Speicher freigeben, der von der Library fⁿr diesen Task belegt wurde
  98.   UUFreeAllMem(FindTask(NULL));
  99.  
  100.   if ((UUCPBase->LibNode.lib_OpenCnt == 0) &&
  101.       (UUCPBase->LibNode.lib_Flags & LIBF_DELEXP ))
  102.   {
  103.     /* no more people have me open,
  104.      * and I have a delayed expunge pending
  105.      */
  106.     retval = LibExpunge(UUCPBase); /* return segment list        */
  107.   }
  108.   return retval;
  109. }
  110.  
  111.  
  112. ULONG __asm LibNull(VOID)
  113. {
  114.   return 0;
  115. }
  116.