+static int cmpport __P((struct sockaddr *, struct sockaddr *));
+
+static void get_options(struct tftphdr *, int);
+
+static void
+get_options(struct tftphdr *ap, int size)
+{
+ unsigned long val;
+ char *opt, *endp, *nextopt, *valp;
+ int l;
+
+ size -= 2; /* skip over opcode */
+ opt = ap->th_stuff;
+ endp = opt + size - 1;
+ *endp = '\0';
+
+ while (opt < endp) {
+ l = strlen(opt) + 1;
+ valp = opt + l;
+ if (valp < endp) {
+ val = strtoul(valp, NULL, 10);
+ l = strlen(valp) + 1;
+ nextopt = valp + l;
+ if (val == ULONG_MAX && errno == ERANGE) {
+ /* Report illegal value */
+ opt = nextopt;
+ continue;
+ }
+ } else {
+ /* Badly formed OACK */
+ break;
+ }
+ if (strcmp(opt, "tsize") == 0) {
+ /* cool, but we'll ignore it */
+ } else if (strcmp(opt, "timeout") == 0) {
+ if (val >= 1 && val <= 255) {
+ rexmtval = val;
+ } else {
+ /* Report error? */
+ }
+ } else if (strcmp(opt, "blksize") == 0) {
+ if (val >= 8 && val <= MAXSEGSIZE) {
+ blksize = val;
+ } else {
+ /* Report error? */
+ }
+ } else {
+ /* unknown option */
+ }
+ opt = nextopt;
+ }
+}