Example #1
0
static int
tds_addrinfo_to_hostent(struct addrinfo *ai, struct hostent *result, char *buffer, int buflen)
{
#define CHECK_BUF(len) \
	if (p + sizeof(struct hostent) - buffer > buflen) return -1;
#define ALIGN_P do { p += TDS_ALIGN_SIZE - 1; p -= (p-buffer) % TDS_ALIGN_SIZE; } while(0)

	int n;
	char *p = buffer;
	int len;
	char **addresses;
	struct addrinfo *curr_ai;

	memset(result, 0, sizeof(struct hostent));
	result->h_addrtype = sizeof(struct sockaddr_in);

	/* count addresses */
	for (n = 0, curr_ai = ai; curr_ai; curr_ai = curr_ai->ai_next) {
		if (curr_ai->ai_family != PF_INET)
			continue;
		++n;
	}

	/* copy addresses */
	addresses = (char **) p;
	result->h_addr_list = addresses;
	result->h_length = sizeof(struct in_addr);
	len = sizeof(char *) * (n + 1);
	CHECK_BUF(len);
	p += len;
	ALIGN_P;
	for (n = 0, curr_ai = ai; curr_ai; curr_ai = curr_ai->ai_next) {
		if (curr_ai->ai_family != PF_INET)
			continue;
		addresses[n++] = p;

		len = sizeof(struct in_addr);
		CHECK_BUF(len);
		memcpy(p, &((struct sockaddr_in *) curr_ai->ai_addr)->sin_addr, len);
		p += len;
		ALIGN_P;
	}
	addresses[n] = NULL;

	/* copy name */
	if (ai->ai_canonname) {
		n = strlen(ai->ai_canonname) + 1;
		result->h_name = p;
		CHECK_BUF(n);
		memcpy(p, ai->ai_canonname, n);
		p += n;
		ALIGN_P;
	}
	return 0;
}
Example #2
0
int DestroyClassroomTask::work(void) {
        while (true) {
                DES_MAP::iterator it = desMap_.begin();
                DES_MAP::const_iterator cie = desMap_.end();
                time_t now = time(NULL);
                for (; cie!=it; ++it) {
                        if (INTERVAL <= now - it->second) {
                                Buf* pBuf = packet(ST_ClassOver, 0);
                                CHECK_BUF(pBuf, NULL);
                                epClassroom* pClassroom = EPMANAGER->getClassroomById(it->first);
                                if (NULL != pClassroom) {
                                        printf("[DEBUG] DestroyClassroomTask::work : NULL!=pClassroom\n");
                                        pClassroom->sendtoAll(pBuf);
                                        EPMANAGER->deleteClassroomById(it->first);
                                        desMap_.erase(it);
                                }
                        }
                }
                sleep(INTERVAL_SLEEP);
        }

        return -1;
}
Example #3
0
/**
 * Copy a hostent structure to an allocated buffer
 * @return 0 on success, -1 otherwise
 */
static int
tds_copy_hostent(struct hostent *he, struct hostent *result, char *buffer, int buflen)
{
#define CHECK_BUF(len) \
    if (p + sizeof(struct hostent) - buffer > buflen) return -1;
#define ALIGN_P do { p += TDS_ALIGN_SIZE - 1; p -= (p-buffer) % TDS_ALIGN_SIZE; } while(0)

    int n, i;
    char *p = buffer;
    struct hostent *he2;

    /* copy structure */
    he2 = result;
    memcpy(he2, he, sizeof(struct hostent));

    if (he->h_addr_list) {
        int len;
        char **addresses;

        /* count addresses */
        for (n = 0; he->h_addr_list[n]; ++n);

        /* copy addresses */
        addresses = (char **) p;
        he2->h_addr_list = (char **) p;
        len = sizeof(char *) * (n + 1);
        CHECK_BUF(len);
        p += len;
        ALIGN_P;
        for (i = 0; i < n; ++i) {
            addresses[i] = p;

            CHECK_BUF(he->h_length);
            memcpy(p, he->h_addr_list[i], he->h_length);
            p += he->h_length;
            ALIGN_P;
        }
        addresses[n] = NULL;
    }

    /* copy name */
    if (he->h_name) {
        n = strlen(he->h_name) + 1;
        he2->h_name = p;
        CHECK_BUF(n);
        memcpy(p, he->h_name, n);
        p += n;
        ALIGN_P;
    }

    if (he->h_aliases) {
        int len;
        char **aliases;

        /* count aliases */
        for (n = 0; he->h_aliases[n]; ++n);

        /* copy aliases */
        aliases = (char **) p;
        he2->h_aliases = (char **) p;
        len = sizeof(char *) * (n + 1);
        CHECK_BUF(len);
        p += len;
        for (i = 0; i < n; ++i) {
            len = strlen(he->h_aliases[i]) + 1;
            aliases[i] = p;

            CHECK_BUF(len);
            memcpy(p, he->h_aliases[i], len);
            p += len;
        }
        aliases[n] = NULL;
    }
    return 0;
}