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; }
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; }
/** * 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; }