Пример #1
0
int SV_AddTestClient() {
	char buffer[1024];
	int botport = 1;
	int protocolVersion = ((int(*)())&ParseAddr(0x28FE40))(); //GetProtocolVersion
	int checksum = ((int(*)())&ParseAddr(0x2093C))(); //BG_NetDataChecksum
	int PersistentDataDefVersion = ((int(*)())&ParseAddr(0x1EA710))(); //LiveStorage_GetPersistentDataDefVersion
	unsigned int PersistentDataDefVersionChecksum = ((int(*)())&ParseAddr(0x1EA740))(); //LiveStorage_GetPersistentDataDefFormatChecksum

	//0x236084 - client->dropReason, causing issue, source: unknown. (SV_SendMessageToClient)
	uint32_t patchData[] = { 0x38800005 };
	write_process(0x22E55C, &patchData, 4);
	Sprintf(buffer, "connect bot%d \"\\cg_predictItems\\1\\cl_anonymous\\0\\color\\4\\head\\default\\model\\multi\\snaps\\20\\rate\\5000\\name\\bot%d\\protocol\\%d\\checksum\\%d\\statver\\%d %u\\qport\\%d\"", botport, botport, protocolVersion, checksum, PersistentDataDefVersion, PersistentDataDefVersionChecksum, botport);
	Memset((void*)ThreadStorage_a, 0, sizeof(netadr_s));
	netadr_s* newConnection = (netadr_s*)(ThreadStorage_a);
	newConnection->port = botport;

	((void(*)(const char*))&ParseAddr(0x1DBA20))(buffer); //SV_CmdTokenizeString(const char* string)
	((void(*)(netadr_s*))&ParseAddr(0x226074))(newConnection); //SV_DirectConnect(netadr_s* connectionInfo)
	((void(*)())&ParseAddr(0x1DB524))(); //SV_CmdEndTokenizeString()

	*(short*)(getClient_t(botport) + 0x352EA) = 0x3FF; //Set Stat Flags
	*(short*)(getClient_t(botport) + 0x30) = botport; //botPort

	((void(*)(int client))&ParseAddr(0x2284F8))(getClient_t(botport)); //SV_SendClientGameState(client_t* client)
	((void(*)(int client, int usercmd))&ParseAddr(0x2272DC))(getClient_t(botport), ThreadStorage_a); //SV_ClientEnterWorld(client_t* client, usercmd_s* lastUserCmd)
}
Пример #2
0
uint64_t GetServerID(const char* spec) {
    uint64_t server_id=0;

    char tmp[1024];
    char *args[32];
    strncpy(tmp, spec, 1024);
    tmp[1023] = '\0';

    if (ParseAddr(tmp, args, 32) != 3) {
        return server_id;
    }

    if (strcasecmp(args[0], "tcp") == 0) {
        char *host = args[1];
        int port = atoi(args[2]);
        char c;
        const char *p = host;
        bool isIPAddr = true;
        // 是ip地址格式吗?
        while ((c = (*p++)) != '\0') {
            if ((c != '.') && (!((c >= '0') && (c <= '9')))) {
                isIPAddr = false;
                break;
            }
        }

        if (isIPAddr) {
            server_id = port;
            server_id <<= 32;
            server_id |= inet_addr(host);
        }
    }

    return server_id;
}
Пример #3
0
Файл: ip.c Проект: vstakhov/mpd
int
ParseRange(const char *s, struct u_range *range, u_char allow)
{
	int n_bits;
	char *widp, buf[64];

	strlcpy(buf, s, sizeof(buf));
	if ((widp = strchr(buf, '/')) != NULL)
		*widp++ = '\0';
	else
		widp = buf + strlen(buf);

/* Get IP address part; if that fails, try looking up hostname */

	if (!ParseAddr(buf, &range->addr, allow))
		return (FALSE);

/* Get mask width */

	if (*widp) {
		if ((n_bits = atoi(widp)) < 0 || (range->addr.family == AF_INET && n_bits > 32) || (range->addr.family == AF_INET6 && n_bits > 128)) {
			return (FALSE);
		}
	} else if (range->addr.family == AF_INET) {
		n_bits = 32;
	} else {
		n_bits = 128;
	}
	range->width = n_bits;

	return (TRUE);
}
Пример #4
0
int
WebInit(Web w)
{
  /* setup web-defaults */
  memset(w, 0, sizeof(*w));

  Enable(&w->options, WEB_AUTH);  
  
  ParseAddr(DEFAULT_WEB_IP, &w->addr, ALLOW_IPV4|ALLOW_IPV6);
  w->port = DEFAULT_WEB_PORT;

  return 0;
}
Пример #5
0
static int
WebSetCommand(Context ctx, int ac, char *av[], void *arg) 
{
  Web	 		w = &gWeb;
  int			port;

  switch ((intptr_t)arg) {

    case SET_OPEN:
      WebOpen(w);
      break;

    case SET_CLOSE:
      WebClose(w);
      break;

    case SET_ENABLE:
	EnableCommand(ac, av, &w->options, gConfList);
      break;

    case SET_DISABLE:
	DisableCommand(ac, av, &w->options, gConfList);
      break;

    case SET_SELF:
      if (ac < 1 || ac > 2)
	return(-1);

      if (!ParseAddr(av[0],&w->addr, ALLOW_IPV4)) 
	Error("Bogus IP address given %s", av[0]);

      if (ac == 2) {
        port =  strtol(av[1], NULL, 10);
        if (port < 1 || port > 65535)
	    Error("Bogus port given %s", av[1]);
        w->port=port;
      }
      break;

    default:
      return(-1);

  }

  return 0;
}
Пример #6
0
struct sockaddr_storage *
ParseAddrPort(int ac, char *av[], u_char allow)
{
  static struct sockaddr_storage ss;
  struct u_addr addr;
  int		port = 0;

  if (ac < 1 || ac > 2)
    return (NULL);

  if (!ParseAddr(av[0], &addr, allow))
    return(NULL);

  if (ac > 1) {
    if ((port = atoi(av[1])) < 1 || port > 65535) {
      Log(LG_ERR, ("Bad port \"%s\"", av[1]));
      return (NULL);
    }
  }

  memset(&ss, 0, sizeof(ss));
  ss.ss_family = addr.family;
  switch (addr.family) {
    case AF_INET:
	ss.ss_len = sizeof(struct sockaddr_in);
	((struct sockaddr_in*)&ss)->sin_addr = addr.u.ip4;
	((struct sockaddr_in*)&ss)->sin_port = htons(port);
	break;
    case AF_INET6:
	ss.ss_len = sizeof(struct sockaddr_in6);
	((struct sockaddr_in6*)&ss)->sin6_addr = addr.u.ip6;
	((struct sockaddr_in6*)&ss)->sin6_port = htons(port);
	break;
    default:
	ss.ss_len = sizeof(struct sockaddr_storage);
  }

  return (&ss);
}
Пример #7
0
/* connect a client socket to a server and return a socket descriptor */
int ConnectToServer(char *addr, int defport)
{
    int sfd;
    struct sockaddr_in servaddr;
    struct hostent *host;
    char hostname[256];
    int port;
    int err;
    
    ParseAddr(hostname, &port, defport, addr);
    
    if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        return -1;
    
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(port);
    host = gethostbyname(hostname);
    if (host == NULL) {
        err = errno;
        close(sfd);
        errno = err;
        return -2;
    }
    
    servaddr.sin_addr.s_addr =  *((int *) host->h_addr_list[0]);
    
    if (connect(sfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) {
        err = errno;
        close(sfd);
        errno =err;
        return -3;
    }
    
    return sfd;
}
Пример #8
0
/*
**  ParseConfig -- parse the config file into linked list of clients.
**
**	Parameters:
**		None.
**
**	Returns:
**		1 on success, 0 otherwise.
**
**	Side Effects:
**		- Linked list of clients will be (re)allocated.
**
**	Warnings:
**		- GetBootFiles() must be called before this routine
**		  to create a linked list of default boot files.
*/
int
ParseConfig(void)
{
	FILE *fp;
	CLIENT *client;
	u_int8_t *addr;
	char line[C_LINELEN];
	char *cp, *bcp;
	int i, j;
	int omask, linecnt = 0;

	if (BootAny)				/* ignore config file */
		return(1);

	FreeClients();				/* delete old list of clients */

	if ((fp = fopen(ConfigFile, "r")) == NULL) {
		syslog(LOG_ERR, "ParseConfig: can't open config file (%s)",
		       ConfigFile);
		return(0);
	}

	/*
	 *  We've got to block SIGHUP to prevent reconfiguration while
	 *  dealing with the linked list of Clients.  This can be done
	 *  when actually linking the new client into the list, but
	 *  this could have unexpected results if the server was HUP'd
	 *  whilst reconfiguring.  Hence, it is done here.
	 */
	omask = sigblock(sigmask(SIGHUP));

	/*
	 *  GETSTR positions `bcp' at the start of the current token,
	 *  and null terminates it.  `cp' is positioned at the start
	 *  of the next token.  spaces & commas are separators.
	 */
#define GETSTR	while (isspace(*cp) || *cp == ',') cp++;	\
		bcp = cp;					\
		while (*cp && *cp!=',' && !isspace(*cp)) cp++;	\
		if (*cp) *cp++ = '\0'

	/*
	 *  For each line, parse it into a new CLIENT struct.
	 */
	while (fgets(line, C_LINELEN, fp) != NULL) {
		linecnt++;				/* line counter */

		if (*line == '\0' || *line == '#')	/* ignore comment */
			continue;

		if ((cp = strchr(line,'#')) != NULL)	/* trash comments */
			*cp = '\0';

		cp = line;				/* init `cp' */
		GETSTR;					/* get RMP addr */
		if (bcp == cp)				/* all delimiters */
			continue;

		/*
		 *  Get an RMP address from a string.  Abort on failure.
		 */
		if ((addr = ParseAddr(bcp)) == NULL) {
			syslog(LOG_ERR,
			       "ParseConfig: line %d: can't parse <%s>",
			       linecnt, bcp);
			continue;
		}

		if ((client = NewClient(addr)) == NULL)	/* alloc new client */
			continue;

		GETSTR;					/* get first file */

		/*
		 *  If no boot files are spec'd, use the default list.
		 *  Otherwise, validate each file (`bcp') against the
		 *  list of boot-able files.
		 */
		i = 0;
		if (bcp == cp)				/* no files spec'd */
			for (; i < C_MAXFILE && BootFiles[i] != NULL; i++)
				client->files[i] = BootFiles[i];
		else {
			do {
				/*
				 *  For each boot file spec'd, make sure it's
				 *  in our list.  If so, include a pointer to
				 *  it in the CLIENT's list of boot files.
				 */
				for (j = 0; ; j++) {
					if (j==C_MAXFILE||BootFiles[j]==NULL) {
						syslog(LOG_ERR, "ParseConfig: line %d: no boot file (%s)",
						       linecnt, bcp);
						break;
					}
					if (STREQN(BootFiles[j], bcp)) {
						if (i < C_MAXFILE)
							client->files[i++] =
							    BootFiles[j];
						else
							syslog(LOG_ERR, "ParseConfig: line %d: too many boot files (%s)",
							       linecnt, bcp);
						break;
					}
				}
				GETSTR;			/* get next file */
			} while (bcp != cp);

			/*
			 *  Restricted list of boot files were spec'd,
			 *  however, none of them were found.  Since we
			 *  apparently can't let them boot "just anything",
			 *  the entire record is invalidated.
			 */
			if (i == 0) {
				FreeClient(client);
				continue;
			}
		}

		/*
		 *  Link this client into the linked list of clients.
		 *  SIGHUP has already been blocked.
		 */
		if (Clients)
			client->next = Clients;
		Clients = client;
	}

	(void) fclose(fp);				/* close config file */

	(void) sigsetmask(omask);			/* reset signal mask */

	return(1);					/* return success */
}
Пример #9
0
Файл: utils.c Проект: maz/Ruloir
int SocketFromIP(const char *ip,int port,size_t *size,void* addr){
	int af;
	ParseAddr(ip,port,&af,size,addr);
	return socket(af,SOCK_STREAM,0);
}
Пример #10
0
static int
NatSetCommand(Context ctx, int ac, char *av[], void *arg)
{
  NatState	const nat = &ctx->bund->iface.nat;

  if (ac == 0)
    return(-1);
  switch ((intptr_t)arg) {
    case SET_TARGET:
#ifndef NG_NAT_LOG
	Error("Target address setting is unsupported by current kernel");
#endif
    /* FALL */
    case SET_ADDR:
      {
	struct u_addr	addr;

	/* Parse */
	if (ac != 1)
	  return(-1);
	if (!ParseAddr(av[0], &addr, ALLOW_IPV4))
	  Error("bad IP address \"%s\"", av[0]);

	/* OK */
	if ((intptr_t)arg == SET_ADDR) {
	    nat->alias_addr = addr;
	} else {
	    nat->target_addr = addr;
	}
      }
      break;

#ifdef NG_NAT_DESC_LENGTH
    case SET_REDIRECT_PORT:
      {
	struct protoent	*proto;
	struct in_addr	l_addr, a_addr, r_addr;
	int lp, ap, rp = 0, k;

	/* Parse */
	if (ac != 5 && ac != 7)
	  return(-1);
	if ((proto = getprotobyname(av[0])) == 0)
	  Error("bad PROTO name \"%s\"", av[0]);
	if (!inet_aton (av[1], &a_addr))
	  Error("bad alias IP address \"%s\"", av[1]);
	ap = atoi(av[2]);
	if (ap <= 0 || ap > 65535)
	  Error("Incorrect alias port number \"%s\"", av[2]);
	if (!inet_aton (av[3], &l_addr))
	  Error("bad local IP address \"%s\"", av[3]);
	lp = atoi(av[4]);
	if (lp <= 0 || lp > 65535)
	  Error("Incorrect local port number \"%s\"", av[4]);
	if (ac == 7) {
	  if (!inet_aton (av[5], &r_addr))
	    Error("bad remote IP address \"%s\"", av[5]);
	  rp = atoi(av[6]);
	  if (rp <= 0 || rp > 65535)
	    Error("Incorrect remote port number \"%s\"", av[6]);
	}
	/* OK */
	for (k=0;k<NM_PORT;k++) {
	  if (nat->nrpt_id[k] == 0) {
	    memcpy(&nat->nrpt[k].local_addr, &l_addr, sizeof(struct in_addr));
	    memcpy(&nat->nrpt[k].alias_addr, &a_addr, sizeof(struct in_addr));
	    nat->nrpt[k].local_port = lp;
	    nat->nrpt[k].alias_port = ap;
	    if (ac == 7) {
	      memcpy(&nat->nrpt[k].remote_addr, &r_addr, sizeof(struct in_addr));
	      nat->nrpt[k].remote_port = rp;
	    }
	    nat->nrpt[k].proto = (uint8_t)proto->p_proto;
	    snprintf(nat->nrpt[k].description, NG_NAT_DESC_LENGTH, "nat-port-%d", k);
	    nat->nrpt_id[k] = 1;
	    break;
	  }
	}
	if (k == NM_PORT)
	  Error("max number of redirect-port \"%d\" reached", NM_PORT);
      }
      break;

    case SET_REDIRECT_ADDR:
      {
	struct in_addr	l_addr, a_addr;
	int k;

	/* Parse */
	if (ac != 2)
	  return(-1);
	if (!inet_aton (av[0], &a_addr))
	  Error("bad alias IP address \"%s\"", av[0]);
	if (!inet_aton (av[1], &l_addr))
	  Error("bad local IP address \"%s\"", av[1]);

	/* OK */
	for (k=0;k<NM_ADDR;k++) {
	  if (nat->nrad_id[k] == 0) {
	    memcpy(&nat->nrad[k].local_addr, &l_addr, sizeof(struct in_addr));
	    memcpy(&nat->nrad[k].alias_addr, &a_addr, sizeof(struct in_addr));
	    snprintf(nat->nrad[k].description, NG_NAT_DESC_LENGTH, "nat-addr-%d", k);
	    nat->nrad_id[k] = 1;
	    break;
	  }
	}
	if (k == NM_ADDR)
	  Error("max number of redirect-addr \"%d\" reached", NM_ADDR);
      }
      break;

    case SET_REDIRECT_PROTO:
      {
	struct protoent	*proto;
	struct in_addr	l_addr, a_addr, r_addr;
	int k;

	/* Parse */
	if (ac != 3 && ac != 4)
	  return(-1);
	if ((proto = getprotobyname(av[0])) == 0)
	  Error("bad PROTO name \"%s\"", av[0]);
	if (!inet_aton (av[1], &a_addr))
	  Error("bad alias IP address \"%s\"", av[1]);
	if (!inet_aton (av[2], &l_addr))
	  Error("bad local IP address \"%s\"", av[2]);
	if (ac == 4) {
	  if (!inet_aton (av[3], &r_addr))
	    Error("bad remote IP address \"%s\"", av[3]);
	}

	/* OK */
	for (k=0;k<NM_PROTO;k++) {
	  if (nat->nrpr_id[k] == 0) {
	    memcpy(&nat->nrpr[k].local_addr, &l_addr, sizeof(struct in_addr));
	    memcpy(&nat->nrpr[k].alias_addr, &a_addr, sizeof(struct in_addr));
	    if (ac == 4)
	      memcpy(&nat->nrpr[k].remote_addr, &r_addr, sizeof(struct in_addr));
	    nat->nrpr[k].proto = (uint8_t)proto->p_proto;
	    snprintf(nat->nrpr[k].description, NG_NAT_DESC_LENGTH, "nat-proto-%d", k);
	    nat->nrpr_id[k] = 1;
	    break;
	  }
	}
	if (k == NM_PROTO)
	  Error("max number of redirect-proto \"%d\" reached", NM_PROTO);
      }
      break;
#endif

    case SET_ENABLE:
      EnableCommand(ac, av, &nat->options, gConfList);
      break;

    case SET_DISABLE:
      DisableCommand(ac, av, &nat->options, gConfList);
      break;

    default:
      assert(0);
  }
  return(0);
}