@@ -1455,10 +1455,11 @@ } static int tuapi_ifconfig_conf(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int sock, int sock_v4, int sock_v6) { Tcl_Obj *option_name_obj, *option_val_obj; Tcl_Obj **flags_objv; + Tcl_WideInt option_val_wide; struct ifreq iface_req; struct sockaddr *tmp_ioctl_addr; const char *iface; short flags; int flags_objc; @@ -1476,10 +1477,11 @@ objc -= 2; objv += 2; for (; objc > 0; objc--,objv++) { /* Prepare for an ioctl() */ + memset(&iface_req, 0, sizeof(iface_req)); strcpy(iface_req.ifr_name, iface); tmp_ioctl = -1; option_name_obj = objv[0]; @@ -1573,18 +1575,33 @@ return(TCL_ERROR); } break; case 0x5e9d03e3: /* metric */ - case 0x1b7a75: /* mtu */ case 0x7c3891f2: /* hwaddr */ case 0xbf72a969: /* addmulti */ case 0xba708969: /* delmulti */ case 0xdd876e5: /* name */ Tcl_SetObjResult(interp, Tcl_ObjPrintf("option \"%s\" unsupported", Tcl_GetString(option_name_obj))); return(TCL_ERROR); + break; + case 0x1b7a75: /* mtu */ + tcl_ret = Tcl_GetWideIntFromObj(interp, option_val_obj, &option_val_wide); + if (tcl_ret != TCL_OK) { + return(tcl_ret); + } + + iface_req.ifr_mtu = option_val_wide; + + ioctl_ret = ioctl(sock, SIOCSIFMTU, &iface_req); + if (ioctl_ret != 0) { + Tcl_SetObjResult(interp, Tcl_NewStringObj(strerror(errno), -1)); + + return(TCL_ERROR); + } + break; case 0x4e9aeaf3: /* address */ if (tmp_ioctl == -1) { tmp_ioctl = SIOCSIFADDR; tmp_ioctl_addr = &iface_req.ifr_addr;