ec_buffer.c
上传用户:nilegod
上传日期:2007-01-08
资源大小:220k
文件大小:4k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- comunication buffer between illithid and ettercap
  3.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <unistd.h>
  19. #include <string.h>
  20. #include <errno.h>
  21. #include <sys/ipc.h>
  22. #include <sys/shm.h>
  23. #include "include/ec_main.h"
  24. #include "include/ec_error.h"
  25. #ifdef DEBUG
  26.    #include "include/ec_debug.h"
  27. #endif
  28. #define MAX_BUFFERS 10
  29. #define HEAD_LEN 8
  30. typedef struct {
  31.     char *data;
  32.     int len;
  33.     int key;
  34. }Buffer_Data;
  35. // global data
  36. Buffer_Data Buffer_List[MAX_BUFFERS];
  37. int Buffer_Index;
  38. // protos...
  39. int Buffer_Get(int bufferID, void *data, int size);
  40. int Buffer_Put(int bufferID, void *data, int size);
  41. int Buffer_Create(int len);
  42. void Buffer_Flush(int ID);
  43. // ----------------------------
  44. int Buffer_Create(int len)
  45. {
  46.     int i;
  47. #ifdef DEBUG
  48.    Debug_msg("Buffer_Create -- %d", len);
  49. #endif
  50.    for (i=0; i<MAX_BUFFERS; i++)
  51.    {
  52.       if (!Buffer_List[i].data)
  53.       {
  54.          Buffer_List[i].key = shmget(0,len+HEAD_LEN,IPC_CREAT | 0600);
  55.          if (Buffer_List[i].key == -1)
  56.             Error_msg("Can't attach %d bytes of shared memory",len);
  57.          Buffer_List[i].data = (char *)shmat(Buffer_List[i].key,0,0);
  58.          Buffer_List[i].len = len;
  59.          shmctl(Buffer_List[i].key, IPC_RMID, NULL);
  60.          memset(Buffer_List[i].data,0,HEAD_LEN);
  61.          break;
  62.       }
  63.    }
  64.    if (i == MAX_BUFFERS) i=-1;
  65.    return i;
  66. }
  67. void Buffer_Flush(int ID)
  68. {
  69.     if (!Buffer_List[ID].data) return;
  70.     // Reset offsets
  71.     memset(Buffer_List[ID].data, 0, HEAD_LEN);
  72. }
  73. int Buffer_Get(int ID, void *to_read, int size)
  74. {
  75.    int reprise;
  76.    unsigned long *R_Offset, W_Offset;
  77.    char *data;
  78.    if (!Buffer_List[ID].data) return -1;
  79.    R_Offset = (unsigned long *)Buffer_List[ID].data;
  80.    W_Offset = *(unsigned long *)(Buffer_List[ID].data+4);
  81.    data     = (char *)(Buffer_List[ID].data+8);
  82.    if (*R_Offset<=W_Offset && *R_Offset+size>W_Offset)
  83.        size = (W_Offset)-(*R_Offset);
  84.    reprise =- Buffer_List[ID].len+(*R_Offset)+size;
  85.    if (reprise>(long)W_Offset)
  86.    {
  87.        size -= reprise-(W_Offset);
  88.        reprise = W_Offset;
  89.    }
  90.    if (reprise<0)
  91.        memcpy((char *)to_read, data+(*R_Offset), size);
  92.    else
  93.    {
  94.        memcpy((char *)to_read, data+(*R_Offset), size-reprise);
  95.        memcpy(((char *)to_read)+size-reprise, data, reprise);
  96.    }
  97.    *R_Offset=(*R_Offset+size)%Buffer_List[ID].len;
  98.    return size;
  99. }
  100. int Buffer_Put(int ID, void *to_write, int size)
  101. {
  102.    int reprise;
  103.    unsigned long *R_Offset, *W_Offset;
  104.    char *data;
  105.    if (!Buffer_List[ID].data) return -1;
  106.    R_Offset = (unsigned long *)Buffer_List[ID].data;
  107.    W_Offset = (unsigned long *)(Buffer_List[ID].data+4);
  108.    data     = (char *)(Buffer_List[ID].data+8);
  109.    reprise  =- Buffer_List[ID].len + (*W_Offset) + size;
  110.    while((*W_Offset<*R_Offset && *W_Offset+size>=*R_Offset) || reprise>=(long)*R_Offset)
  111.        usleep(1);
  112.    if (reprise<=0)
  113.        memcpy(data+*W_Offset, (char *)to_write, size);
  114.    else
  115.    {
  116.        memcpy(data+*W_Offset, (char *)to_write, size-reprise);
  117.        memcpy(data, ((char *)to_write)+size-reprise ,reprise);
  118.    }
  119.    *W_Offset = (*W_Offset+size)%Buffer_List[ID].len;
  120.    return 0;
  121. }
  122. /* EOF */