lcd_time.c
来自「eCos操作系统源码」· C语言 代码 · 共 651 行 · 第 1/2 页
C
651 行
*engine_time = (timediff - (ENGINETIME_MAX - *engine_time)); /* FIX -- move this check up... should not change anything * if engineboot is already locked. ??? */ if (*engineboot < ENGINEBOOT_MAX) { *engineboot += 1; } } else { *engine_time += timediff; } DEBUGMSGTL(("lcd_get_enginetime_ex", "engineID ")); DEBUGMSGHEX(("lcd_get_enginetime_ex", engineID, engineID_len)); DEBUGMSG(("lcd_get_enginetime_ex", ": boots=%d, time=%d\n", *engineboot, *engine_time));get_enginetime_ex_quit: return rval;} /* end get_enginetime_ex() *//*******************************************************************-o-****** * set_enginetime * * Parameters: * *engineID * engineID_len * engineboot * engine_time * * Returns: * SNMPERR_SUCCESS Success. * SNMPERR_GENERR Otherwise. * * * Lookup engineID and store the given <engine_time, engineboot> tuple * and then stamp the record with a consistent source of local time. * If the engineID record does not exist, create one. * * Special case: engineID is NULL or engineID_len is 0 defines an engineID * that is "always set." * * XXX "Current time within the local engine" == time(NULL)... */intset_enginetime( u_char *engineID, u_int engineID_len, u_int engineboot, u_int engine_time, u_int authenticated){ int rval = SNMPERR_SUCCESS, iindex; Enginetime e = NULL; /* * Sanity check. */ if ( !engineID || (engineID_len <= 0) ) { return rval; } /* * Store the given <engine_time, engineboot> tuple in the record * for engineID. Create a new record if necessary. */ if ( !(e = search_enginetime_list(engineID, engineID_len)) ) { if ( (iindex = hash_engineID(engineID, engineID_len)) < 0 ) { QUITFUN(SNMPERR_GENERR, set_enginetime_quit); } e = (Enginetime) calloc(1,sizeof(*e)); e->next = etimelist[iindex]; etimelist[iindex] = e; e->engineID = (u_char *) calloc(1,engineID_len); memcpy(e->engineID, engineID, engineID_len); e->engineID_len = engineID_len; }#ifdef LCD_TIME_SYNC_OPT if (authenticated || !e->authenticatedFlag) { e->authenticatedFlag = authenticated;#else if (authenticated) {#endif e->engineTime = engine_time; e->engineBoot = engineboot; e->lastReceivedEngineTime = time(NULL); } e = NULL; /* Indicates a successful update. */ DEBUGMSGTL(("lcd_set_enginetime", "engineID ")); DEBUGMSGHEX(("lcd_set_enginetime", engineID, engineID_len)); DEBUGMSG(("lcd_set_enginetime", ": boots=%d, time=%d\n", engineboot, engine_time));set_enginetime_quit: SNMP_FREE(e); return rval;} /* end set_enginetime() *//*******************************************************************-o-****** * search_enginetime_list * * Parameters: * *engineID * engineID_len * * Returns: * Pointer to a etimelist record with engineID <engineID> -OR- * NULL if no record exists. * * * Search etimelist for an entry with engineID. * * ASSUMES that no engineID will have more than one record in the list. */Enginetimesearch_enginetime_list(u_char *engineID, u_int engineID_len){ int rval = SNMPERR_SUCCESS; Enginetime e = NULL; /* * Sanity check. */ if ( !engineID || (engineID_len<=0) ) { QUITFUN(SNMPERR_GENERR, search_enginetime_list_quit); } /* * Find the entry for engineID if there be one. */ rval = hash_engineID(engineID, engineID_len); if (rval < 0) { QUITFUN(SNMPERR_GENERR, search_enginetime_list_quit); } e = etimelist[rval]; for ( /*EMPTY*/; e; e = e->next ) { if ( (engineID_len == e->engineID_len) && !memcmp(e->engineID, engineID, engineID_len) ) { break; } } search_enginetime_list_quit: return e;} /* end search_enginetime_list() *//*******************************************************************-o-****** * hash_engineID * * Parameters: * *engineID * engineID_len * * Returns: * >0 etimelist index for this engineID. * SNMPERR_GENERR Error. * * * Use a cheap hash to build an index into the etimelist. Method is * to hash the engineID, then split the hash into u_int's and add them up * and modulo the size of the list. * */inthash_engineID(u_char *engineID, u_int engineID_len){ int rval = SNMPERR_GENERR; size_t buf_len = SNMP_MAXBUF; u_int additive = 0; u_char *bufp, buf[SNMP_MAXBUF]; void *context = NULL; /* * Sanity check. */ if ( !engineID || (engineID_len <= 0) ) { QUITFUN(SNMPERR_GENERR, hash_engineID_quit); } /* * Hash engineID into a list index. */ rval = sc_hash(usmHMACMD5AuthProtocol, sizeof(usmHMACMD5AuthProtocol)/sizeof(oid), engineID, engineID_len, buf, &buf_len); QUITFUN(rval, hash_engineID_quit); for ( bufp = buf; (bufp-buf) < (int)buf_len; bufp += 4 ) { additive += (u_int) *bufp; }hash_engineID_quit: SNMP_FREE(context); memset(buf, 0, SNMP_MAXBUF); return (rval < 0) ? rval : (additive % ETIMELIST_SIZE);} /* end hash_engineID() */#ifdef SNMP_TESTING_CODE/*******************************************************************-o-****** * dump_etimelist_entry * * Parameters: * e * count */voiddump_etimelist_entry(Enginetime e, int count){ u_int buflen; char tabs[SNMP_MAXBUF], *t = tabs, *s; count += 1; while (count--) { t += sprintf(t, " "); } buflen = e->engineID_len;#ifdef SNMP_TESTING_CODE if ( !(s = dump_snmpEngineID(e->engineID, &buflen)) ) {#endif binary_to_hex(e->engineID, e->engineID_len, &s);#ifdef SNMP_TESTING_CODE }#endif DEBUGMSGTL(("dump_etimelist", "%s\n",tabs)); DEBUGMSGTL(("dump_etimelist", "%s%s (len=%d) <%d,%d>\n", tabs, s, e->engineID_len, e->engineTime, e->engineBoot)); DEBUGMSGTL(("dump_etimelist", "%s%ld (%ld) -- %s", tabs, e->lastReceivedEngineTime, time(NULL) - e->lastReceivedEngineTime, ctime(&e->lastReceivedEngineTime))); SNMP_FREE(s);} /* end dump_etimelist_entry() *//*******************************************************************-o-****** * dump_etimelist */voiddump_etimelist(void){ int iindex = -1, count = 0; Enginetime e; DEBUGMSGTL(("dump_etimelist", "\n")); while (++iindex < ETIMELIST_SIZE) { DEBUGMSG(("dump_etimelist", "[%d]", iindex)); count = 0; e = etimelist[iindex]; while (e) { dump_etimelist_entry(e, count++); e = e->next; } if (count > 0) { DEBUGMSG(("dump_etimelist", "\n")); } } /* endwhile */ DEBUGMSG(("dump_etimelist", "\n"));} /* end dump_etimelist() */#endif /* SNMP_TESTING_CODE */#endif /* CYGPKG_SNMPAGENT_V3_SUPPORT */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?