📄 pingctltable.c
字号:
case COLUMN_PINGCTLTYPE: *write_method = write_pingCtlType; *var_len = (StorageTmp->pingCtlTypeLen) * sizeof(oid); return (u_char *) StorageTmp->pingCtlType; case COLUMN_PINGCTLDESCR: *write_method = write_pingCtlDescr; *var_len = (StorageTmp->pingCtlDescrLen); return (u_char *) StorageTmp->pingCtlDescr; case COLUMN_PINGCTLSOURCEADDRESSTYPE: *write_method = write_pingCtlSourceAddressType; *var_len = sizeof(StorageTmp->pingCtlSourceAddressType); return (u_char *) & StorageTmp->pingCtlSourceAddressType; case COLUMN_PINGCTLSOURCEADDRESS: *write_method = write_pingCtlSourceAddress; *var_len = (StorageTmp->pingCtlSourceAddressLen); return (u_char *) StorageTmp->pingCtlSourceAddress; case COLUMN_PINGCTLIFINDEX: *write_method = write_pingCtlIfIndex; *var_len = sizeof(StorageTmp->pingCtlIfIndex); return (u_char *) & StorageTmp->pingCtlIfIndex; case COLUMN_PINGCTLBYPASSROUTETABLE: *write_method = write_pingCtlByPassRouteTable; *var_len = sizeof(StorageTmp->pingCtlByPassRouteTable); return (u_char *) & StorageTmp->pingCtlByPassRouteTable; case COLUMN_PINGCTLDSFIELD: *write_method = write_pingCtlDSField; *var_len = sizeof(StorageTmp->pingCtlDSField); return (u_char *) & StorageTmp->pingCtlDSField; case COLUMN_PINGCTLROWSTATUS: *write_method = write_pingCtlRowStatus; *var_len = sizeof(StorageTmp->pingCtlRowStatus); return (u_char *) & StorageTmp->pingCtlRowStatus; default: ERROR_MSG(""); } return NULL;}unsigned longpingProbeHistoryTable_count(struct pingCtlTable_data *thedata){ struct header_complex_index *hciptr2 = NULL; netsnmp_variable_list *vars = NULL; oid newoid[MAX_OID_LEN]; size_t newoid_len; unsigned long count = 0; snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->pingCtlOwnerIndex, thedata->pingCtlOwnerIndexLen); /* pingCtlOwnerIndex */ snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->pingCtlTestName, thedata->pingCtlTestNameLen); /* pingCtlOperationName */ header_complex_generate_oid(newoid, &newoid_len, NULL, 0, vars); for (hciptr2 = pingProbeHistoryTableStorage; hciptr2 != NULL; hciptr2 = hciptr2->next) { if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len) == 0) { count = count + 1; } } return count;}intpingProbeHistoryTable_delLast(struct pingCtlTable_data *thedata){ struct header_complex_index *hciptr2 = NULL; struct header_complex_index *hcilast = NULL; struct pingProbeHistoryTable_data *StorageDel = NULL; struct pingProbeHistoryTable_data *StorageTmp = NULL; netsnmp_variable_list *vars = NULL; oid newoid[MAX_OID_LEN]; size_t newoid_len; time_t last_time = 2147483647; struct tm *tp; tp = (struct tm *) malloc(sizeof(struct tm)); snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->pingCtlOwnerIndex, thedata->pingCtlOwnerIndexLen); /* pingCtlOwnerIndex */ snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->pingCtlTestName, thedata->pingCtlTestNameLen); /* pingCtlOperationName */ header_complex_generate_oid(newoid, &newoid_len, NULL, 0, vars); for (hcilast = hciptr2 = pingProbeHistoryTableStorage; hciptr2 != NULL; hciptr2 = hciptr2->next) { if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len) == 0) { StorageTmp = header_complex_get_from_oid(pingProbeHistoryTableStorage, hciptr2->name, hciptr2->namelen); strptime(StorageTmp->pingProbeHistoryTime, "%c", tp); if (last_time > timegm(tp)) { last_time = timegm(tp); hcilast = hciptr2; } } } StorageDel = header_complex_extract_entry(&pingProbeHistoryTableStorage, hcilast); DEBUGMSGTL(("pingProbeHistoryTable", "delete the last one success!\n")); SNMP_FREE(tp);}char *sock_ntop_host(const struct sockaddr *sa, socklen_t salen){ static char str[128]; /* Unix domain is largest */ switch (sa->sa_family) { case AF_INET:{ struct sockaddr_in *sin = (struct sockaddr_in *) sa; if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL) return (NULL); return (str); }#ifdef IPV6 case AF_INET6:{ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; if (inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str)) == NULL) return (NULL); return (str); }#endif#ifdef AF_UNIX case AF_UNIX:{ struct sockaddr_un *unp = (struct sockaddr_un *) sa; /* * OK to have no pathname bound to the socket: happens on * every connect() unless client calls bind() first. */ if (unp->sun_path[0] == 0) strcpy(str, "(no pathname bound)"); else snprintf(str, sizeof(str), "%s", unp->sun_path); return (str); }#endif#ifdef HAVE_SOCKADDR_DL_STRUCT case AF_LINK:{ struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa; if (sdl->sdl_nlen > 0) snprintf(str, sizeof(str), "%*s", sdl->sdl_nlen, &sdl->sdl_data[0]); else snprintf(str, sizeof(str), "AF_LINK, index=%d", sdl->sdl_index); return (str); }#endif default: snprintf(str, sizeof(str), "sock_ntop_host: unknown AF_xxx: %d, len %d", sa->sa_family, salen); return (str); } return (NULL);}char *Sock_ntop_host(const struct sockaddr *sa, socklen_t salen){ char *ptr; if ((ptr = sock_ntop_host(sa, salen)) == NULL) printf("sock_ntop_host error"); /* inet_ntop() sets errno */ return (ptr);}unsigned shortin_cksum(unsigned short *addr, int len){ int nleft = len; int sum = 0; unsigned short *w = addr; unsigned short answer = 0; /* * Our algorithm is simple, using a 32 bit accumulator (sum), we add * sequential 16 bit words to it, and at the end, fold back all the * carry bits from the top 16 bits into the lower 16 bits. */ while (nleft > 1) { sum += *w++; nleft -= 2; } /* * 4mop up an odd byte, if necessary */ if (nleft == 1) { *(unsigned char *) (&answer) = *(unsigned char *) w; sum += answer; } /* * 4add back carry outs from top 16 bits to low 16 bits */ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ sum += (sum >> 16); /* add carry */ answer = ~sum; /* truncate to 16 bits */ return (answer);}struct addrinfo *host_serv(const char *host, const char *serv, int family, int socktype){ int n; struct addrinfo hints, *res; bzero(&hints, sizeof(struct addrinfo)); hints.ai_flags = AI_CANONNAME; /* always return canonical name */ hints.ai_family = family; /* AF_UNSPEC, AF_INET, AF_INET6, etc. */ hints.ai_socktype = socktype; /* 0, SOCK_STREAM, SOCK_DGRAM, etc. */ if ((n = getaddrinfo(host, serv, &hints, &res)) != 0) return (NULL); return (res); /* return pointer to first on linked list */}/* * end host_serv *//* * There is no easy way to pass back the integer return code from * getaddrinfo() in the function above, short of adding another argument * that is a pointer, so the easiest way to provide the wrapper function * is just to duplicate the simple function as we do here. */struct addrinfo *Host_serv(const char *host, const char *serv, int family, int socktype){ int n; struct addrinfo hints, *res; bzero(&hints, sizeof(struct addrinfo)); hints.ai_flags = AI_CANONNAME; /* always return canonical name */ hints.ai_family = family; /* 0, AF_INET, AF_INET6, etc. */ hints.ai_socktype = socktype; /* 0, SOCK_STREAM, SOCK_DGRAM, etc. */ if ((n = getaddrinfo(host, serv, &hints, &res)) != 0) printf("host_serv error for %s, %s: %s", (host == NULL) ? "(no hostname)" : host, (serv == NULL) ? "(no service name)" : serv, gai_strerror(n)); return (res); /* return pointer to first on linked list */}intreadable_timeo(int fd, int sec){ fd_set rset; struct timeval tv; FD_ZERO(&rset); FD_SET(fd, &rset); tv.tv_sec = sec; tv.tv_usec = 0; return (select(fd + 1, &rset, NULL, NULL, &tv));}/* * send trap */intsend_ping_trap(struct pingCtlTable_data *item, oid * trap_oid, size_t trap_oid_len){ static oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; /* snmpTrapIOD.0 */ struct pingResultsTable_data *StorageTmp = NULL; netsnmp_variable_list *var_list = NULL, *vars = NULL; oid newoid[MAX_OID_LEN]; size_t newoid_len; oid pingCtlTargetAddress[] = { 1, 3, 6, 1, 2, 1, 80, 1, 2, 1, 4 }; oid pingResultsMinRtt[] = { 1, 3, 6, 1, 2, 1, 80, 1, 3, 1, 4 }; oid pingResultsMaxRtt[] = { 1, 3, 6, 1, 2, 1, 80, 1, 3, 1, 5 }; oid pingResultsAverageRtt[] = { 1, 3, 6, 1, 2, 1, 80, 1, 3, 1, 6 }; oid pingResultsProbeResponses[] = { 1, 3, 6, 1, 2, 1, 80, 1, 3, 1, 7 }; oid pingResultsSendProbes[] = { 1, 3, 6, 1, 2, 1, 80, 1, 3, 1, 8 }; snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) item->pingCtlOwnerIndex, item->pingCtlOwnerIndexLen); /* pingCtlOwnerIndex */ snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) item->pingCtlTestName, item->pingCtlTestNameLen); /* pingCtlOperationName */ StorageTmp = SNMP_MALLOC_STRUCT(pingResultsTable_data); if ((StorageTmp = (struct pingResultsTable_data *) header_complex_get(pingResultsTableStorage, vars)) == NULL) return SNMP_ERR_NOSUCHNAME; /* * snmpTrap oid */ snmp_varlist_add_variable(&var_list, objid_snmptrap, sizeof(objid_snmptrap) / sizeof(oid), ASN_OBJECT_ID, (u_char *) trap_oid, trap_oid_len * sizeof(oid)); /* * pingCtlTargetAddress */ bzero(newoid, MAX_OID_LEN * sizeof(oid)); header_complex_generate_oid(newoid, &newoid_len, pingCtlTargetAddress, sizeof(pingCtlTargetAddress) / sizeof(oid), vars); snmp_varlist_add_variable(&var_list, newoid, newoid_len, ASN_OCTET_STR, (u_char *) item->pingCtlTargetAddress, item->pingCtlTargetAddressLen); /* * pingResultsMinRtt */ bzero(newoid, newoid_len); header_complex_generate_oid(newoid, &newoid_len, pingResultsMinRtt, sizeof(pingResultsMinRtt) / sizeof(oid), vars); snmp_varlist_add_variable(&var_list, newoid, newoid_len, ASN_UNSIGNED, (u_char *) & (StorageTmp->pingResultsMinRtt), sizeof(StorageTmp->pingResultsMinRtt)); /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -