log.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Source file for diva log facility
  3.  *
  4.  * Copyright (C) Eicon Technology Corporation, 2000.
  5.  *
  6.  * Eicon File Revision :    1.5  
  7.  *
  8.  * This software may be used and distributed according to the terms
  9.  * of the GNU General Public License, incorporated herein by reference.
  10.  *
  11.  */
  12. #include "sys.h"
  13. #include "idi.h"
  14. #include "divas.h"
  15. #include "adapter.h"
  16. #include "divalog.h"
  17. #include "uxio.h"
  18. /*Counter to monitor number of messages */ 
  19. static int m_count;
  20.  
  21. #define     MAX_BUFFERED_MSGS   (1000)
  22. /* Our Linked List Structure to hold message */
  23. typedef struct klog_link{
  24.   klog_t klog;
  25.   struct klog_link *next;
  26. }KNODE;
  27. /* First & Last structures in list*/
  28. KNODE *head;
  29. KNODE *tail;
  30. /* 
  31.  * retrieve message from FIFO buffer
  32.  * returns NULL if buffer empty
  33.  * otherwise returns pointer to entry 
  34.  */
  35. char *DivasLogFifoRead(void)
  36. {
  37. KNODE *old_head;
  38. if(head==NULL) 
  39. {
  40. /* Buffer Empty - No Messages */
  41. return NULL;
  42. }
  43. m_count--;
  44. /* Keep track of message to be read & increment to next message*/
  45. old_head = head;
  46. head = head->next;
  47.     /*Return ptr to Msg */
  48.     return((char *)old_head);
  49. }
  50. /* 
  51.  * write message into FIFO buffer
  52.  */
  53. void DivasLogFifoWrite(char *entry, int length)
  54. {
  55.     KNODE *new_klog;
  56.     if(head == NULL) 
  57.     {
  58. /* No Entries in Log */
  59. tail=NULL;
  60. m_count=0;
  61. new_klog=UxAlloc(sizeof(KNODE));
  62. if(new_klog==NULL)
  63. {
  64. return;
  65. }
  66. m_count++;
  67. memset(new_klog, 0, sizeof(KNODE));
  68. /* Set head & tail to point to the new Msg Struct */
  69. head=tail=new_klog;
  70. tail->next=NULL;
  71.     }
  72.     else
  73.     {
  74. new_klog=UxAlloc(sizeof(KNODE));
  75. if(new_klog==NULL)
  76. {
  77. return;
  78. }
  79. m_count++;
  80. memset(new_klog, 0, sizeof(KNODE));
  81. /* Let last Msg Struct point to new Msg Struct & inc tail */
  82. tail->next=new_klog;
  83. tail=new_klog;
  84. tail->next=NULL;
  85.     }
  86.     if (length > sizeof(klog_t))
  87.     {
  88.         length = sizeof(klog_t);
  89.     }
  90.     memcpy(&tail->klog, entry, length);
  91.     return;
  92. }
  93. /*
  94.  * DivaslogFifoEmpty:return TRUE if FIFO buffer is empty,otherwise FALSE
  95.  */
  96. int DivasLogFifoEmpty(void)
  97. {
  98. return (m_count == 0);
  99. }
  100. /*
  101.  *DivasLogFifoFull:return TRUE if FIFO buffer is full,otherwise FALSE
  102.  */
  103. int DivasLogFifoFull(void)
  104. {
  105. return (m_count == MAX_BUFFERED_MSGS);
  106. }
  107. /*
  108.  * generate an IDI log entry
  109.  */
  110. void DivasLogIdi(card_t *card, ENTITY *e, int request)
  111. {
  112. klog_t klog;
  113. memset(&klog, 0, sizeof(klog));
  114. klog.time_stamp = UxTimeGet();
  115. klog.length = sizeof(ENTITY) > sizeof(klog.buffer) ?
  116. sizeof(klog.buffer) : sizeof(ENTITY);
  117. klog.card = (int) (card - DivasCards);
  118. klog.type = request ? KLOG_IDI_REQ : KLOG_IDI_CALLBACK;
  119. klog.code = 0;
  120. memcpy(klog.buffer, e, klog.length);
  121.     /* send to the log driver and return */
  122.     DivasLogAdd(&klog, sizeof(klog));
  123. return;
  124. }