diff --git a/software/drscl/CMakeLists.txt b/software/drscl/CMakeLists.txt
index bb32dce..76f53ac 100644
--- a/software/drscl/CMakeLists.txt
+++ b/software/drscl/CMakeLists.txt
@@ -8,9 +8,9 @@ set(SRC
../src/DRS.cpp
../src/averager.cpp
../src/musbstd.c
- ../mxml/mxml.cxx
- ../mxml/strlcpy.cxx)
-
+ ../src/strlcpy.cxx
+ ../mxml/mxml.cxx)
+
add_executable(drscl ${SRC} drscl.cpp)
add_executable(drs_exam ${SRC} drs_exam.cpp)
add_executable(drs_exam_multi ${SRC} drs_exam_multi.cpp)
diff --git a/software/drsosc/CMakeLists.txt b/software/drsosc/CMakeLists.txt
index 4c8a085..c4414c6 100644
--- a/software/drsosc/CMakeLists.txt
+++ b/software/drsosc/CMakeLists.txt
@@ -12,8 +12,8 @@ set(LIBSRC
../src/DRS.cpp
../src/averager.cpp
../src/musbstd.c
- ../mxml/mxml.cxx
- ../mxml/strlcpy.cxx)
+ ../src/strlcpy.cxx
+ ../mxml/mxml.cxx)
set(SRC
ConfigDialog.cpp
diff --git a/software/include/strlcpy.h b/software/include/strlcpy.h
new file mode 100644
index 0000000..589a644
--- /dev/null
+++ b/software/include/strlcpy.h
@@ -0,0 +1,55 @@
+/********************************************************************\
+
+ Name: strlcpy.h
+ Created by: Stefan Ritt
+ Copyright 2000 + Stefan Ritt
+
+ Contents: Header file for strlcpy.c
+
+ This file is part of MIDAS XML Library.
+
+ MIDAS XML Library is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ MIDAS XML Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with MIDAS XML Library. If not, see .
+
+\********************************************************************/
+
+#ifndef _STRLCPY_H_
+#define _STRLCPY_H_
+
+// some version of gcc have a built-in strlcpy
+#ifdef strlcpy
+#define STRLCPY_DEFINED
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXPRT
+#if defined(EXPORT_DLL)
+#define EXPRT __declspec(dllexport)
+#else
+#define EXPRT
+#endif
+#endif
+
+#ifndef STRLCPY_DEFINED
+size_t EXPRT strlcpy(char *dst, const char *src, size_t size);
+size_t EXPRT strlcat(char *dst, const char *src, size_t size);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_STRLCPY_H_ */
diff --git a/software/mxml b/software/mxml
index 5e10343..726495c 160000
--- a/software/mxml
+++ b/software/mxml
@@ -1 +1 @@
-Subproject commit 5e10343edbf0c56dc635d5b9752d4c052ac3e5d6
+Subproject commit 726495c1e52deee1263f856b8c78925225a3e589
diff --git a/software/src/DRS.cpp b/software/src/DRS.cpp
index 3034536..6a529e6 100644
--- a/software/src/DRS.cpp
+++ b/software/src/DRS.cpp
@@ -322,7 +322,7 @@ DRS::DRS()
usb_interface->usb_type = 1; // USB 1.1
fBoard[fNumberOfBoards] = new DRSBoard(usb_interface, usb_slot++);
if (!fBoard[fNumberOfBoards]->HasCorrectFirmware())
- sprintf(fError, "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n",
+ snprintf(fError, sizeof(fError), "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n",
fBoard[fNumberOfBoards]->GetFirmwareVersion(),
fBoard[fNumberOfBoards]->GetRequiredFirmwareVersion());
fNumberOfBoards++;
@@ -350,7 +350,7 @@ DRS::DRS()
usb_interface->usb_type = 2; // USB 2.0
fBoard[fNumberOfBoards] = new DRSBoard(usb_interface, usb_slot++);
if (!fBoard[fNumberOfBoards]->HasCorrectFirmware())
- sprintf(fError, "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n",
+ snprintf(fError, sizeof(fError), "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n",
fBoard[fNumberOfBoards]->GetFirmwareVersion(),
fBoard[fNumberOfBoards]->GetRequiredFirmwareVersion());
fNumberOfBoards++;
@@ -4893,7 +4893,7 @@ DRSBoard::TimeData * DRSBoard::GetTimeCalibration(unsigned int chipIndex, bool r
if (i <= 499 || (i >= 501 && i <= 999) || (i >= 1001 && i <= 1499) || (i >= 1501 && i <= 1999) ||
(i >= 2001 && i <= 2499) || i >= 2501)
continue;
- sprintf(fileName, "%s/board%d/TimeCalib_board%d_chip%d_%dMHz.xml", fCalibDirectory, fBoardSerialNumber,
+ snprintf(fileName, sizeof(fileName), "%s/board%d/TimeCalib_board%d_chip%d_%dMHz.xml", fCalibDirectory, fBoardSerialNumber,
fBoardSerialNumber, chipIndex, i);
rootNode = mxml_parse_file(fileName, error, sizeof(error), NULL);
if (rootNode == NULL)
@@ -4925,8 +4925,7 @@ DRSBoard::TimeData * DRSBoard::GetTimeCalibration(unsigned int chipIndex, bool r
void DRSBoard::SetCalibrationDirectory(const char *calibrationDirectoryPath)
{
- strncpy(fCalibDirectory, calibrationDirectoryPath, strlen(calibrationDirectoryPath));
- fCalibDirectory[strlen(calibrationDirectoryPath)] = 0;
+ strlcpy(fCalibDirectory, calibrationDirectoryPath, sizeof(fCalibDirectory));
};
/*------------------------------------------------------------------*/
@@ -6220,12 +6219,12 @@ bool ResponseCalibration::WriteCalibrationV3(unsigned int chipIndex)
// Open File
fBoard->GetCalibrationDirectory(strt);
- sprintf(str, "%s/board%d", strt, fBoard->GetBoardSerialNumber());
+ snprintf(str, sizeof(str), "%s/board%d", strt, fBoard->GetBoardSerialNumber());
if (MakeDir(str) == -1) {
printf("Error: Cannot create directory \"%s\"\n", str);
return false;
}
- sprintf(str, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(),
+ snprintf(str, sizeof(str), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(),
fBoard->GetBoardSerialNumber(), chipIndex, static_cast < int >(fBoard->GetNominalFrequency() * 1000));
fCalibFile = fopen(str, "wb");
if (fCalibFile == NULL) {
@@ -6279,12 +6278,12 @@ bool ResponseCalibration::WriteCalibrationV4(unsigned int chipIndex)
// Open File
fBoard->GetCalibrationDirectory(strt);
- sprintf(str, "%s/board%d", strt, fBoard->GetBoardSerialNumber());
+ snprintf(str, sizeof(str), "%s/board%d", strt, fBoard->GetBoardSerialNumber());
if (MakeDir(str) == -1) {
printf("Error: Cannot create directory \"%s\"\n", str);
return false;
}
- sprintf(str, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(),
+ snprintf(str, sizeof(str), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(),
fBoard->GetBoardSerialNumber(), chipIndex, static_cast < int >(fBoard->GetNominalFrequency() * 1000));
fCalibFile = fopen(str, "wb");
if (fCalibFile == NULL) {
@@ -7233,7 +7232,7 @@ bool ResponseCalibration::ReadCalibrationV3(unsigned int chipIndex)
fCalibrationData[chipIndex] = NULL;
fBoard->GetCalibrationDirectory(calibDir);
- sprintf(fileName, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir,
+ snprintf(fileName, sizeof(fileName), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir,
fBoard->GetBoardSerialNumber(), fBoard->GetBoardSerialNumber(), chipIndex,
static_cast < int >(fBoard->GetNominalFrequency() * 1000));
@@ -7391,7 +7390,7 @@ bool ResponseCalibration::ReadCalibrationV4(unsigned int chipIndex)
// Read Response Calibration
fBoard->GetCalibrationDirectory(calibDir);
- sprintf(fileName, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir,
+ snprintf(fileName, sizeof(fileName), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir,
fBoard->GetBoardSerialNumber(), fBoard->GetBoardSerialNumber(), chipIndex,
static_cast < int >(fBoard->GetNominalFrequency() * 1000));
diff --git a/software/src/strlcpy.cxx b/software/src/strlcpy.cxx
new file mode 100644
index 0000000..586c2bc
--- /dev/null
+++ b/software/src/strlcpy.cxx
@@ -0,0 +1,101 @@
+/********************************************************************\
+
+ Name: strlcpy.c
+ Created by: Stefan Ritt
+ Copyright 2000 + Stefan Ritt
+
+ Contents: Contains strlcpy and strlcat which are versions of
+ strcpy and strcat, but which avoid buffer overflows
+
+
+ This file is part of MIDAS XML Library.
+
+ MIDAS XML Library is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ MIDAS XML Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with MIDAS XML Library. If not, see .
+
+\********************************************************************/
+
+#include
+#include
+#include "strlcpy.h"
+
+/*
+* Copy src to string dst of size siz. At most siz-1 characters
+* will be copied. Always NUL terminates (unless size == 0).
+* Returns strlen(src); if retval >= siz, truncation occurred.
+*/
+#ifndef STRLCPY_DEFINED
+
+size_t strlcpy(char *dst, const char *src, size_t size)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = size;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0) {
+ do {
+ if ((*d++ = *s++) == 0)
+ break;
+ } while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (size != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++);
+ }
+
+ return (s - src - 1); /* count does not include NUL */
+}
+
+/*-------------------------------------------------------------------*/
+
+/*
+* Appends src to string dst of size siz (unlike strncat, siz is the
+* full size of dst, not space left). At most siz-1 characters
+* will be copied. Always NUL terminates (unless size <= strlen(dst)).
+* Returns strlen(src) + MIN(size, strlen(initial dst)).
+* If retval >= size, truncation occurred.
+*/
+size_t strlcat(char *dst, const char *src, size_t size)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = size;
+ size_t dlen;
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (n-- != 0 && *d != '\0')
+ d++;
+ dlen = d - dst;
+ n = size - dlen;
+
+ if (n == 0)
+ return (dlen + strlen(s));
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+ s++;
+ }
+ *d = '\0';
+
+ return (dlen + (s - src)); /* count does not include NUL */
+}
+
+/*-------------------------------------------------------------------*/
+
+#endif // STRLCPY_DEFINED