int Dictionary::get_int(char *key) {
	NMString strkey(key);
	for(Iterator i = start(); i.has_val(); i.next()) {
		KeyValue kv = i.val();
		if(kv.first == strkey) {
			return atoi(kv.second.text);
		}
	}
	return 0;
}
bool Dictionary::get_string(char *key, char *buff, int buffsize) {
	NMString strkey(key);
	for(Iterator i = start(); i.has_val(); i.next()) {
		KeyValue kv = i.val();
		if(kv.first == strkey) {
			mir_snprintf(buff, buffsize, "%s", kv.second.text);
			return true;
		}
	}
	return false;
}
Beispiel #3
0
/*
 * Delete a specified keyword from a string if it appears there
 */
void
strcut(char *src, const char *key)
{
    char *s, *d;

    if ((s = strkey(src, key)) != 0) {
	d = s + strlen(key);
	while (*d != '\0' && !LETTER(*d))
	    d++;
	while ((*s++ = *d++) != '\0') ;
    }
}
Beispiel #4
0
unsigned long
csport(register Cs_t* state, const char* type, const char* serv)
{
	unsigned long	n;
	char*		t;

	if (streq(serv, "reserved"))
		return CS_PORT_RESERVED;
	if (streq(serv, "normal"))
		return CS_PORT_NORMAL;
	n = strtol(serv, &t, 0);
	if (t > serv && *t == '.')
		strtol(t + 1, &t, 0);
	if (*t)
	{
		if (strneq(serv, CS_SVC_INET, sizeof(CS_SVC_INET) - 1))
		{
			serv += sizeof(CS_SVC_INET) - 1;
#if CS_LIB_SOCKET || CS_LIB_V10
			{
				struct servent*	sp;

#if CS_LIB_V10
				if (sp = in_service(serv, type, 0))
					return sp->port;
#endif
#if CS_LIB_SOCKET
				if (sp = getservbyname(serv, type))
					return ntohs(sp->s_port);
#endif
			}
#endif
			switch (strkey(serv))
			{
			case HASHKEY6('t','c','p','m','u','x'):
				return 1;
			case HASHKEY4('e','c','h','o'):
				return 7;
			case HASHKEY6('d','i','s','c','a','r'):
				return 9;
			case HASHKEY6('s','y','s','t','a','t'):
				return 11;
			case HASHKEY6('d','a','y','t','i','m'):
				return 13;
			case HASHKEY6('n','e','t','s','t','a'):
				return 15;
			case HASHKEY4('q','o','t','d'):
				return 17;
			case HASHKEY6('c','h','a','r','g','e'):
				return 19;
			case HASHKEY3('f','t','p'):
				return 21;
			case HASHKEY6('t','e','l','n','e','t'):
				return 23;
			case HASHKEY4('s','m','t','p'):
				return 25;
			case HASHKEY4('t','i','m','e'):
				return 37;
			case HASHKEY3('r','l','p'):
				return 39;
			case HASHKEY4('n','a','m','e'):
				return 42;
			case HASHKEY5('w','h','o','i','s'):
				return 43;
			case HASHKEY6('d','o','m','a','i','n'):
				return 53;
			case HASHKEY3('m','t','p'):
				return 57;
			case HASHKEY5('b','o','o','t','p'):
				return 67;
			case HASHKEY6('b','o','o','t','p','c'):
				return 68;
			case HASHKEY4('t','f','t','p'):
				return 69;
			case HASHKEY6('g','o','p','h','e','r'):
				return 70;
			case HASHKEY3('r','j','e'):
				return 77;
			case HASHKEY6('f','i','n','g','e','r'):
				return 79;
			case HASHKEY4('h','t','t','p'):
				return 80;
			case HASHKEY4('l','i','n','k'):
				return 87;
			case HASHKEY6('s','u','p','d','u','p'):
				return 95;
			case HASHKEY6('h','o','s','t','n','a'):
				return 101;
			case HASHKEY4('x',HASHKEYN('4'),HASHKEYN('0'),HASHKEYN('0')):
				return 103;
			case HASHKEY6('s','u','n','r','p','c'):
				return 111;
			case HASHKEY4('a','u','t','h'):
				return 113;
			case HASHKEY4('s','f','t','p'):
				return 115;
			case HASHKEY4('n','n','t','p'):
				return 119;
			case HASHKEY4('e','r','p','c'):
				return 121;
			case HASHKEY3('n','t','p'):
				return 123;
			case HASHKEY4('i','m','a','p'):
				return 143;
			case HASHKEY4('s','n','m','p'):
				return 161;
			case HASHKEY5('p','r','o','x','y'):
				return 402;
			case HASHKEY3('a','t','x'):
				if (access("/etc/in.atxd", F_OK))
					break;
				return 512;
			case HASHKEY4('b','i','f','f'):
				return 512;
			case HASHKEY4('e','x','e','c'):
				return 512;
			case HASHKEY5('l','o','g','i','n'):
				return 513;
			case HASHKEY3('w','h','o'):
				return 513;
			case HASHKEY5('s','h','e','l','l'):
				return 514;
			case HASHKEY6('s','y','s','l','o','g'):
				return 514;
			case HASHKEY6('p','r','i','n','t','e'):
				return 515;
			case HASHKEY4('t','a','l','k'):
				return 517;
			case HASHKEY5('n','t','a','l','k'):
				return 518;
			case HASHKEY5('r','o','u','t','e'):
				return 520;
			case HASHKEY5('t','i','m','e','d'):
				return 525;
			case HASHKEY5('t','e','m','p','o'):
				return 526;
			case HASHKEY4('u','u','c','p'):
				return 540;
			}
		}
		return CS_PORT_INVALID;
	}
	return n;
}
Beispiel #5
0
/*
 * Get OS name, version & architecture we're running on
 */
void platform(state *st)
{
#ifdef HAVE_UNAME
#if defined(_AIX) || defined(__linux) || defined(__APPLE__)
	FILE *fp;
#endif
#if defined(__arm__) || defined(__mips__) || defined(__APPLE__)
	char buf[BUFSIZE];
#endif
#ifdef __linux
	struct stat file;
#endif
	struct utsname name;
	char sysname[64];
	char release[64];
	char machine[64];
	char *c;

	/* Fetch system information */
	uname(&name);

	strclear(sysname);
	strclear(release);
	strclear(machine);

	/* AIX-specific */
#ifdef _AIX

	/* Fix uname() results */
	sstrlcpy(machine, "powerpc");
	snprintf(release, sizeof(release), "%s.%s",
		name.version,
		name.release);

	/* Get CPU type */
	if ((fp = popen("/usr/sbin/getsystype -i", "r"))) {
		fgets(machine, sizeof(machine), fp);
		pclose(fp);

		strreplace(machine, ' ', '_');
	}

	/* Get hardware name using shell uname */
	if (!*st->server_description &&
	    (fp = popen("/usr/bin/uname -M", "r"))) {

		fgets(st->server_description,
			sizeof(st->server_description), fp);
		pclose(fp);

		strreplace(st->server_description, ',', ' ');
		chomp(st->server_description);
	}
#endif

	/* Mac OS X, just like Unix but totally different... */
#ifdef __APPLE__

	/* Hardcode OS name */
	sstrlcpy(sysname, "MacOSX");

	/* Get OS X version */
	if ((fp = popen("/usr/bin/sw_vers -productVersion", "r"))) {
		fgets(release, sizeof(release), fp);
		pclose(fp);
	}

	/* Get hardware name */
	if (!*st->server_description &&
	    (fp = popen("/usr/sbin/sysctl -n hw.model", "r"))) {

		/* Read hardware name */
		fgets(buf, sizeof(buf), fp);
		pclose(fp);

		/* Clones are gone now so we'll hardcode the manufacturer */
		sstrlcpy(st->server_description, "Apple ");
		sstrlcat(st->server_description, buf);

		/* Remove hardware revision */
		for (c = st->server_description; *c; c++)
			if (*c >= '0' && *c <= '9') { *c = '\0'; break; }
	}
#endif

	/* Linux uname() just says Linux/2.6 - let's dig deeper... */
#ifdef __linux

	/* Most Linux ARM/MIPS boards have hardware name in /proc/cpuinfo */
#if defined(__arm__) || defined(__mips__)
	if (!*st->server_description && (fp = fopen("/proc/cpuinfo" , "r"))) {

		while (fgets(buf, sizeof(buf), fp)) {
#ifdef __arm__
			if ((c = strkey(buf, "Hardware"))) {
#else
			if ((c = strkey(buf, "machine"))) {
#endif
				sstrlcpy(st->server_description, c);
				chomp(st->server_description);
				break;
			}
		}
		fclose(fp);
	}
#endif

	/* Identify RedHat */
	if (!*sysname && (fp = fopen("/etc/redhat-release", "r"))) {
		fgets(sysname, sizeof(sysname), fp);
		fclose(fp);

		if ((c = strstr(sysname, "release "))) sstrlcpy(release, c + 8);
		if ((c = strchr(release, ' '))) *c = '\0';

		if ((c = strchr(sysname, ' '))) *c = '\0';
		if (strcmp(sysname, "Red") == MATCH) sstrlcpy(sysname, "RedHat");
	}

	/* Identify Slackware */
	if (!*sysname && (fp = fopen("/etc/slackware-version", "r"))) {
		fgets(sysname, sizeof(sysname), fp);
		fclose(fp);

		if ((c = strchr(sysname, ' '))) {
			sstrlcpy(release, c + 1);
			*c = '\0';
		}
	}

	/* Uh-oh.... how about a standard Linux with lsb_release? */
	if (stat("/usr/bin/lsb_release", &file) == OK && (file.st_mode & S_IXOTH)) {

		if (!*sysname && (fp = popen("/usr/bin/lsb_release -i -s", "r"))) {
			fgets(sysname, sizeof(sysname), fp);
			pclose(fp);
		}

		if (!*release && (fp = popen("/usr/bin/lsb_release -r -s", "r"))) {
			fgets(release, sizeof(release), fp);
			pclose(fp);
		}
	}

	/* OK, nothing worked - let's try /etc/issue for sysname */
	if (!*sysname && (fp = fopen("/etc/issue", "r"))) {
		fgets(sysname, sizeof(sysname), fp);
		fclose(fp);

		if ((c = strchr(sysname, ' '))) *c = '\0';
		if ((c = strchr(sysname, '\\'))) *c = '\0';
	}

	/* Debian version should be in /etc/debian_version */
	if (!*release && (fp = fopen("/etc/debian_version", "r"))) {
		fgets (release, sizeof(release), fp);
		fclose(fp);

		if ((c = strchr(release, '/'))) *c = '\0';
	}
#endif

	/* Haiku OS */
#ifdef __HAIKU__

	/* Fix release name */
	snprintf(release, sizeof(release), "R%s", name.release);
#endif

	/* Fill in the blanks using uname() data */
	if (!*sysname) sstrlcpy(sysname, name.sysname);
	if (!*release) sstrlcpy(release, name.release);
	if (!*machine) sstrlcpy(machine, name.machine);

	/* I always liked weird Perl-only functions */
	chomp(sysname);
	chomp(release);
	chomp(machine);

	/* We're only interested in major.minor version */
	if ((c = strchr(release, '.'))) if ((c = strchr(c + 1, '.'))) *c = '\0';
	if ((c = strchr(release, '-'))) *c = '\0';
	if ((c = strchr(release, '/'))) *c = '\0';

	/* Create a nicely formatted platform string */
	snprintf(st->server_platform, sizeof(st->server_platform), "%s/%s %s",
	         sysname,
#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
	         machine,
	         release);
#else
	         release,
	         machine);
#endif 

	/* Debug */
	if (st->debug) {
		syslog(LOG_INFO, "generated platform string \"%s\"",
			st->server_platform);
	}

#else
	/* Fallback reply */
	sstrlcpy(st->server_platform, "Unknown computer-like system");
#endif
}


/*
 * Return current CPU load
 */
float loadavg(void)
{
	FILE *fp;
	char buf[BUFSIZE];

	/* Faster Linux version */
#ifdef __linux
	buf[0] = '\0';
	if ((fp = fopen("/proc/loadavg" , "r")) == NULL) return 0;
	fgets(buf, sizeof(buf), fp);
	fclose(fp);

	return (float) atof(buf);

	/* Generic slow version - parse the output of uptime */
#else
#ifdef HAVE_POPEN
	char *c;

	if ((fp = popen("/usr/bin/uptime", "r"))) {
		fgets(buf, sizeof(buf), fp);
		pclose(fp);

		if ((c = strstr(buf, "average: ")) || (c = strstr(buf, "averages: ")))
			return (float) atof(c + 10);
	}
#endif

	/* Fallback reply */
	return 0;
#endif
}
bool Session::initialize()
{
  // Get URN's wich are supported by this addon
  if (!license_type_.empty())
    GetSupportedDecrypterURN(dashtree_.adp_pssh_);

  // Open mpd file
  const char* delim(strrchr(mpdFileURL_.c_str(), '/'));
  if (!delim)
  {
    xbmc->Log(ADDON::LOG_ERROR, "Invalid mpdURL: / expected (%s)", mpdFileURL_.c_str());
    return false;
  }
  dashtree_.base_url_ = std::string(mpdFileURL_.c_str(), (delim - mpdFileURL_.c_str()) + 1);

  if (!dashtree_.open(mpdFileURL_.c_str()) || dashtree_.empty())
  {
    xbmc->Log(ADDON::LOG_ERROR, "Could not open / parse mpdURL (%s)", mpdFileURL_.c_str());
    return false;
  }
  xbmc->Log(ADDON::LOG_INFO, "Successfully parsed .mpd file. Download speed: %0.4f Bytes/s", dashtree_.download_speed_);

  if (dashtree_.encryptionState_ == dash::DASHTree::ENCRYTIONSTATE_ENCRYPTED)
  {
    xbmc->Log(ADDON::LOG_ERROR, "Unable to handle decryption. Unsupported!");
    return false;
  }

  uint32_t min_bandwidth(0), max_bandwidth(0);
  {
    int buf;
    xbmc->GetSetting("MINBANDWIDTH", (char*)&buf); min_bandwidth = buf;
    xbmc->GetSetting("MAXBANDWIDTH", (char*)&buf); max_bandwidth = buf;
  }

  // create SESSION::STREAM objects. One for each AdaptationSet
  unsigned int i(0);
  const dash::DASHTree::AdaptationSet *adp;

  for (std::vector<STREAM*>::iterator b(streams_.begin()), e(streams_.end()); b != e; ++b)
    SAFE_DELETE(*b);
  streams_.clear();

  while ((adp = dashtree_.GetAdaptationSet(i++)))
  {
    streams_.push_back(new STREAM(dashtree_, adp->type_));
    STREAM &stream(*streams_.back());
    stream.stream_.prepare_stream(adp, width_, height_, min_bandwidth, max_bandwidth);

    const dash::DASHTree::Representation *rep(stream.stream_.getRepresentation());

    stream.info_.m_Width = rep->width_;
    stream.info_.m_Height = rep->height_;
    stream.info_.m_Aspect = rep->aspect_;
    stream.info_.m_pID = i;
    switch (adp->type_)
    {
    case dash::DASHTree::VIDEO:
      stream.info_.m_streamType = INPUTSTREAM_INFO::TYPE_VIDEO;
      break;
    case dash::DASHTree::AUDIO:
      stream.info_.m_streamType = INPUTSTREAM_INFO::TYPE_AUDIO;
      break;
    case dash::DASHTree::TEXT:
      stream.info_.m_streamType = INPUTSTREAM_INFO::TYPE_TELETEXT;
      break;
    default:
      break;
    }

    // we currently use only the first track!
    std::string::size_type pos = rep->codecs_.find(",");
    if (pos == std::string::npos)
      pos = rep->codecs_.size();

    strncpy(stream.info_.m_codecInternalName, rep->codecs_.c_str(), pos);
    stream.info_.m_codecInternalName[pos] = 0;

    if (rep->codecs_.find("mp4a") == 0)
      strcpy(stream.info_.m_codecName, "aac");
    else if (rep->codecs_.find("ec-3") == 0 || rep->codecs_.find("ac-3") == 0)
      strcpy(stream.info_.m_codecName, "eac3");
    else if (rep->codecs_.find("avc") == 0)
      strcpy(stream.info_.m_codecName, "h264");
    else if (rep->codecs_.find("hevc") == 0)
      strcpy(stream.info_.m_codecName, "hevc");

    stream.info_.m_FpsRate = rep->fpsRate_;
    stream.info_.m_FpsScale = rep->fpsScale_;
    stream.info_.m_SampleRate = rep->samplingRate_;
    stream.info_.m_Channels = rep->channelCount_;
    stream.info_.m_Bandwidth = rep->bandwidth_;
    strcpy(stream.info_.m_language, adp->language_.c_str());
  }
  
  // Try to initialize an SingleSampleDecryptor
  if (dashtree_.encryptionState_)
  {
    AP4_DataBuffer init_data;

    if (dashtree_.adp_pssh_.second == "FILE")
    {
      std::string strkey(dashtree_.adp_pssh_.first.substr(9));
      while (size_t pos = strkey.find('-') != std::string::npos)
        strkey.erase(pos, 1);
      if (strkey.size() != 32)
      {
        xbmc->Log(ADDON::LOG_ERROR, "Key system mismatch (%s)!", dashtree_.adp_pssh_.first.c_str());
        return false;
      }

      unsigned char key_system[16];
      AP4_ParseHex(strkey.c_str(), key_system, 16);

      Session::STREAM *stream(streams_[0]);

      stream->enabled = true;
      stream->stream_.start_stream(0);
      stream->stream_.select_stream(true);

      stream->input_ = new AP4_DASHStream(&stream->stream_);
      stream->input_file_ = new AP4_File(*stream->input_, AP4_DefaultAtomFactory::Instance, true);
      AP4_Movie* movie = stream->input_file_->GetMovie();
      if (movie == NULL)
      {
        xbmc->Log(ADDON::LOG_ERROR, "No MOOV in stream!");
        stream->disable();
        return false;
      }
      AP4_Array<AP4_PsshAtom*>& pssh = movie->GetPsshAtoms();

      for (unsigned int i = 0; !init_data.GetDataSize() && i < pssh.ItemCount(); i++)
      {
        if (memcmp(pssh[i]->GetSystemId(), key_system, 16) == 0)
          init_data.AppendData(pssh[i]->GetData().GetData(), pssh[i]->GetData().GetDataSize());
      }

      if (!init_data.GetDataSize())
      {
        xbmc->Log(ADDON::LOG_ERROR, "Could not extract license from video stream (PSSH not found)");
        stream->disable();
        return false;
      }
      stream->disable();
    }
    else
    {
      init_data.SetBufferSize(1024);
      unsigned int init_data_size(1024);
      b64_decode(dashtree_.pssh_.second.data(), dashtree_.pssh_.second.size(), init_data.UseData(), init_data_size);
      init_data.SetDataSize(init_data_size);
    }
    return (single_sample_decryptor_ = CreateSingleSampleDecrypter(init_data))!=0;
  }
  return true;
}
Beispiel #7
0
int
buraco_interpret_game(struct ROOM *room, char *buf, int *who, int *newcard, int *garbage)
{
	struct USER_idx *uidx;
	struct ROOM_idx *ridx;
	char *gameargs[4];
	int i, x, card;
	char ret[SZ_STRING_MAX];


	ridx = NULL;
	ridx = buraco_mem_get_room(room->roomid);
	if (!ridx)
		return -1;

	uidx = NULL;
	uidx = buraco_mem_get_user(ridx->users[*who]);

	if (!uidx)
		return -1;

	gameargs[0] = (char *)strkey(buf, 0, ' '); gameargs[1] = (char *)strkey(buf, 1, ' ');
	gameargs[2] = (char *)strkey(buf, 2, ' '); gameargs[3] = (char *)strkey(buf, 3, ' ');

	if (gameargs[0])
	{
		if (!strncmp("USERCARD", gameargs[0], strlen(gameargs[0])))
		{
			buraco_show_cards_to_user(uidx->userid, room);
		}
		else if (*newcard==0 && !strncmp("GETNCARD", gameargs[0], strlen(gameargs[0])))
		{
			if (gameargs[1])
			{
				i = atoi(gameargs[1]);
				if (i) // TABLE CARD
				{
					card = buraco_get_table_card(room, uidx->userid);
					snprintf(ret, sizeof(ret)-1, "*GAME* you got a new card *%s*\n\0", BARALHO[card]);
				} 
				else // LIXO
				{
					buraco_get_garbage_card(room, uidx->userid);
					snprintf(ret, sizeof(ret)-1, "*GAME* you got new cards\n\0");
					//++*garbage;
				}

				send(uidx->userid, ret, strlen(ret), 0);
				++*newcard;
			} 
			else 
			{
				snprintf(ret, sizeof(ret)-1, "*ERROR* command *GETNCARD* had too few arguments. (eg.: GETNCARD 1)\n\0");
				send(uidx->userid, ret, strlen(ret), 0);
			}
		}
		else if (!strncmp("MOVEHAND", gameargs[0], strlen(gameargs[0])))
		{
			if (gameargs[2])
			{
				x = atoi(gameargs[2]);
			
				if (ridx->users[0]==uidx->userid || ridx->users[2]==uidx->userid)
					i=0;
				else if (ridx->users[1]==uidx->userid || ridx->users[3]==uidx->userid)
					i=1;

				buraco_move_cards_to_group(room, uidx->userid, gameargs[1], i, x);
			}
			else
			{
				snprintf(ret, sizeof(ret)-1, "*ERROR* MOVEHAND: too few arguments. (eg.: MOVEHAND 8h,Tc,KD 1)\n\0");
				send(uidx->userid, ret, strlen(ret), 0);
			}
		}
		else if (*newcard!=0 && !strncmp("LEFTCARD", gameargs[0], strlen(gameargs[0])))
		{
			if (gameargs[1])
			{
				if (buraco_discard_to_garbage(room, uidx->userid, gameargs[1]) != -1)
				{
					snprintf(ret, sizeof(ret)-1, "*GAME ROOM* user *%s* move card(s) *%s* to garbage.\n\n", uidx->nick, gameargs[1]);
					buraco_message_to_room(uidx->roomid, ret);

					++*who;

					if (ridx->players==2 && *who==2)
						*who = 0;
					else if	(ridx->players==4 && *who==4)
						*who = 0;

					*newcard = 0; *garbage = 0;
				}
				else
				{
					snprintf(ret, sizeof(ret)-1, "*ERROR* you dont have this card *%s*\n", gameargs[1]);
					send(uidx->roomid, ret, strlen(ret), 0);
				}
			}
		}
		else
		{
			buraco_interpret(uidx->userid, buf);
		}
		fprintf(stdout, "*GAME ROOM* id *%d* user *%s* inGame:%d sends command *%s*\n\0", room->roomid, uidx->nick, uidx->inGame, buf);
	}
	else
		fprintf(stdout, "*GAME ROOM* id *%d* COMMAND ERROR..\n\0", room->roomid);

	return 0;
}
Beispiel #8
0
int
buraco_move_cards_to_group(struct ROOM *table, int userid, char *rcards, int group, int game_cards)
{
	struct CARDS *cardsidx, *t;
	struct USER_idx *uidx;
	int aces, joker;
	int i, x, j, card, exists, verify;
	char *cards[SZ_NAIPE];
	char gcards[SZ_STRING_MID], ret[SZ_STRING_MAX];

	fprintf(stdout, "buraco_move_cards_to_group() init group:%d\n");
	if (!rcards)
		return -1;

	exists = 0; card = 0; i = 0; x = 0;

	cards[0] = (char *)strkey(rcards, 0, ','); cards[1] = (char *)strkey(rcards, 1, ','); 
	cards[2] = (char *)strkey(rcards, 2, ','); cards[3] = (char *)strkey(rcards, 3, ','); 
	cards[4] = (char *)strkey(rcards, 4, ','); cards[5] = (char *)strkey(rcards, 5, ','); 
	cards[6] = (char *)strkey(rcards, 6, ','); cards[7] = (char *)strkey(rcards, 7, ','); 
	cards[8] = (char *)strkey(rcards, 8, ','); cards[9] = (char *)strkey(rcards, 9, ','); 
	cards[10] = (char *)strkey(rcards, 10, ','); cards[11] = (char *)strkey(rcards, 11, ',');
	cards[12] = (char *)strkey(rcards, 12, ','); cards[13] = (char *)strkey(rcards, 13, ',');
	cards[14] = (char *)strkey(rcards, 14, ','); cards[15] = (char *)strkey(rcards, 15, ',');

	// Algo
	//
	// Process cards
	//   Count one per one
	//     Verify if they had the same suit
	//   Update Points
	//   Move cards
	//
	// REMOVE CARD FROM USER

	verify = 0; verify = tolower(cards[0][1]);
	cardsidx = NULL;
	cardsidx = buraco_mem_get_gcards(table->roomid, group, game_cards);

	if (cardsidx==NULL)
	{
		buraco_mem_add_gcards(table->roomid, group, game_cards); usleep(9);

		if (!cards[2])
		{
			snprintf(ret, sizeof(ret)-1, "*ERROR* You need to move at least three cards of your hand.\n\0");
			send(userid, ret, strlen(ret), 0);

			return -1;
		}

		cardsidx = NULL;
		cardsidx = buraco_mem_get_gcards(table->roomid, group, game_cards);
		if (cardsidx)
			cardsidx->suit = verify;
	}
	else
	{
		if (cardsidx->id == game_cards) 
			exists++;
	}

        t = cfst;
        while (t)
        {
                fprintf(stdout, "\033[1mcards--debug: roomid:%d->%d group:%d->%d id:%d->%d suit:%.3d:%c\n\033[m", t->roomid, table->roomid, t->group, group, t->id, game_cards, t->suit, t->suit);
                t = t->next;
        }


	i = 0; aces = 0; joker = 0;
	while (cards[i] != NULL && cards[i][0]!=0)
	{
		verify = 0;
		verify = tolower((int)cards[i][1]);

		if (cards[i][0] == 'A')
			aces++;
		if (cards[i][0] == '2' || cards[i][0] == 'c' || cards[i][0] == 'C')
		{
			fprintf(stdout, "2 ou coringa na area\n");
			joker++;
		}

		if (cardsidx->suit != verify)
		{
			if (!joker)
			{
				buraco_mem_del_gcards(table->roomid, group, game_cards);
				snprintf(ret, sizeof(ret)-1, "*ERROR* These cards doesn't have the same suit.\n\0");
				send(userid, ret, strlen(ret), 0);
				return -1;
			}
		}

		if (buraco_verify_user_card(table, userid, cards[i]) != 0)
		{
			buraco_mem_del_gcards(table->roomid, group, game_cards);
			snprintf(ret, sizeof(ret)-1, "*ERROR* You don't have this card *%s*.\n\0", cards[i]);
			send(userid, ret, strlen(ret), 0);
			return -1;
		}

		i++;
	}

	if (joker>=3 || aces>=2)
	{
		buraco_mem_del_gcards(table->roomid, group, game_cards);
		snprintf(ret, sizeof(ret)-1, "*ERROR* Too many 'joker' cards in game.\n\0");
		send(userid, ret, strlen(ret), 0);
		return -1;
	}
	fprintf(stdout, "buraco_move_cards_to_group() ...1\n");

	i = 0;
	while (cards[i]!=NULL && cards[i][0]!=0)
	{
		x = -1;

		if (cards[i][0] == 'A')
		{
			if (cardsidx->cards[13] == -1 && cardsidx->cards[12] != -1)
				x=13;
			else if (cardsidx->cards[0] == -1)
				x=0;
		}
		else if ((cards[i][0] == '2' || cards[i][0] == 'c' || cards[i][0] == 'C') && joker!=0)
			x=14;

		if (x==-1)
			x = buraco_return_pos_gcard(cards[i][0]);
		
	fprintf(stdout, "buraco_move_cards_to_group() ...111111\n");
		if (!cards[1])
		{			
			fprintf(stdout, "APENAS UMAAAAAAAAAAAAAAA x-1:%d x+1:%d\n", cardsidx->cards[x-1], cardsidx->cards[x+1]);

			if (x==0 && cardsidx->cards[1] != -1)
				return -1;	
			else if (cardsidx->cards[x-1] == -1 && cardsidx->cards[x+1] == -1 && x!=14)
				return -1;
			else if (x==13 && cardsidx->cards[x-1] != -1)
				return -1;

	fprintf(stdout, "buraco_move_cards_to_group() ...1222222  x:%d cardsidx->cards[x]:%d\n", x, cardsidx->cards[x]);
			if (cardsidx->cards[x]!=-1 && (cardsidx->cards[x]=='2' || cardsidx->cards[x]=='c' || cardsidx->cards[x]=='C'))
			{
				fprintf(stdout, "cardsidx->cards[%d] = %d", x , cardsidx->cards[x]);	
				if (cardsidx->cards[13]==-1)
					for (j=x; cardsidx->cards[j]!=-1; j++);
				else
					for (j=x; cardsidx->cards[j]!=-1; j--);
				
				fprintf(stdout, "cardsidx->cards[%d] = %d", j, cardsidx->cards[x]);	
				cardsidx->cards[j] = cardsidx->cards[x];
			}
			else if (cardsidx->cards[x]!=-1)
			{
				fprintf(stdout, "cardsidx->cards[%d] = %d", x , cardsidx->cards[x]);	
				if (cardsidx->cards[13]==-1)
					for (j=x; cardsidx->cards[j]!=-1; j++);
				else
					for (j=x; cardsidx->cards[j]!=-1; j--);
				
				fprintf(stdout, "cardsidx->cards[%d] = %d", j, cardsidx->cards[x]);	
				cardsidx->cards[j] = cardsidx->cards[x];
			}
	fprintf(stdout, "buraco_move_cards_to_group() ...133333\n");
		}
		
		card = buraco_get_card_value(table, cards[i]);
		cardsidx->cards[x] = table->in_game.baralho[card];
		i++;
	}

	fprintf(stdout, "buraco_move_cards_to_group() ...2\n");
	x=0; verify = 0; j=0;
	for (i=0;i<SZ_NAIPE;i++)
	{
		if (x>2)
			verify++;

		if (!x)
		{
			if (cardsidx->cards[i] != -1)
				x++;
		}
		else
		{
			if (cardsidx->cards[i] != -1)
				x++;
			else if (cardsidx->cards[i] == -1 && joker>0)
			{ x++; j=i; joker--; }
			else 
				x=0;
		}
	}

	fprintf(stdout, "buraco_move_cards_to_group() ...3 ... verify:%d j:%d\n", verify, j);
	if (!verify) 
	{	
		buraco_mem_del_gcards(table->roomid, group, game_cards);

        t = cfst;
        while (t)
        {
                fprintf(stdout, "\033[1mcards--debug: roomid:%d->%d group:%d->%d id:%d->%d suit:%.3d:%c\n\033[m", t->roomid, table->roomid, t->group, group, t->id, game_cards, t->suit, t->suit);
                t = t->next;
        }
		snprintf(ret, sizeof(ret)-1, "*ERROR* Not a sequential cards..\n\0");
		send(userid, ret, strlen(ret), 0);
		return -1;
	}

	fprintf(stdout, "buraco_move_cards_to_group() ...4\n");
	if (j>=0 && j<=SZ_NAIPE)
	{
		if (cardsidx->cards[1]==-1 && cardsidx->cards[2]!=-1 && strncmp((char*)&cardsidx->cards[14], "2", 1)==0)
			cardsidx->cards[1] = cardsidx->cards[14];
		else
			cardsidx->cards[j] = cardsidx->cards[14];

		cardsidx->cards[14] = -1;
	}

	fprintf(stdout, "buraco_move_cards_to_group() ...5\n");
	i=0;
	while (cards[i])
	{
		buraco_remove_card_from_user(table, userid, cards[i]);
		i++;
	}

	for (i=0;i<(int)strlen(gcards);i++)
		gcards[i] = '\0';

	fprintf(stdout, "buraco_move_cards_to_group() ...6 strlen(gcards):%d\n", strlen(gcards));
	//FIXME
	//buraco_count_points_of_cards(table, rcards);
	//
	uidx = buraco_mem_get_user(userid);
	if (uidx)
	{
		for (i=0; i<SZ_NAIPE; i++)
		{
			card = 0;
			if (cardsidx->cards[i] != -1)
			{
				card = cardsidx->cards[i];
				if (!strlen(gcards))
					strcpy(gcards, BARALHO[card]);
				else
				{
					snprintf(ret, sizeof(ret)-1, ",%s\0", BARALHO[card]);
					strcat(gcards, ret);
				}
			}
		}
		
		if (exists)
			snprintf(ret, sizeof(ret)-1, "*GAME ROOM* user *%s* added cards *%s* to group *%d*\n\0", uidx->nick, gcards, cardsidx->id);
		else
			snprintf(ret, sizeof(ret)-1, "*GAME ROOM* user *%s* make a new group of cards *%s*\n\0", uidx->nick, gcards);

		buraco_message_to_room(table->roomid, ret);
	}
		/*
		x = 0;
		for (i=0; i<SZ_NAIPE; i++)
		{
			card = 0;
			if (cardsidx->cards[i] != -1)
			{
				card = cardsidx->cards[i];
				gcards[x] = BARALHO[card];
				x++;
			}
		}
		snprintf(ret, sizeof(ret)-1, "*GAME ROOM* user *%s* make a new group of cards *%s\0", uidx->nick);
		buraco_message_to_room(table->roomid, ret);
		*/
	fprintf(stdout, "buraco_move_cards_to_group() END\n");

	return 0;
}