Diff for /tftpd/src/srv.c between versions 1.5.2.1 and 1.8.2.1

version 1.5.2.1, 2014/02/21 09:07:08 version 1.8.2.1, 2017/01/22 21:00:33
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004 - 2014Copyright 2004 - 2017
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 45  SUCH DAMAGE. Line 45  SUCH DAMAGE.
 */  */
 #include "global.h"  #include "global.h"
 #include "exec.h"  #include "exec.h"
   #include "buf.h"
 #include "srv.h"  #include "srv.h"
   
   
Line 55  timeoutSession(sched_task_t *task) Line 56  timeoutSession(sched_task_t *task)
   
         ETRACE();          ETRACE();
   
           if (bf)
                   flushBuffer(cli.fd);
   
         /* drop session */          /* drop session */
         if (cli.fd > 2)          if (cli.fd > 2)
                 close(cli.fd);                  close(cli.fd);
Line 78  txPkt(sched_task_t *task) Line 82  txPkt(sched_task_t *task)
         if (wlen == -1)          if (wlen == -1)
                 ESYSERR(0);                  ESYSERR(0);
         else if (wlen != TASK_DATLEN(task)) {          else if (wlen != TASK_DATLEN(task)) {
                EERROR(EIO, "Sended %d bytes != packet %d bytes",                 EERROR(EIO, "Sended %d bytes != packet %zu bytes", 
                                 wlen, TASK_DATLEN(task));                                  wlen, TASK_DATLEN(task));
                 schedEvent(TASK_ROOT(task), execProg, "error", 0, NULL, TFTP_OPC_ERROR);                  schedEvent(TASK_ROOT(task), execProg, "error", 0, NULL, TFTP_OPC_ERROR);
                 schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL,                   schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL, 
Line 167  txAck(sched_task_t *task) Line 171  txAck(sched_task_t *task)
                 schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL, timeoutSession, NULL);                  schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL, timeoutSession, NULL);
                 schedEvent(TASK_ROOT(task), timeoutSession, NULL, 0, TASK_DATA(task), 0);                  schedEvent(TASK_ROOT(task), timeoutSession, NULL, 0, TASK_DATA(task), 0);
                 EVERBOSE(2, "Finish WRQ request");                  EVERBOSE(2, "Finish WRQ request");
                   schedResumeby(TASK_ROOT(task), CRITERIA_ID, 0);
         }          }
         taskExit(task, NULL);          taskExit(task, NULL);
 }  }
Line 214  getOpts(rpack_t * __restrict pkt, int rlen) Line 219  getOpts(rpack_t * __restrict pkt, int rlen)
                 }                  }
         } while (rlen > 0);          } while (rlen > 0);
   
        EVERBOSE(4, "blksize=%u tsize=%llu timeout=%u rollover=%u",         EVERBOSE(4, "blksize=%u tsize=%llu timeout=%d rollover=%u", 
                        cli.siz, cli.tsiz, cli.tout.tv_sec, cli.roll - 1);                        cli.siz, (unsigned long long) cli.tsiz, (int) cli.tout.tv_sec, cli.roll - 1);
         return 0;          return 0;
 }  }
   
Line 244  txOack(sched_task_t *task) Line 249  txOack(sched_task_t *task)
         }          }
         if (cli.tsiz) {          if (cli.tsiz) {
                 memset(szStr, 0, sizeof szStr);                  memset(szStr, 0, sizeof szStr);
                snprintf(szStr, sizeof szStr, "%llu", cli.tsiz);                snprintf(szStr, sizeof szStr, "%llu", (unsigned long long) cli.tsiz);
                 rpack_rdata(pkt, TFTP_OPT_TSIZE, strlen(TFTP_OPT_TSIZE) + 1);                  rpack_rdata(pkt, TFTP_OPT_TSIZE, strlen(TFTP_OPT_TSIZE) + 1);
                 rpack_rdata(pkt, szStr, strlen(szStr) + 1);                  rpack_rdata(pkt, szStr, strlen(szStr) + 1);
         }          }
         if (cli.tout.tv_sec) {          if (cli.tout.tv_sec) {
                 memset(szStr, 0, sizeof szStr);                  memset(szStr, 0, sizeof szStr);
                snprintf(szStr, sizeof szStr, "%u", cli.tout.tv_sec);                snprintf(szStr, sizeof szStr, "%d", (int) cli.tout.tv_sec);
                 rpack_rdata(pkt, TFTP_OPT_TIMEOUT, strlen(TFTP_OPT_TIMEOUT) + 1);                  rpack_rdata(pkt, TFTP_OPT_TIMEOUT, strlen(TFTP_OPT_TIMEOUT) + 1);
                 rpack_rdata(pkt, szStr, strlen(szStr) + 1);                  rpack_rdata(pkt, szStr, strlen(szStr) + 1);
         }          }
Line 261  txOack(sched_task_t *task) Line 266  txOack(sched_task_t *task)
                 rpack_rdata(pkt, szStr, strlen(szStr) + 1);                  rpack_rdata(pkt, szStr, strlen(szStr) + 1);
         }          }
   
        EVERBOSE(4, "blksize=%u tsize=%llu timeout=%u rollover=%u",         EVERBOSE(4, "blksize=%u tsize=%llu timeout=%d rollover=%u", 
                        cli.siz, cli.tsiz, cli.tout.tv_sec, cli.roll - 1);                        cli.siz, (unsigned long long) cli.tsiz, (int) cli.tout.tv_sec, cli.roll - 1);
         schedCallOnce(TASK_ROOT(task), txPkt, NULL, TASK_FD(task),           schedCallOnce(TASK_ROOT(task), txPkt, NULL, TASK_FD(task), 
                         TASK_DATA(task), RPACK_OFF(pkt));                          TASK_DATA(task), RPACK_OFF(pkt));
         taskExit(task, NULL);          taskExit(task, NULL);
Line 281  RQ(sched_task_t *task) Line 286  RQ(sched_task_t *task)
   
         cli.siz = TFTP_LOAD_MAX;          cli.siz = TFTP_LOAD_MAX;
         cli.opc = ntohs(rpack_uint16(pkt, NULL, 0));          cli.opc = ntohs(rpack_uint16(pkt, NULL, 0));
           if (!RW && cli.opc == TFTP_OPC_WRQ) {
                   code = htons(2);
                   goto end;
           }
         len = str_getString(RPACK_NEXT(pkt), rlen, &str);          len = str_getString(RPACK_NEXT(pkt), rlen, &str);
         if (len == -1)          if (len == -1)
                 goto end;                  goto end;
Line 331  RQ(sched_task_t *task) Line 340  RQ(sched_task_t *task)
                         code = htons(3);                          code = htons(3);
                 else if (errno == EEXIST)                  else if (errno == EEXIST)
                         code = htons(6);                          code = htons(6);
                   else if (errno == ENOENT)
                           code = htons(1);
                 else                  else
                         code = htons(0);                          code = htons(0);
                 ESYSERR(0);                  ESYSERR(0);
Line 467  DATA(sched_task_t *task) Line 478  DATA(sched_task_t *task)
   
         EVERBOSE(3, "DATA:: seq=%hu; len=%d", cli.seq, len);          EVERBOSE(3, "DATA:: seq=%hu; len=%d", cli.seq, len);
   
        len = pwrite(cli.fd, RPACK_NEXT(pkt), len, (cli.seq - 1) * cli.siz);        if (len > 0) {
        if (len == -1) {                if (!bf)
                ESYSERR(0);                        len = pwrite(cli.fd, RPACK_NEXT(pkt), len, (cli.seq - 1) * cli.siz);
                code = htons(3);                else
                goto end;                        len = bfwrite(cli.fd, RPACK_NEXT(pkt), len);
        } else {                if (len == -1) {
                rpack_rnext(pkt, len);                        ESYSERR(0);
                EVERBOSE(3, "Written to file %s %d bytes", cli.file, len);                        code = htons(3);
                         goto end;
                 } else
                         rpack_rnext(pkt, len);
         }          }
           EVERBOSE(3, "Written to file %s %d bytes", cli.file, len);
   
         schedEvent(TASK_ROOT(task), txAck, NULL, TASK_FD(task), TASK_DATA(task), 0);          schedEvent(TASK_ROOT(task), txAck, NULL, TASK_FD(task), TASK_DATA(task), 0);
         taskExit(task, NULL);          taskExit(task, NULL);

Removed from v.1.5.2.1  
changed lines
  Added in v.1.8.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>