Newer
Older
rtmp / amf.c
@reddawg reddawg on 17 May 2007 11 KB Sync
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "rtmp.h"

int amfDoHandshake(int fd) {
  int recLen = 0x0;
  int i      = 0x0;
  int cmd    = 0x0;
  char data1[1536];
  char data2[1536];

  recLen = sReadSocket(fd,&cmd,1);
  if (cmd != 0x03) {
    return(-1);
    }

  recLen = sReadSocket(fd,&data1,1536);

  for (i = 0;i < 1536;i++) {
    data2[i] = (char)i;
    }
  if (send(fd,&cmd,1,MSG_NOSIGNAL) != 1) {
    printf("Error Sending Header\n");
    return(-1);
    }
  if (send(fd,&data2,1536,MSG_NOSIGNAL) != 1536) {
    printf("Error Sending Hand2\n");
    return(-1);
    }
  if (send(fd,&data1,1536,0) != 1536) {
    printf("Error Sending Hand1\n");
    return(-1);
    }
  if (sReadSocket(fd,&data1,1536) != 1536) {
    printf("Error: getting handshake\n");
    return(-1);
    }
  printf("Got all data!\n");

  return(0x0);
  }


int amfDoAccept(int fd) {
  char raw1[] = {0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x07,0xeb,0x58,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x96,0x14,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x00,0x3f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x04,0x63,0x6f,0x64,0x65,0x02,0x00,0x1d,0x4e,0x65,0x74,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x2e,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x2e,0x53,0x75,0x63,0x63,0x65,0x73,0x73,0x00,0x05,0x6c,0x65,0x76,0x65,0x6c,0x02,0x00,0x06,0x73,0x74,0x61,0x74,0x75,0x73,0x00,0x07,0x64,0x65,0x74,0x61,0x69,0x6c,0x73,0x05,0x00,0x0b,0x64,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x02,0x00,0x15,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x75,0x63,0x63,0x65,0x65,0x64,0x65,0x64,0x2e,0x00,0x0e,0x6f,0x62,0x6a,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x03,0xd0,0x90,0x02,0xc3,0x63,0x74,0x45,0x6e,0x63,0x6f,0x64,0x69,0x6e,0x67,0x00,0x40,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09};
  int recLen = 0x0;

  recLen = send(fd,&raw1,sizeof(raw1),0);
  if (recLen != sizeof(raw1))
    return(-1);

  return(0x0);
  }

int amfGetData(int fd) {
  int AMF;
  int recLen     = 0x0;
  int amfID      = 0x0;
  int headerSize = 0x0;
  int packetSize = 0x0;
  char data[12];
  amfHeader *amfHdr = (amfHeader *)&data;

  recLen = sReadSocket(fd,&AMF,1);
  if (recLen != 1)
    return(-1);

  headerSize = (AMF & 0xC0) >> 6;
  amfID      = (AMF & 0x3F);

  printf("HeaderSize: [%i]\n",headerSize);

  switch(headerSize) {
    case 0:
      recLen = sReadSocket(fd,&data,11);
      printf("12 Byte Header\n");
      packetSize = (amfHdr->amfSize[0] * 256 * 256) + (amfHdr->amfSize[1] * 256) + amfHdr->amfSize[2];
      printf("PacketSize: [%i]\n",packetSize);
      AMFS[amfID].bodySize  = packetSize;
      AMFS[amfID].bodyCount = 0;
      AMFS[amfID].body = (char *)malloc(packetSize);
      AMFS[amfID].amfType = amfHdr->amfType[0];
      if (packetSize > 128) {
        sReadSocket(fd,AMFS[amfID].body + AMFS[amfID].bodyCount,128);
        AMFS[amfID].bodyCount = 128;
        }
      else {
        sReadSocket(fd,AMFS[amfID].body + AMFS[amfID].bodyCount,packetSize);
        AMFS[amfID].bodyCount = packetSize;
         }
      break;
    case 1:
      printf("8 Byte Header\n");
      recLen = sReadSocket(fd,&data,7);
      packetSize = (amfHdr->amfSize[0] * 256 * 256) + (amfHdr->amfSize[1] * 256) + amfHdr->amfSize[2];
      printf("PacketSize: [%i]\n",packetSize);
      AMFS[amfID].bodySize  = packetSize;
      AMFS[amfID].bodyCount = 0;
      AMFS[amfID].body = (char *)malloc(packetSize);
      AMFS[amfID].amfType = amfHdr->amfType[0];
      if ((AMFS[amfID].bodySize - AMFS[amfID].bodyCount) > 128) {
        sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount),128);
        AMFS[amfID].bodyCount += 128;
        }
      else {
        printf("Bal: (%i)\n",(AMFS[amfID].bodySize - AMFS[amfID].bodyCount));
        recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount));
        AMFS[amfID].bodyCount += (AMFS[amfID].bodySize - AMFS[amfID].bodyCount);
        printf("Received: [%i]\n",recLen);
        }
      break;
    case 2:
      printf("4 Byte Header\n");
      if ((AMFS[amfID].bodySize - AMFS[amfID].bodyCount) > 128) {
        sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),128);
        AMFS[amfID].bodyCount += 128;
        }
      else {
        printf("Bal: (%i)\n",(AMFS[amfID].bodySize - AMFS[amfID].bodyCount));
        recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount));
        AMFS[amfID].bodyCount += (AMFS[amfID].bodySize - AMFS[amfID].bodyCount);
        printf("Received: [%i]\n",recLen);
        }
      break;
    case 3:
      printf("1 Byte Header\n");
      if ((AMFS[amfID].bodySize - AMFS[amfID].bodyCount) > 128) {
        //sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),128);
        sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount),128);
        printf("Bigger Before: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]);
        AMFS[amfID].bodyCount += 128;
        printf("Bigger After: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]);
        }
      else {
        printf("Bal: (%i)\n",(AMFS[amfID].bodySize - AMFS[amfID].bodyCount));
        //recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount));
        recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount));
        printf("Received: [%i]\n",recLen);
        printf("Less Before: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]);
        AMFS[amfID].bodyCount += (AMFS[amfID].bodySize - AMFS[amfID].bodyCount);
        printf("Less After: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]);
        }
      break;

    default:
      printf("Unhandled Header Size: [%i:0x%X]\n",headerSize,amfID);
      return(-1);
      break;
    }

  if (AMFS[amfID].bodySize == AMFS[amfID].bodyCount) {
    amfProcessPacket(fd,amfID);
    }
  return(0x0);
  }

int amfProcessPacket(fd,amfID) {
  switch (AMFS[amfID].amfType) {
    case 0x11:
      amfMessage(fd,amfID);
      break;
    case 0x14:
      amfFunction(fd,amfID);
      printf("AMF FUNCTION\n");
      break;
    default:
      printf("Not a supported type: [0x%X]\n",AMFS[amfID].amfType);
      break;
    }
  return(0x0);
  }

int amfMessage(int fd, int amfID) {
  int i  = 0x0;
  int s  = 0x0;
  int mI = 0x0;
  int ch = 0x0;
  int x  = 0x0;
  char *packet = 0x0;
  char data[1024];

  packet = AMFS[amfID].body;

  for (i=0;i<AMFS[amfID].bodySize;i++) {
    ch = packet[i];
    /* Display to stdout */
    if (ch >= 60 && ch <= 128)
      printf("[%c]",ch);
    else
      printf("[0x%X]",ch);

    }


  /* Skip to message not sure what the header information is yet */
  for (i=0;i<AMFS[amfID].bodySize;i++) {
    ch = packet[i];
    if (ch == 0x0A)
      break;
    }

  i += 3;

  s = (int)packet[i] - (((int)packet[i] + 1) /2);

  printf("\n");

  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';

  printf("E0: [%s]\n",data);

  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E1: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E2: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E3: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E4: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E5: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E6: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E7: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E8: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E9: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E10: [%s]\n",data);
  i += x;
  if (packet[i] == 0x6) i++;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E11: [%s]\n",data);
  i += x;
  /*
  if (packet[i] == 0x6) i++;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E12: [%s]\n",data);
  */
  printf("E12: [0x%X]\n",packet[i]);
  i += 1;
  if (packet[i] != 0x0) {
    printf("E13-S: [0x%X]\n",packet[i]);
    if (packet[i] == 0x6) i++;
    s = (int)packet[i] - (((int)packet[i] + 1) /2);
  
    for (x=1;x<=s;x++) {
      data[x-1] = packet[i + x];
      }
    data[x-1] = '\0';
    printf("E13: [%s]\n",data);
    }
  else {
    printf("E13: NULL\n");
    x = 1;
    }

  i += x;
  /*
  if (packet[i] == 0x6) i++;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  */
  printf("E14: [0x%X:0x%X]\n",packet[i+1],packet[i+2]);
  x = 2;

  i += x;
  printf("TEST: [0x%X:%c]\n",packet[i],packet[i]);
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E15: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E16: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E17: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E18: [%s]\n",data);
  i += x;
  s = (int)packet[i] - (((int)packet[i] + 1) /2);
  for (x=1;x<=s;x++) {
    data[x-1] = packet[i + x];
    }
  data[x-1] = '\0';
  printf("E19: [%s]\n",data);



  return(0x0);
  };

int amfFunction(int fd,int amfID) {
  int   i      = 0x0;
  int   ch     = 0x0;
  char *packet = 0x0;
  char  function[256];

  packet = AMFS[amfID].body;

  for (i = 0;i < packet[2];i++) {
    function[i] = packet[i + 3];
    }
  function[i] = '\0';
  printf("Function: [%s]\n",function);
  if (!strcmp(function,"connect"))
    amfDoAccept(fd);

  for (i=0;i<AMFS[amfID].bodySize;i++) {
    ch = packet[i];
    if (ch >= 10 && ch <= 128)
    printf("[%c]",ch);
    else
      printf("[0x%X]",ch);
    }
  printf("\n");
  return(0x0);
  }