//显示地址等信息 void display_task(void *pdata) { while(1) { #if LWIP_DHCP //当开启DHCP的时候 if(lwipdev.dhcpstatus != 0) //开启DHCP { show_address(lwipdev.dhcpstatus ); //显示地址信息 OSTaskSuspend(OS_PRIO_SELF); //显示完地址信息后挂起自身任务 } #else show_address(0); //显示静态地址 OSTaskSuspend(OS_PRIO_SELF); //显示完地址信息后挂起自身任务 #endif //LWIP_DHCP OSTimeDlyHMSM(0,0,0,100); } }
int main(void) { u32 i; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化按键 LCD_Init(); //初始化LCD TIM3_Int_Init(1000,719); //定时器3频率为100hz usmart_dev.init(72); //初始化USMART FSMC_SRAM_Init(); //初始化外部SRAM my_mem_init(SRAMIN); //初始化内部内存池 my_mem_init(SRAMEX); //初始化外部内存池 POINT_COLOR=RED; //设置字体为红色 LCD_ShowString(30,30,200,16,16,"ENC28J60+STM32"); LCD_ShowString(30,50,200,16,16,"LWIP Test!"); LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,90,200,16,16,"2015/4/27"); while(lwip_comm_init()) //lwip初始化 { LCD_ShowString(30,110,200,20,16,"LWIP Init Falied!"); delay_ms(1200); LCD_Fill(30,110,230,130,WHITE); //清除显示 LCD_ShowString(30,110,200,16,16,"Retrying..."); } LCD_ShowString(30,110,200,20,16,"LWIP Init Success!"); LCD_ShowString(30,130,200,16,16,"DHCP IP configing..."); #if LWIP_DHCP //使用DHCP while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP获取成功/超时溢出 { lwip_periodic_handle(); //LWIP内核需要定时处理的函数 } #endif show_address(lwipdev.dhcpstatus); //显示地址信息 while(1) { lwip_periodic_handle(); //LWIP内核需要定时处理的函数 i++; if(i==50000) { LED0=~LED0; i=0; } } }
void _pascal opening(char *cfgfile, char *areafile) { FILE *fp = NULL; int count = 0,i; char tmp[PATHLEN]; init(); video_init(); /* start looking for the config file... */ if ((fp = fileopen("BINKLEY;OPUS;SEADOG;BBS;",cfgfile)) == NULL) if ((fp = fileopen("BINKLEY;OPUS;SEADOG;BBS","msged.cfg")) == NULL) settings(); if (fp) { parseconfig(fp); if (videomethod != BIOS) video_init(); } if (opusdate) fidozone = NO; for (i = 0; i < 40; i++) count += (macros[i] != (void *) NULL)?1:0; if (fp != NULL) fclose(fp); rm = (rm > maxx)?maxx:rm; qm = (qm > rm)?rm - 5 - strlen(quotestr):qm; colors.quote = (colors.quote)?colors.quote:colors.normal; checkareas(areafile); set_color(colors.normal); cls(); gotoxy(6, 9); set_color(colors.hilite); bputs("msged FTS Compatible Mail Editor"); set_color(colors.normal); gotoxy(6, 11); bputs("version " VERSION " PUBLIC DOMAIN by Jim Nutt"); gotoxy(6,13); bprintf("%d by %d ",maxx,maxy); bputs((videomethod==DIRECT)?"direct video":(videomethod==BIOS)?"bios video":(videomethod==ANSI)?"ansi video":"fossil video"); gotoxy(6, 15); bprintf("%s at %s", username, show_address(thisnode)); if (aliascount > 1) bprintf(" (primary)"); if (thisnode.point) bprintf(" (private net %d/%d)", pointnet, thisnode.point); if (origin != NULL) { gotoxy(6,16); bputs(origin); gotoxy(6,18); } else gotoxy(6,17); bprintf("%d message areas found", areas); gotoxy(6,wherey() + 1); bprintf("%d macros defined",count); getcwd(tmp,PATHLEN); if (tmp) strlwr(tmp); home = strdup(tmp); gotoxy(6,wherey() + 2); bprintf("home directory is %s",home); if (arealist == NULL) { puts("Oops! at least one message area must be defined."); puts("Exiting..."); exit(0); } }
int interpret_dhcpv6(int flags, const uint8_t *data, int len) { int olen = len; char *line, *lstart; dhcpv6_relay_t d6r; dhcpv6_message_t d6m; uint_t optlen; uint16_t statuscode; if (len <= 0) { (void) strlcpy(get_sum_line(), "DHCPv6?", MAXLINE); return (0); } if (flags & F_SUM) { uint_t ias; dhcpv6_option_t *d6o; in6_addr_t link, peer; char linkstr[INET6_ADDRSTRLEN]; char peerstr[INET6_ADDRSTRLEN]; line = lstart = get_sum_line(); line += snprintf(line, MAXLINE, "DHCPv6 %s", mtype_to_str(data[0])); if (data[0] == DHCPV6_MSG_RELAY_FORW || data[0] == DHCPV6_MSG_RELAY_REPL) { if (len < sizeof (d6r)) { (void) strlcpy(line, "?", MAXLINE - (line - lstart)); return (olen); } /* Not much in DHCPv6 is aligned. */ (void) memcpy(&d6r, data, sizeof (d6r)); (void) memcpy(&link, d6r.d6r_linkaddr, sizeof (link)); (void) memcpy(&peer, d6r.d6r_peeraddr, sizeof (peer)); line += snprintf(line, MAXLINE - (line - lstart), " HC=%d link=%s peer=%s", d6r.d6r_hop_count, inet_ntop(AF_INET6, &link, linkstr, sizeof (linkstr)), inet_ntop(AF_INET6, &peer, peerstr, sizeof (peerstr))); data += sizeof (d6r); len -= sizeof (d6r); } else { if (len < sizeof (d6m)) { (void) strlcpy(line, "?", MAXLINE - (line - lstart)); return (olen); } (void) memcpy(&d6m, data, sizeof (d6m)); line += snprintf(line, MAXLINE - (line - lstart), " xid=%x", DHCPV6_GET_TRANSID(&d6m)); data += sizeof (d6m); len -= sizeof (d6m); } ias = 0; d6o = NULL; while ((d6o = dhcpv6_find_option(data, len, d6o, DHCPV6_OPT_IA_NA, NULL)) != NULL) ias++; if (ias > 0) line += snprintf(line, MAXLINE - (line - lstart), " IAs=%u", ias); d6o = dhcpv6_find_option(data, len, NULL, DHCPV6_OPT_STATUS_CODE, &optlen); optlen -= sizeof (*d6o); if (d6o != NULL && optlen >= sizeof (statuscode)) { (void) memcpy(&statuscode, d6o + 1, sizeof (statuscode)); line += snprintf(line, MAXLINE - (line - lstart), " status=%u", ntohs(statuscode)); optlen -= sizeof (statuscode); if (optlen > 0) { line += snprintf(line, MAXLINE - (line - lstart), " \"%.*s\"", optlen, (char *)(d6o + 1) + 2); } } d6o = dhcpv6_find_option(data, len, NULL, DHCPV6_OPT_RELAY_MSG, &optlen); optlen -= sizeof (*d6o); if (d6o != NULL && optlen >= 1) { line += snprintf(line, MAXLINE - (line - lstart), " relay=%s", mtype_to_str(*(uint8_t *)(d6o + 1))); } } else if (flags & F_DTAIL) { show_header("DHCPv6: ", "Dynamic Host Configuration Protocol Version 6", len); show_space(); (void) snprintf(get_line(0, 0), get_line_remain(), "Message type (msg-type) = %u (%s)", data[0], mtype_to_str(data[0])); if (data[0] == DHCPV6_MSG_RELAY_FORW || data[0] == DHCPV6_MSG_RELAY_REPL) { if (len < sizeof (d6r)) { (void) strlcpy(get_line(0, 0), "Truncated", get_line_remain()); return (olen); } (void) memcpy(&d6r, data, sizeof (d6r)); (void) snprintf(get_line(0, 0), get_line_remain(), "Hop count = %u", d6r.d6r_hop_count); show_address("Link address", d6r.d6r_linkaddr); show_address("Peer address", d6r.d6r_peeraddr); data += sizeof (d6r); len -= sizeof (d6r); } else { if (len < sizeof (d6m)) { (void) strlcpy(get_line(0, 0), "Truncated", get_line_remain()); return (olen); } (void) memcpy(&d6m, data, sizeof (d6m)); (void) snprintf(get_line(0, 0), get_line_remain(), "Transaction ID = %x", DHCPV6_GET_TRANSID(&d6m)); data += sizeof (d6m); len -= sizeof (d6m); } show_space(); show_options(data, len); show_space(); } return (olen); }
static void show_options(const uint8_t *data, int len) { dhcpv6_option_t d6o; uint_t olen, retlen; uint16_t val16; uint16_t type; uint32_t val32; const uint8_t *ostart; char *str, *sp; char *oldnest; /* * Be very careful with negative numbers; ANSI signed/unsigned * comparison doesn't work as expected. */ while (len >= (signed)sizeof (d6o)) { (void) memcpy(&d6o, data, sizeof (d6o)); d6o.d6o_code = ntohs(d6o.d6o_code); d6o.d6o_len = olen = ntohs(d6o.d6o_len); (void) snprintf(get_line(0, 0), get_line_remain(), "Option Code = %u (%s)", d6o.d6o_code, option_to_str(d6o.d6o_code)); ostart = data += sizeof (d6o); len -= sizeof (d6o); if (olen > len) { (void) strlcpy(get_line(0, 0), "Option truncated", get_line_remain()); olen = len; } switch (d6o.d6o_code) { case DHCPV6_OPT_CLIENTID: case DHCPV6_OPT_SERVERID: if (olen < sizeof (val16)) break; (void) memcpy(&val16, data, sizeof (val16)); data += sizeof (val16); olen -= sizeof (val16); type = ntohs(val16); (void) snprintf(get_line(0, 0), get_line_remain(), " DUID Type = %u (%s)", type, duidtype_to_str(type)); if (type == DHCPV6_DUID_LLT || type == DHCPV6_DUID_LL) { if (olen < sizeof (val16)) break; (void) memcpy(&val16, data, sizeof (val16)); data += sizeof (val16); olen -= sizeof (val16); val16 = ntohs(val16); (void) snprintf(get_line(0, 0), get_line_remain(), " Hardware Type = %u (%s)", val16, arp_htype(val16)); } if (type == DHCPV6_DUID_LLT) { time_t timevalue; if (olen < sizeof (val32)) break; (void) memcpy(&val32, data, sizeof (val32)); data += sizeof (val32); olen -= sizeof (val32); timevalue = ntohl(val32) + DUID_TIME_BASE; (void) snprintf(get_line(0, 0), get_line_remain(), " Time = %lu (%.24s)", ntohl(val32), ctime(&timevalue)); } if (type == DHCPV6_DUID_EN) { if (olen < sizeof (val32)) break; (void) memcpy(&val32, data, sizeof (val32)); data += sizeof (val32); olen -= sizeof (val32); val32 = ntohl(val32); (void) snprintf(get_line(0, 0), get_line_remain(), " Enterprise Number = %lu (%s)", val32, entr_to_str(val32)); } if (olen == 0) break; if ((str = malloc(olen * 3)) == NULL) pr_err("interpret_dhcpv6: no mem"); sp = str + snprintf(str, 3, "%02x", *data++); while (--olen > 0) { *sp++ = (type == DHCPV6_DUID_LLT || type == DHCPV6_DUID_LL) ? ':' : ' '; sp = sp + snprintf(sp, 3, "%02x", *data++); } (void) snprintf(get_line(0, 0), get_line_remain(), (type == DHCPV6_DUID_LLT || type == DHCPV6_DUID_LL) ? " Link Layer Address = %s" : " Identifier = %s", str); free(str); break; case DHCPV6_OPT_IA_NA: case DHCPV6_OPT_IA_PD: { dhcpv6_ia_na_t d6in; if (olen < sizeof (d6in) - sizeof (d6o)) break; (void) memcpy(&d6in, data - sizeof (d6o), sizeof (d6in)); data += sizeof (d6in) - sizeof (d6o); olen -= sizeof (d6in) - sizeof (d6o); (void) snprintf(get_line(0, 0), get_line_remain(), " IAID = %u", ntohl(d6in.d6in_iaid)); (void) snprintf(get_line(0, 0), get_line_remain(), " T1 (renew) = %u seconds", ntohl(d6in.d6in_t1)); (void) snprintf(get_line(0, 0), get_line_remain(), " T2 (rebind) = %u seconds", ntohl(d6in.d6in_t2)); nest_options(data, olen, "IA: ", "Identity Association"); break; } case DHCPV6_OPT_IA_TA: { dhcpv6_ia_ta_t d6it; if (olen < sizeof (d6it) - sizeof (d6o)) break; (void) memcpy(&d6it, data - sizeof (d6o), sizeof (d6it)); data += sizeof (d6it) - sizeof (d6o); olen -= sizeof (d6it) - sizeof (d6o); (void) snprintf(get_line(0, 0), get_line_remain(), " IAID = %u", ntohl(d6it.d6it_iaid)); nest_options(data, olen, "IA: ", "Identity Association"); break; } case DHCPV6_OPT_IAADDR: { dhcpv6_iaaddr_t d6ia; if (olen < sizeof (d6ia) - sizeof (d6o)) break; (void) memcpy(&d6ia, data - sizeof (d6o), sizeof (d6ia)); data += sizeof (d6ia) - sizeof (d6o); olen -= sizeof (d6ia) - sizeof (d6o); show_address(" Address", &d6ia.d6ia_addr); (void) snprintf(get_line(0, 0), get_line_remain(), " Preferred lifetime = %u seconds", ntohl(d6ia.d6ia_preflife)); (void) snprintf(get_line(0, 0), get_line_remain(), " Valid lifetime = %u seconds", ntohl(d6ia.d6ia_vallife)); nest_options(data, olen, "ADDR: ", "Address"); break; } case DHCPV6_OPT_ORO: while (olen >= sizeof (val16)) { (void) memcpy(&val16, data, sizeof (val16)); val16 = ntohs(val16); (void) snprintf(get_line(0, 0), get_line_remain(), " Requested Option Code = %u (%s)", val16, option_to_str(val16)); data += sizeof (val16); olen -= sizeof (val16); } break; case DHCPV6_OPT_PREFERENCE: if (olen > 0) { (void) snprintf(get_line(0, 0), get_line_remain(), *data == 255 ? " Preference = %u (immediate)" : " Preference = %u", *data); } break; case DHCPV6_OPT_ELAPSED_TIME: if (olen == sizeof (val16)) { (void) memcpy(&val16, data, sizeof (val16)); val16 = ntohs(val16); (void) snprintf(get_line(0, 0), get_line_remain(), " Elapsed Time = %u.%02u seconds", val16 / 100, val16 % 100); } break; case DHCPV6_OPT_RELAY_MSG: if (olen > 0) { oldnest = prot_nest_prefix; prot_nest_prefix = prot_prefix; retlen = interpret_dhcpv6(F_DTAIL, data, olen); prot_prefix = prot_nest_prefix; prot_nest_prefix = oldnest; } break; case DHCPV6_OPT_AUTH: { dhcpv6_auth_t d6a; if (olen < DHCPV6_AUTH_SIZE - sizeof (d6o)) break; (void) memcpy(&d6a, data - sizeof (d6o), DHCPV6_AUTH_SIZE); data += DHCPV6_AUTH_SIZE - sizeof (d6o); olen += DHCPV6_AUTH_SIZE - sizeof (d6o); (void) snprintf(get_line(0, 0), get_line_remain(), " Protocol = %u (%s)", d6a.d6a_proto, authproto_to_str(d6a.d6a_proto)); (void) snprintf(get_line(0, 0), get_line_remain(), " Algorithm = %u (%s)", d6a.d6a_alg, authalg_to_str(d6a.d6a_proto, d6a.d6a_alg)); (void) snprintf(get_line(0, 0), get_line_remain(), " Replay Detection Method = %u (%s)", d6a.d6a_rdm, authrdm_to_str(d6a.d6a_rdm)); show_hex(d6a.d6a_replay, sizeof (d6a.d6a_replay), " RDM Data"); if (olen > 0) show_hex(data, olen, " Auth Info"); break; } case DHCPV6_OPT_UNICAST: if (olen >= sizeof (in6_addr_t)) show_address(" Server Address", data); break; case DHCPV6_OPT_STATUS_CODE: if (olen < sizeof (val16)) break; (void) memcpy(&val16, data, sizeof (val16)); val16 = ntohs(val16); (void) snprintf(get_line(0, 0), get_line_remain(), " Status Code = %u (%s)", val16, status_to_str(val16)); data += sizeof (val16); olen -= sizeof (val16); if (olen > 0) (void) snprintf(get_line(0, 0), get_line_remain(), " Text = \"%.*s\"", olen, data); break; case DHCPV6_OPT_VENDOR_CLASS: if (olen < sizeof (val32)) break; (void) memcpy(&val32, data, sizeof (val32)); data += sizeof (val32); olen -= sizeof (val32); val32 = ntohl(val32); (void) snprintf(get_line(0, 0), get_line_remain(), " Enterprise Number = %lu (%s)", val32, entr_to_str(val32)); /* FALLTHROUGH */ case DHCPV6_OPT_USER_CLASS: while (olen >= sizeof (val16)) { (void) memcpy(&val16, data, sizeof (val16)); data += sizeof (val16); olen -= sizeof (val16); val16 = ntohs(val16); if (val16 > olen) { (void) strlcpy(get_line(0, 0), " Truncated class", get_line_remain()); val16 = olen; } show_hex(data, olen, " Class"); data += val16; olen -= val16; } break; case DHCPV6_OPT_VENDOR_OPT: { dhcpv6_option_t sd6o; if (olen < sizeof (val32)) break; (void) memcpy(&val32, data, sizeof (val32)); data += sizeof (val32); olen -= sizeof (val32); val32 = ntohl(val32); (void) snprintf(get_line(0, 0), get_line_remain(), " Enterprise Number = %lu (%s)", val32, entr_to_str(val32)); while (olen >= sizeof (sd6o)) { (void) memcpy(&sd6o, data, sizeof (sd6o)); sd6o.d6o_code = ntohs(sd6o.d6o_code); sd6o.d6o_len = ntohs(sd6o.d6o_len); (void) snprintf(get_line(0, 0), get_line_remain(), " Vendor Option Code = %u", d6o.d6o_code); data += sizeof (d6o); olen -= sizeof (d6o); if (sd6o.d6o_len > olen) { (void) strlcpy(get_line(0, 0), " Vendor Option truncated", get_line_remain()); sd6o.d6o_len = olen; } if (sd6o.d6o_len > 0) { show_hex(data, sd6o.d6o_len, " Data"); data += sd6o.d6o_len; olen -= sd6o.d6o_len; } } break; } case DHCPV6_OPT_REMOTE_ID: if (olen < sizeof (val32)) break; (void) memcpy(&val32, data, sizeof (val32)); data += sizeof (val32); olen -= sizeof (val32); val32 = ntohl(val32); (void) snprintf(get_line(0, 0), get_line_remain(), " Enterprise Number = %lu (%s)", val32, entr_to_str(val32)); /* FALLTHROUGH */ case DHCPV6_OPT_INTERFACE_ID: case DHCPV6_OPT_SUBSCRIBER: if (olen > 0) show_hex(data, olen, " ID"); break; case DHCPV6_OPT_RECONF_MSG: if (olen > 0) { (void) snprintf(get_line(0, 0), get_line_remain(), " Message Type = %u (%s)", *data, reconf_to_str(*data)); } break; case DHCPV6_OPT_SIP_NAMES: case DHCPV6_OPT_DNS_SEARCH: case DHCPV6_OPT_NIS_DOMAIN: case DHCPV6_OPT_BCMCS_SRV_D: { dhcp_symbol_t *symp; char *sp2; symp = inittab_getbycode( ITAB_CAT_STANDARD | ITAB_CAT_V6, ITAB_CONS_SNOOP, d6o.d6o_code); if (symp != NULL) { str = inittab_decode(symp, data, olen, B_TRUE); if (str != NULL) { sp = str; do { sp2 = strchr(sp, ' '); if (sp2 != NULL) *sp2++ = '\0'; (void) snprintf(get_line(0, 0), get_line_remain(), " Name = %s", sp); } while ((sp = sp2) != NULL); free(str); } free(symp); } break; } case DHCPV6_OPT_SIP_ADDR: case DHCPV6_OPT_DNS_ADDR: case DHCPV6_OPT_NIS_SERVERS: case DHCPV6_OPT_SNTP_SERVERS: case DHCPV6_OPT_BCMCS_SRV_A: while (olen >= sizeof (in6_addr_t)) { show_address(" Address", data); data += sizeof (in6_addr_t); olen -= sizeof (in6_addr_t); } break; case DHCPV6_OPT_IAPREFIX: { dhcpv6_iaprefix_t d6ip; if (olen < DHCPV6_IAPREFIX_SIZE - sizeof (d6o)) break; (void) memcpy(&d6ip, data - sizeof (d6o), DHCPV6_IAPREFIX_SIZE); data += DHCPV6_IAPREFIX_SIZE - sizeof (d6o); olen -= DHCPV6_IAPREFIX_SIZE - sizeof (d6o); show_address(" Prefix", d6ip.d6ip_addr); (void) snprintf(get_line(0, 0), get_line_remain(), " Preferred lifetime = %u seconds", ntohl(d6ip.d6ip_preflife)); (void) snprintf(get_line(0, 0), get_line_remain(), " Valid lifetime = %u seconds", ntohl(d6ip.d6ip_vallife)); (void) snprintf(get_line(0, 0), get_line_remain(), " Prefix length = %u", d6ip.d6ip_preflen); nest_options(data, olen, "ADDR: ", "Address"); break; } case DHCPV6_OPT_INFO_REFTIME: if (olen < sizeof (val32)) break; (void) memcpy(&val32, data, sizeof (val32)); (void) snprintf(get_line(0, 0), get_line_remain(), " Refresh Time = %lu seconds", ntohl(val32)); break; case DHCPV6_OPT_GEOCONF_CVC: { dhcpv6_civic_t d6c; int solen; if (olen < DHCPV6_CIVIC_SIZE - sizeof (d6o)) break; (void) memcpy(&d6c, data - sizeof (d6o), DHCPV6_CIVIC_SIZE); data += DHCPV6_CIVIC_SIZE - sizeof (d6o); olen -= DHCPV6_CIVIC_SIZE - sizeof (d6o); (void) snprintf(get_line(0, 0), get_line_remain(), " What Location = %u (%s)", d6c.d6c_what, cwhat_to_str(d6c.d6c_what)); (void) snprintf(get_line(0, 0), get_line_remain(), " Country Code = %.*s", sizeof (d6c.d6c_cc), d6c.d6c_cc); while (olen >= 2) { (void) snprintf(get_line(0, 0), get_line_remain(), " CA Element = %u (%s)", *data, catype_to_str(*data)); solen = data[1]; data += 2; olen -= 2; if (solen > olen) { (void) strlcpy(get_line(0, 0), " CA Element truncated", get_line_remain()); solen = olen; } if (solen > 0) { show_ascii(data, solen, " CA Data"); data += solen; olen -= solen; } } break; } case DHCPV6_OPT_CLIENT_FQDN: { dhcp_symbol_t *symp; if (olen == 0) break; (void) snprintf(get_line(0, 0), get_line_remain(), " Flags = %02x", *data); (void) snprintf(get_line(0, 0), get_line_remain(), " %s", getflag(*data, DHCPV6_FQDNF_S, "Perform AAAA RR updates", "No AAAA RR updates")); (void) snprintf(get_line(0, 0), get_line_remain(), " %s", getflag(*data, DHCPV6_FQDNF_O, "Server override updates", "No server override updates")); (void) snprintf(get_line(0, 0), get_line_remain(), " %s", getflag(*data, DHCPV6_FQDNF_N, "Server performs no updates", "Server performs updates")); symp = inittab_getbycode( ITAB_CAT_STANDARD | ITAB_CAT_V6, ITAB_CONS_SNOOP, d6o.d6o_code); if (symp != NULL) { str = inittab_decode(symp, data, olen, B_TRUE); if (str != NULL) { (void) snprintf(get_line(0, 0), get_line_remain(), " FQDN = %s", str); free(str); } free(symp); } break; } } data = ostart + d6o.d6o_len; len -= d6o.d6o_len; } if (len != 0) { (void) strlcpy(get_line(0, 0), "Option entry truncated", get_line_remain()); } }