summaryrefslogtreecommitdiff
path: root/misc/kdeedu3
diff options
context:
space:
mode:
authorMichael Nottebrock <lofi@FreeBSD.org>2005-02-16 12:14:43 +0000
committerMichael Nottebrock <lofi@FreeBSD.org>2005-02-16 12:14:43 +0000
commit2554fb56138d3faab507e9fcf2bda3523f5262cd (patch)
treeaa5034d162e1f782ac13d386a37edb5b1a5c8cfd /misc/kdeedu3
parentUpgrade to version 1.2.3. (diff)
Patch vulnerabilities in fliccd and do not install suid root anymore.
Security: CAN-2005-0011 Security: Reference: http://www.kde.org/info/security/advisory-20050215-1.txt Security: If the fliccd binary is installed as suid root, it enables root privilege escalation for local users, or, if the daemon is actually running (which it does not by default) and is running as root, remote root privilege escalation.
Diffstat (limited to 'misc/kdeedu3')
-rw-r--r--misc/kdeedu3/Makefile1
-rw-r--r--misc/kdeedu3/files/patch-kstars-3_31925
-rw-r--r--misc/kdeedu3/files/patch-kstars_kstars_indi_Makefile.in10
3 files changed, 1936 insertions, 0 deletions
diff --git a/misc/kdeedu3/Makefile b/misc/kdeedu3/Makefile
index a523deb89de6..7d948943aebd 100644
--- a/misc/kdeedu3/Makefile
+++ b/misc/kdeedu3/Makefile
@@ -7,6 +7,7 @@
PORTNAME= kdeedu
PORTVERSION= ${KDE_VERSION}
+PORTREVISION= 1
CATEGORIES?= misc kde
MASTER_SITES= ${MASTER_SITE_KDE}
MASTER_SITE_SUBDIR= stable/${PORTVERSION:S/.0//}/src
diff --git a/misc/kdeedu3/files/patch-kstars-3_3 b/misc/kdeedu3/files/patch-kstars-3_3
new file mode 100644
index 000000000000..ec34e236e7bd
--- /dev/null
+++ b/misc/kdeedu3/files/patch-kstars-3_3
@@ -0,0 +1,1925 @@
+Index: devicemanager.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/devicemanager.cpp,v
+retrieving revision 1.14
+diff -u -3 -d -p -r1.14 devicemanager.cpp
+--- kstars/kstars/devicemanager.cpp 28 Jun 2004 04:46:45 -0000 1.14
++++ kstars/kstars/devicemanager.cpp 6 Feb 2005 18:38:31 -0000
+@@ -17,6 +17,7 @@
+ #include "indiproperty.h"
+ #include "indigroup.h"
+ #include "indidevice.h"
++#include "indi/indicom.h"
+ #include "kstars.h"
+ #include "kstarsdatetime.h"
+
+@@ -136,50 +137,51 @@ bool DeviceManager::indiConnect(QString
+ void DeviceManager::dataReceived()
+ {
+ char ibuf[32]; /* not so much user input lags */
+- char msg[1024];
++ char errmsg[ERRMSG_SIZE];
+ int i, nr;
+
+ /* read INDI command */
+- nr = read (serverFD, ibuf, sizeof(ibuf));
++ nr = read (serverFD, ibuf, sizeof(ibuf)-1);
+ if (nr <= 0)
+ {
+ if (nr < 0)
+- sprintf (msg, "INDI: input error.");
++ strcpy (errmsg, "INDI: input error.");
+ else
+- sprintf (msg, "INDI: agent closed connection.");
++ strcpy (errmsg, "INDI: agent closed connection.");
+
+
+ tcflush(serverFD, TCIFLUSH);
+ sNotifier->disconnect();
+ close(serverFD);
+ parent->removeDeviceMgr(mgrID);
+- KMessageBox::error(0, QString(msg));
++ KMessageBox::error(0, QString::fromLatin1(errmsg));
+
+ return;
+ }
+
++ ibuf[ sizeof( ibuf )-1 ] = '\0';
++
+ /* process each char */
+ for (i = 0; i < nr; i++)
+ {
+ if (!XMLParser)
+ return;
+
+- XMLEle *root = readXMLEle (XMLParser, (int)ibuf[i], msg);
++ XMLEle *root = readXMLEle (XMLParser, (int)ibuf[i], errmsg);
+ if (root)
+ {
+ //prXMLEle (stdout, root, 0);
+- if (dispatchCommand(root, msg) < 0)
++ if (dispatchCommand(root, errmsg) < 0)
+ {
+- //kdDebug() << msg << endl;
+- fprintf(stderr, msg);
++ fprintf(stderr, "%s", errmsg);
+ prXMLEle (stdout, root, 0);
+ }
+
+ delXMLEle (root);
+ }
+- else if (msg[0])
++ else if (*errmsg)
+ {
+- kdDebug() << msg << endl;
++ kdDebug() << errmsg << endl;
+ }
+ }
+ }
+@@ -271,7 +273,7 @@ int DeviceManager::removeDevice(QString
+ }
+ }
+
+- sprintf(errmsg, "Device %s not found" , devName.ascii());
++ snprintf(errmsg, ERRMSG_SIZE, "Device %.32s not found" , devName.ascii());
+ return -1;
+ }
+
+@@ -284,7 +286,7 @@ INDI_D * DeviceManager::findDev (QString
+ return (indi_dev.at(i));
+ }
+
+- sprintf (errmsg, "INDI: no such device %s", devName.ascii());
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: no such device %.32s", devName.ascii());
+ kdDebug() << errmsg;
+
+ return NULL;
+@@ -342,7 +344,7 @@ INDI_D * DeviceManager::findDev (XMLEle
+ return (addDevice (root, errmsg));
+
+
+- sprintf (errmsg, "INDI: <%s> no such device %s", tagXMLEle(root), dn);
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.32s> no such device %.32s", tagXMLEle(root), dn);
+ return NULL;
+ }
+
+Index: indidevice.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indidevice.cpp,v
+retrieving revision 1.32
+diff -u -3 -d -p -r1.32 indidevice.cpp
+--- kstars/kstars/indidevice.cpp 11 Jun 2004 10:19:14 -0000 1.32
++++ kstars/kstars/indidevice.cpp 6 Feb 2005 18:38:32 -0000
+@@ -172,7 +172,7 @@ int INDI_D::setAnyCmd (XMLEle *root, cha
+ pp = findProp (valuXMLAtt(ap));
+ if (!pp)
+ {
+- sprintf (errmsg,"INDI: <%s> device %s has no property named %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.32s> device %.32s has no property named %.64s",
+ tagXMLEle(root), name.ascii(), valuXMLAtt(ap));
+ return (-1);
+ }
+@@ -197,7 +197,7 @@ int INDI_D::setValue (INDI_P *pp, XMLEle
+ pp->drawLt (pp->state);
+ else
+ {
+- sprintf (errmsg, "INDI: <%s> bogus state %s for %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> bogus state %.64s for %.64s %.64s",
+ tagXMLEle(root), valuXMLAtt(ap), name.ascii(), pp->name.ascii());
+ return (-1);
+ }
+@@ -265,7 +265,7 @@ int INDI_D::setTextValue (INDI_P *pp, XM
+
+ if (!lp)
+ {
+- sprintf(errmsg, "Error: unable to find element '%s' in property '%s'", elementName.ascii(), pp->name.ascii());
++ snprintf(errmsg, ERRMSG_SIZE, "Error: unable to find element '%.64s' in property '%.64s'", elementName.ascii(), pp->name.ascii());
+ return (-1);
+ }
+
+@@ -360,7 +360,7 @@ int INDI_D::setLabelState (INDI_P *pp, X
+ /* no name */
+ if (!ap)
+ {
+- sprintf (errmsg, "INDI: <%s> %s %s %s requires name",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> %.64s %.64s %.64s requires name",
+ tagXMLEle(root), name.ascii(), pp->name.ascii(), tagXMLEle(ep));
+ return (-1);
+ }
+@@ -368,7 +368,7 @@ int INDI_D::setLabelState (INDI_P *pp, X
+ if ((islight && crackLightState (pcdataXMLEle(ep), &state) < 0)
+ || (!islight && crackSwitchState (pcdataXMLEle(ep), &state) < 0))
+ {
+- sprintf (errmsg, "INDI: <%s> unknown state %s for %s %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> unknown state %.64s for %.64s %.64s %.64s",
+ tagXMLEle(root), pcdataXMLEle(ep), name.ascii(), pp->name.ascii(), tagXMLEle(ep));
+ return (-1);
+ }
+@@ -379,7 +379,7 @@ int INDI_D::setLabelState (INDI_P *pp, X
+
+ if (!lp)
+ {
+- sprintf (errmsg,"INDI: <%s> %s %s has no choice named %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> %.64s %.64s has no choice named %.64s",
+ tagXMLEle(root), name.ascii(), pp->name.ascii(), valuXMLAtt(ap));
+ return (-1);
+ }
+@@ -409,7 +409,7 @@ int INDI_D::setLabelState (INDI_P *pp, X
+ {
+ if (menuChoice)
+ {
+- sprintf(errmsg, "INDI: <%s> %s %s has multiple ON states", tagXMLEle(root), name.ascii(), pp->name.ascii());
++ snprintf(errmsg, ERRMSG_SIZE, "INDI: <%.64s> %.64s %.64s has multiple ON states", tagXMLEle(root), name.ascii(), pp->name.ascii());
+ return (-1);
+ }
+ menuChoice = 1;
+@@ -470,7 +470,7 @@ INDI_P * INDI_D::addProperty (XMLEle *ro
+
+ if (findProp (valuXMLAtt(ap)))
+ {
+- sprintf (errmsg, "INDI: <%s %s %s> already exists.\n", tagXMLEle(root),
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s %.64s %.64s> already exists.\n", tagXMLEle(root),
+ name.ascii(), valuXMLAtt(ap));
+ return NULL;
+ }
+@@ -492,7 +492,7 @@ INDI_P * INDI_D::addProperty (XMLEle *ro
+
+ if (crackLightState (valuXMLAtt(ap), &pp->state) < 0)
+ {
+- sprintf (errmsg, "INDI: <%s> bogus state %s for %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> bogus state %.64s for %.64s %.64s",
+ tagXMLEle(root), valuXMLAtt(ap), pp->pg->dp->name.ascii(), pp->name.ascii());
+ delete(pp);
+ return (NULL);
+@@ -544,7 +544,7 @@ INDI_G * INDI_D::findGroup (QString gro
+ return curGroup;
+ }
+
+- sprintf (errmsg, "INDI: group %s not found in %s", grouptag.ascii(), name.ascii());
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: group %.64s not found in %.64s", grouptag.ascii(), name.ascii());
+ return NULL;
+ }
+
+@@ -559,7 +559,7 @@ INDI_G * INDI_D::findGroup (QString gro
+
+ ap = findXMLAtt(root, "perm");
+ if (!ap) {
+- sprintf (errmsg, "INDI: <%s %s %s> missing attribute 'perm'",
++ snprintf (errmsg, ERRMSG_SIZE,"INDI: <%.64s %.64s %.64s> missing attribute 'perm'",
+ tagXMLEle(root), pp->pg->dp->name.ascii(), pp->name.ascii());
+ return (-1);
+ }
+@@ -570,7 +570,7 @@ INDI_G * INDI_D::findGroup (QString gro
+ else if (!strcmp(valuXMLAtt(ap), "rw") || !strcmp(valuXMLAtt(ap), "w"))
+ *permp = PP_RW;
+ else {
+- sprintf (errmsg, "INDI: <%s> unknown perm %s for %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> unknown perm %.64s for %.64s %.64s",
+ tagXMLEle(root), valuXMLAtt(ap), pp->pg->dp->name.ascii(), pp->name.ascii());
+ return (-1);
+ }
+@@ -769,7 +769,7 @@ int INDI_D::buildSwitchesGUI (XMLEle *ro
+ return (err);
+ }
+
+- sprintf (errmsg, "INDI: <%s> unknown rule %s for %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> unknown rule %.64s for %.64s %.64s",
+ tagXMLEle(root), valuXMLAtt(ap), name.ascii(), pp->name.ascii());
+
+ delete(pp);
+Index: indidriver.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indidriver.cpp,v
+retrieving revision 1.27
+diff -u -3 -d -p -r1.27 indidriver.cpp
+--- kstars/kstars/indidriver.cpp 28 Jun 2004 04:46:46 -0000 1.27
++++ kstars/kstars/indidriver.cpp 6 Feb 2005 18:38:32 -0000
+@@ -19,6 +19,7 @@
+ #include "indihostconf.h"
+ #include "devicemanager.h"
+ #include "indidevice.h"
++#include "indi/indicom.h"
+
+ #include "kstars.h"
+ #include "kstarsdata.h"
+@@ -532,7 +533,7 @@ bool INDIDriver::buildDeviceGroup(XMLEle
+
+ if (!ap)
+ {
+- sprintf(errmsg, "Tag %s does not have a group attribute", tagXMLEle(root));
++ snprintf(errmsg, ERRMSG_SIZE, "Tag %.64s does not have a group attribute", tagXMLEle(root));
+ return false;
+ }
+
+@@ -580,7 +581,7 @@ bool INDIDriver::buildDriverElement(XMLE
+ ap = findXMLAtt(root, "label");
+ if (!ap)
+ {
+- sprintf(errmsg, "Tag %s does not have a label attribute", tagXMLEle(root));
++ snprintf(errmsg, ERRMSG_SIZE, "Tag %.64s does not have a label attribute", tagXMLEle(root));
+ return false;
+ }
+
+@@ -590,7 +591,7 @@ bool INDIDriver::buildDriverElement(XMLE
+ ap = findXMLAtt(root, "driver");
+ if (!ap)
+ {
+- sprintf(errmsg, "Tag %s does not have a driver attribute", tagXMLEle(root));
++ snprintf(errmsg, ERRMSG_SIZE, "Tag %.64s does not have a driver attribute", tagXMLEle(root));
+ return false;
+ }
+
+@@ -833,7 +834,7 @@ IDevice::IDevice(QString inLabel, QStrin
+
+ }
+
+-void IDevice::processstd(KProcess */*proc*/, char* buffer, int /*buflen*/)
++void IDevice::processstd(KProcess* /*proc*/, char* buffer, int /*buflen*/)
+ {
+ serverBuffer.append(buffer);
+ emit newServerInput();
+Index: indielement.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indielement.cpp,v
+retrieving revision 1.4
+diff -u -3 -d -p -r1.4 indielement.cpp
+--- kstars/kstars/indielement.cpp 2 Jun 2004 20:47:26 -0000 1.4
++++ kstars/kstars/indielement.cpp 6 Feb 2005 18:38:32 -0000
+@@ -42,7 +42,7 @@ XMLAtt * findAtt (XMLEle *ep, const char
+ if (ap)
+ return (ap);
+ if (errmsg)
+- sprintf (errmsg, "INDI: <%s> missing attribute '%s'", tagXMLEle(ep),name);
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> missing attribute '%.64s'", tagXMLEle(ep),name);
+ return NULL;
+ }
+
+@@ -55,7 +55,7 @@ XMLEle * findEle (XMLEle *ep, INDI_P *pp
+ if (cp)
+ return (cp);
+ if (errmsg)
+- sprintf (errmsg, "INDI: <%s %s %s> missing child '%s'", tagXMLEle(ep),
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s %.64s %.64s> missing child '%.64s'", tagXMLEle(ep),
+ pp->pg->dp->name.ascii(), pp->name.ascii(), child);
+ return (NULL);
+ }
+Index: indiproperty.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indiproperty.cpp,v
+retrieving revision 1.9
+diff -u -3 -d -p -r1.9 indiproperty.cpp
+--- kstars/kstars/indiproperty.cpp 28 Jun 2004 04:46:46 -0000 1.9
++++ kstars/kstars/indiproperty.cpp 6 Feb 2005 18:38:32 -0000
+@@ -521,7 +521,7 @@ int INDI_P::buildMenuGUI(XMLEle *root, c
+
+ if (pg->dp->crackSwitchState (pcdataXMLEle(sep), &(lp->state)) < 0)
+ {
+- sprintf (errmsg, "INDI: <%s> unknown state %s for %s %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> unknown state %.64s for %.64s %.64s %.64s",
+ tagXMLEle(root), valuXMLAtt(ap), name.ascii(), lp->name.ascii(), name.ascii());
+ return (-1);
+ }
+@@ -532,7 +532,7 @@ int INDI_P::buildMenuGUI(XMLEle *root, c
+ {
+ if (onItem != -1)
+ {
+- sprintf (errmsg,"INDI: <%s> %s %s has multiple On switches",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> %.64s %.64s has multiple On switches",
+ tagXMLEle(root), name.ascii(), lp->name.ascii());
+ return (-1);
+ }
+@@ -602,7 +602,7 @@ int INDI_P::buildSwitchesGUI(XMLEle *roo
+
+ if (pg->dp->crackSwitchState (pcdataXMLEle(sep), &(lp->state)) < 0)
+ {
+- sprintf (errmsg, "INDI: <%s> unknown state %s for %s %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> unknown state %.64s for %.64s %.64s %.64s",
+ tagXMLEle(root), valuXMLAtt(ap), name.ascii(), name.ascii(), lp->name.ascii());
+ return (-1);
+ }
+@@ -700,7 +700,7 @@ int INDI_P::buildLightsGUI(XMLEle *root,
+
+ if (pg->dp->crackLightState (pcdataXMLEle(lep), &lp->state) < 0)
+ {
+- sprintf (errmsg, "INDI: <%s> unknown state %s for %s %s %s",
++ snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> unknown state %.64s for %.64s %.64s %.64s",
+ tagXMLEle(root), valuXMLAtt(ap), pg->dp->name.ascii(), name.ascii(), sname.ascii());
+ return (-1);
+ }
+Index: indi/Makefile.am
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/Makefile.am,v
+retrieving revision 1.24
+diff -u -3 -d -p -r1.24 Makefile.am
+--- kstars/kstars/indi/Makefile.am 28 Jun 2004 04:46:46 -0000 1.24
++++ kstars/kstars/indi/Makefile.am 6 Feb 2005 18:38:34 -0000
+@@ -40,7 +40,6 @@ install-exec-hook:
+ $(LN_S) lx200generic $(DESTDIR)$(bindir)/lx200_16
+ rm -f $(DESTDIR)$(bindir)/lx200gps
+ $(LN_S) lx200generic $(DESTDIR)$(bindir)/lx200gps
+- chmod +s $(DESTDIR)$(bindir)/fliccd
+
+ uninstall-local:
+ rm $(DESTDIR)$(bindir)/lx200autostar $(DESTDIR)$(bindir)/lx200_16 $(DESTDIR)$(bindir)/lx200gps
+Index: indi/fitsrw.c
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/fitsrw.c,v
+retrieving revision 1.5
+diff -u -3 -d -p -r1.5 fitsrw.c
+--- kstars/kstars/indi/fitsrw.c 27 May 2004 16:14:52 -0000 1.5
++++ kstars/kstars/indi/fitsrw.c 6 Feb 2005 18:38:35 -0000
+@@ -155,31 +155,31 @@ int fits_ieee64_motorola = 0;
+
+ #define FITS_WRITE_BOOLCARD(fp,key,value) \
+ {char card[81]; \
+- sprintf (card, "%-8.8s= %20s%50s", key, value ? "T" : "F", " "); \
++ snprintf (card, sizeof( card ), "%-8.8s= %20s%50s", key, value ? "T" : "F", " "); \
+ fwrite (card, 1, 80, fp); }
+
+ #define FITS_WRITE_LONGCARD(fp,key,value) \
+ {char card[81]; \
+- sprintf (card, "%-8.8s= %20ld%50s", key, (long)value, " "); \
++ snprintf (card, sizeof( card ), "%-8.8s= %20ld%50s", key, (long)value, " "); \
+ fwrite (card, 1, 80, fp); }
+
+ #define FITS_WRITE_DOUBLECARD(fp,key,value) \
+ {char card[81], dbl[21], *istr; \
+- sprintf (dbl, "%20f", (double)value); istr = strstr (dbl, "e"); \
++ snprintf (dbl, sizeof( dbl ), "%20f", (double)value); istr = strstr (dbl, "e"); \
+ if (istr) *istr = 'E'; \
+- sprintf (card, "%-8.8s= %20.20s%50s", key, dbl, " "); \
++ snprintf (card, sizeof( card ), "%-8.8s= %20.20s%50s", key, dbl, " "); \
+ fwrite (card, 1, 80, fp); }
+
+ #define FITS_WRITE_STRINGCARD(fp,key,value) \
+ {char card[81]; int k;\
+- sprintf (card, "%-8.8s= \'%s", key, value); \
++ snprintf (card, sizeof( card ), "%-8.8s= \'%s", key, value); \
+ for (k = strlen (card); k < 81; k++) card[k] = ' '; \
+ k = strlen (key); if (k < 8) card[19] = '\''; else card[11+k] = '\''; \
+ fwrite (card, 1, 80, fp); }
+
+ #define FITS_WRITE_CARD(fp,value) \
+ {char card[81]; \
+- sprintf (card, "%-80.80s", value); \
++ snprintf (card, sizeof( card ), "%-80.80s", value); \
+ fwrite (card, 1, 80, fp); }
+
+
+@@ -474,7 +474,8 @@ static void fits_drop_error (void)
+ /* #END-PAR */
+ /*****************************************************************************/
+
+-FITS_FILE *fits_open (const char *filename, const char *openmode)
++
++FITS_FILE *fits_open (const char* filename, const char *openmode)
+
+ {int reading, writing, n_rec, n_hdr;
+ long fpos_header, fpos_data;
+@@ -483,8 +484,10 @@ FITS_FILE *fits_open (const char *filena
+ FITS_RECORD_LIST *hdrlist;
+ FITS_HDU_LIST *hdulist, *last_hdulist;
+
+- /* initialize */
++ if ((filename == NULL) || (*filename == '\0') || (openmode == NULL))
++ FITS_RETURN ("fits_open: Invalid parameters", NULL);
+
++ /* initialize */
+ hdulist = NULL;
+ last_hdulist = NULL;
+
+@@ -506,9 +509,6 @@ FITS_FILE *fits_open (const char *filena
+ }
+ }
+
+- if ((filename == NULL) || (*filename == '\0') || (openmode == NULL))
+- FITS_RETURN ("fits_open: Invalid parameters", NULL);
+-
+ reading = (strcmp (openmode, "r") == 0);
+ writing = (strcmp (openmode, "w") == 0);
+ if ((!reading) && (!writing))
+@@ -858,7 +858,7 @@ int fits_write_header (FITS_FILE *ff, FI
+
+ for (r = 0; r < hdulist->naxis; r++)
+ {char naxisn[10];
+- sprintf (naxisn, "NAXIS%d", r+1);
++ snprintf (naxisn, sizeof( naxisn ), "NAXIS%d", r+1);
+ FITS_WRITE_LONGCARD (ff->fp, naxisn, hdulist->naxisn[r]);
+ numcards++;
+ }
+@@ -1025,7 +1025,7 @@ static FITS_HDU_LIST *fits_decode_header
+ for (k = 1; k <= FITS_MAX_AXIS; k++)
+ {char naxisn[9];
+
+- sprintf (naxisn, "NAXIS%-3d", k);
++ snprintf (naxisn, sizeof( naxisn ), "NAXIS%-3d", k);
+ fdat = fits_decode_card (fits_search_card (hdr, naxisn), typ_flong);
+ if (fdat == NULL)
+ {
+@@ -1121,7 +1121,7 @@ static FITS_HDU_LIST *fits_decode_header
+ }
+ else
+ {char msg[160];
+- sprintf (msg, "fits_decode_header: IEEE floating point format required for\
++ snprintf (msg, sizeof( msg ), "fits_decode_header: IEEE floating point format required for\
+ BITPIX=%d\nis not supported on this machine", hdulist->bitpix);
+ fits_set_error (msg);
+ }
+@@ -1130,7 +1130,7 @@ static FITS_HDU_LIST *fits_decode_header
+ return (hdulist);
+
+ err_missing:
+- sprintf (errmsg, "fits_decode_header: missing/invalid %s card", key);
++ snprintf (errmsg, sizeof(errmsg), "fits_decode_header: missing/invalid %.50s card", key);
+
+ err_return:
+ fits_delete_hdulist (hdulist);
+@@ -1429,7 +1429,7 @@ FITS_DATA *fits_decode_card (const char
+
+ if (strncmp (card+8, "= ", 2) != 0)
+ {
+- sprintf (msg, "fits_decode_card (warning): Missing value indicator\
++ snprintf (msg, sizeof( msg ), "fits_decode_card (warning): Missing value indicator\
+ '= ' for %8.8s", l_card);
+ fits_set_error (msg);
+ }
+Index: indi/fli_ccd.c
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/fli_ccd.c,v
+retrieving revision 1.12.2.1
+diff -u -3 -d -p -r1.12.2.1 fli_ccd.c
+--- kstars/kstars/indi/fli_ccd.c 31 Aug 2004 05:56:45 -0000 1.12.2.1
++++ kstars/kstars/indi/fli_ccd.c 6 Feb 2005 18:38:36 -0000
+@@ -51,9 +51,9 @@ void getBasicData(void);
+ void initDataChannel(void);
+ void waitForData(int rp, int wp);
+ void updateDataChannel(void *p);
+-void uploadFile(char * filename);
++void uploadFile(const char* filename);
+ int findPort(void);
+-int writeFITS(char *filename, char errmsg[]);
++int writeFITS(const char* filename, char errmsg[]);
+ int findcam(flidomain_t domain);
+ int setImageArea(char errmsg[]);
+ int manageDefaults(char errmsg[]);
+@@ -419,7 +419,7 @@ void ISNewNumber (const char *dev, const
+ long err;
+ int i;
+ INumber *np;
+- char errmsg[1024];
++ char errmsg[ERRMSG_SIZE];
+
+ /* ignore if not ours */
+ if (dev && strcmp (dev, mydev))
+@@ -556,14 +556,14 @@ void ISNewNumber (const char *dev, const
+
+ if (nset < 4)
+ {
+- IDSetNumber(&FrameNP, "Invalid range. Valid range is (0,0) - (%0.f,%0.f)", FLICam->width, FLICam->height);
+- IDLog("Invalid range. Valid range is (0,0) - (%0.f,%0.f)", FLICam->width, FLICam->height);
++ IDSetNumber(&FrameNP, "Invalid range. Valid range is (0,0) - (%0d,%0d)", FLICam->width, FLICam->height);
++ IDLog("Invalid range. Valid range is (0,0) - (%0d,%0d)", FLICam->width, FLICam->height);
+ return;
+ }
+
+ if (setImageArea(errmsg))
+ {
+- IDSetNumber(&FrameNP, errmsg);
++ IDSetNumber(&FrameNP, "%s", errmsg);
+ return;
+ }
+
+@@ -600,8 +600,8 @@ void ISNewNumber (const char *dev, const
+ {
+ if (values[i] < 1 || values[i] > MAX_X_BIN)
+ {
+- IDSetNumber(&BinningNP, "Error: Valid X bin values are from 1 to %d", MAX_X_BIN);
+- IDLog("Error: Valid X bin values are from 1 to %d", MAX_X_BIN);
++ IDSetNumber(&BinningNP, "Error: Valid X bin values are from 1 to %g", MAX_X_BIN);
++ IDLog("Error: Valid X bin values are from 1 to %g", MAX_X_BIN);
+ return;
+ }
+
+@@ -618,8 +618,8 @@ void ISNewNumber (const char *dev, const
+ {
+ if (values[i] < 1 || values[i] > MAX_Y_BIN)
+ {
+- IDSetNumber(&BinningNP, "Error: Valid Y bin values are from 1 to %d", MAX_Y_BIN);
+- IDLog("Error: Valid X bin values are from 1 to %d", MAX_Y_BIN);
++ IDSetNumber(&BinningNP, "Error: Valid Y bin values are from 1 to %g", MAX_Y_BIN);
++ IDLog("Error: Valid X bin values are from 1 to %g", MAX_Y_BIN);
+ return;
+ }
+
+@@ -637,7 +637,7 @@ void ISNewNumber (const char *dev, const
+ if (setImageArea(errmsg))
+ {
+ IDSetNumber(&BinningNP, errmsg, NULL);
+- IDLog(errmsg);
++ IDLog("%s", errmsg);
+ return;
+ }
+
+@@ -817,8 +817,8 @@ int setImageArea(char errmsg[])
+
+ if ( (err = FLISetImageArea(fli_dev, x_1, y_1, x_2, y_2) ))
+ {
+- sprintf(errmsg, "FLISetImageArea() failed. %s.\n", strerror((int)-err));
+- IDLog(errmsg, NULL);
++ snprintf(errmsg, ERRMSG_SIZE, "FLISetImageArea() failed. %s.\n", strerror((int)-err));
++ IDLog("%s", errmsg);
+ return -1;
+ }
+
+@@ -832,13 +832,13 @@ int grabImage()
+ {
+ long err;
+ int img_size,i, fd;
+- char errmsg[1024];
++ char errmsg[ERRMSG_SIZE];
+ char filename[] = "/tmp/fitsXXXXXX";
+
+ if ((fd = mkstemp(filename)) < 0)
+ {
+- IDMessage(mydev, "Error making temporary filename.", NULL);
+- IDLog("Error making temporary filename.\n", NULL);
++ IDMessage(mydev, "Error making temporary filename.");
++ IDLog("Error making temporary filename.\n");
+ return -1;
+ }
+ close(fd);
+@@ -849,8 +849,8 @@ int grabImage()
+
+ if (FLIImg->img == NULL)
+ {
+- IDMessage(mydev, "Not enough memory to store image.", NULL);
+- IDLog("Not enough memory to store image.\n", NULL);
++ IDMessage(mydev, "Not enough memory to store image.");
++ IDLog("Not enough memory to store image.\n");
+ return -1;
+ }
+
+@@ -880,7 +880,7 @@ int grabImage()
+
+ }
+
+-int writeFITS(char *filename, char errmsg[])
++int writeFITS(const char* filename, char errmsg[])
+ {
+ FITS_FILE* ofp;
+ int i, j, bpp, bpsl, width, height;
+@@ -890,7 +890,7 @@ int writeFITS(char *filename, char errms
+ ofp = fits_open (filename, "w");
+ if (!ofp)
+ {
+- sprintf(errmsg, "Error: cannot open file for writing.");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: cannot open file for writing.");
+ return (-1);
+ }
+
+@@ -903,12 +903,12 @@ int writeFITS(char *filename, char errms
+ hdu = create_fits_header (ofp, width, height, bpp);
+ if (hdu == NULL)
+ {
+- sprintf(errmsg, "Error: creating FITS header failed.");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: creating FITS header failed.");
+ return (-1);
+ }
+ if (fits_write_header (ofp, hdu) < 0)
+ {
+- sprintf(errmsg, "Error: writing to FITS header failed.");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: writing to FITS header failed.");
+ return (-1);
+ }
+
+@@ -932,7 +932,7 @@ int writeFITS(char *filename, char errms
+
+ if (ferror (ofp->fp))
+ {
+- sprintf(errmsg, "Error: write error occured");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: write error occured");
+ return (-1);
+ }
+
+@@ -951,7 +951,7 @@ int writeFITS(char *filename, char errms
+
+ }
+
+-void uploadFile(char * filename)
++void uploadFile(const char* filename)
+ {
+ FILE * fitsFile;
+ char frameSize[FRAME_ILEN];
+@@ -962,7 +962,7 @@ void uploadFile(char * filename)
+
+ if ( -1 == stat (filename, &stat_p))
+ {
+- IDLog(" Error occoured attempting to stat %s\n", filename);
++ IDLog(" Error occoured attempting to stat file.\n");
+ return;
+ }
+
+@@ -1185,7 +1185,7 @@ int manageDefaults(char errmsg[])
+ IDLog("Setting default exposure time of %d ms.\n", exposeTimeMS);
+ if ( (err = FLISetExposureTime(fli_dev, exposeTimeMS) ))
+ {
+- sprintf(errmsg, "FLISetExposureTime() failed. %s.\n", strerror((int)-err));
++ snprintf(errmsg, ERRMSG_SIZE, "FLISetExposureTime() failed. %s.\n", strerror((int)-err));
+ IDLog(errmsg, NULL);
+ return -1;
+ }
+@@ -1193,7 +1193,7 @@ int manageDefaults(char errmsg[])
+ /* Default frame type is NORMAL */
+ if ( (err = FLISetFrameType(fli_dev, FLI_FRAME_TYPE_NORMAL) ))
+ {
+- sprintf(errmsg, "FLISetFrameType() failed. %s.\n", strerror((int)-err));
++ snprintf(errmsg, ERRMSG_SIZE, "FLISetFrameType() failed. %s.\n", strerror((int)-err));
+ IDLog(errmsg, NULL);
+ return -1;
+ }
+@@ -1201,7 +1201,7 @@ int manageDefaults(char errmsg[])
+ /* X horizontal binning */
+ if ( (err = FLISetHBin(fli_dev, BinningN[0].value) ))
+ {
+- sprintf(errmsg, "FLISetBin() failed. %s.\n", strerror((int)-err));
++ snprintf(errmsg, ERRMSG_SIZE, "FLISetBin() failed. %s.\n", strerror((int)-err));
+ IDLog(errmsg, NULL);
+ return -1;
+ }
+@@ -1209,7 +1209,7 @@ int manageDefaults(char errmsg[])
+ /* Y vertical binning */
+ if ( (err = FLISetVBin(fli_dev, BinningN[1].value) ))
+ {
+- sprintf(errmsg, "FLISetVBin() failed. %s.\n", strerror((int)-err));
++ snprintf(errmsg, ERRMSG_SIZE, "FLISetVBin() failed. %s.\n", strerror((int)-err));
+ IDLog(errmsg, NULL);
+ return -1;
+ }
+@@ -1293,7 +1293,7 @@ int checkPowerT(ITextVectorProperty *tp)
+ void connectCCD()
+ {
+ long err;
+- char errmsg[1024];
++ char errmsg[ERRMSG_SIZE];
+
+ IDLog ("In ConnectCCD\n");
+
+@@ -1332,7 +1332,7 @@ void connectCCD()
+ if (manageDefaults(errmsg))
+ {
+ IDMessage(mydev, errmsg, NULL);
+- IDLog(errmsg);
++ IDLog("%s", errmsg);
+ return;
+ }
+
+@@ -1495,7 +1495,7 @@ FITS_HDU_LIST * create_fits_header (FITS
+ fits_add_card (hdulist, temp_s);
+ fits_add_card (hdulist, expose_s);
+ fits_add_card (hdulist, pixel_s);
+- fits_add_card (hdulist, "INSTRUME= 'Finger Lakes Instruments'");
++ fits_add_card (hdulist, ( char* ) "INSTRUME= 'Finger Lakes Instruments'");
+ fits_add_card (hdulist, obsDate);
+
+ return (hdulist);
+@@ -1632,7 +1632,7 @@ int findPort()
+ /* bind to given port for any IP address */
+ memset (&serv_socket, 0, sizeof(serv_socket));
+ serv_socket.sin_family = AF_INET;
+- serv_socket.sin_addr.s_addr = htonl (INADDR_ANY);
++ serv_socket.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+ for (i=0; i < 100; i++)
+ {
+@@ -1675,7 +1675,7 @@ void waitForData(int rp, int wp)
+ /* bind to given port for any IP address */
+ memset (&serv_socket, 0, sizeof(serv_socket));
+ serv_socket.sin_family = AF_INET;
+- serv_socket.sin_addr.s_addr = htonl (INADDR_ANY);
++ serv_socket.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+ serv_socket.sin_port = htons ((unsigned short)DataPort);
+ if (setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0){
+Index: indi/indicom.h
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/indicom.h,v
+retrieving revision 1.8
+diff -u -3 -d -p -r1.8 indicom.h
+--- kstars/kstars/indi/indicom.h 7 Jun 2004 05:59:20 -0000 1.8
++++ kstars/kstars/indi/indicom.h 6 Feb 2005 18:38:36 -0000
+@@ -38,6 +38,7 @@
+
+ #define J2000 2451545.0
+ #define TRACKING_THRESHOLD 0.05 /* 3' for tracking */
++#define ERRMSG_SIZE 1024
+
+ extern const char * Direction[];
+ extern const char * SolarSystem[];
+Index: indi/indidevapi.h
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/indidevapi.h,v
+retrieving revision 1.5
+diff -u -3 -d -p -r1.5 indidevapi.h
+--- kstars/kstars/indi/indidevapi.h 7 Jun 2004 05:59:20 -0000 1.5
++++ kstars/kstars/indi/indidevapi.h 6 Feb 2005 18:38:36 -0000
+@@ -66,25 +66,41 @@ extern "C" {
+ \param t pointer to the vector text property to be defined.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDDefText (const ITextVectorProperty *t, const char *msg, ...);
++extern void IDDefText (const ITextVectorProperty *t, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /** \brief Tell client to create a number number property.
+ \param n pointer to the vector number property to be defined.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDDefNumber (const INumberVectorProperty *n, const char *msg, ...);
++extern void IDDefNumber (const INumberVectorProperty *n, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /** \brief Tell client to create a switch vector property.
+ \param s pointer to the vector switch property to be defined.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDDefSwitch (const ISwitchVectorProperty *s, const char *msg, ...);
++extern void IDDefSwitch (const ISwitchVectorProperty *s, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /** \brief Tell client to create a light vector property.
+ \param l pointer to the vector light property to be defined.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDDefLight (const ILightVectorProperty *l, const char *msg, ...);
++extern void IDDefLight (const ILightVectorProperty *l, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /*@}*/
+
+@@ -97,25 +113,41 @@ extern void IDDefLight (const ILightVect
+ \param t pointer to the vector text property.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDSetText (const ITextVectorProperty *t, const char *msg, ...);
++extern void IDSetText (const ITextVectorProperty *t, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /** \brief Tell client to update an existing number vector property.
+ \param n pointer to the vector number property.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDSetNumber (const INumberVectorProperty *n, const char *msg, ...);
++extern void IDSetNumber (const INumberVectorProperty *n, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /** \brief Tell client to update an existing switch vector property.
+ \param s pointer to the vector switch property.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDSetSwitch (const ISwitchVectorProperty *s, const char *msg, ...);
++extern void IDSetSwitch (const ISwitchVectorProperty *s, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /** \brief Tell client to update an existing light vector property.
+ \param l pointer to the vector light property.
+ \param msg message in printf style to send to the client. May be NULL.
+ */
+-extern void IDSetLight (const ILightVectorProperty *l, const char *msg, ...);
++extern void IDSetLight (const ILightVectorProperty *l, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /*@}*/
+
+@@ -127,7 +159,11 @@ extern void IDSetLight (const ILightVect
+ \param dev device name
+ \param msg message in printf style to send to the client.
+ */
+-extern void IDMessage (const char *dev, const char *msg, ...);
++extern void IDMessage (const char *dev, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 2, 3 ) ) )
++#endif
++;
+
+ /** \brief Function Drivers call to inform Clients a Property is no longer available, or the entire device is gone if name is NULL.
+
+@@ -135,7 +171,11 @@ extern void IDMessage (const char *dev,
+ \param name property name to be deleted.
+ \param msg message in printf style to send to the client.
+ */
+-extern void IDDelete (const char *dev, const char *name, const char *msg, ...);
++extern void IDDelete (const char *dev, const char *name, const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 3, 4 ) ) )
++#endif
++;
+
+ /** \brief Function Drivers call to log a message locally.
+
+@@ -143,7 +183,11 @@ extern void IDDelete (const char *dev, c
+
+ \param msg message in printf style to send to the client.
+ */
+-extern void IDLog (const char *msg, ...);
++extern void IDLog (const char *msg, ...)
++#ifdef __GNUC__
++ __attribute__ ( ( format( printf, 1, 2 ) ) )
++#endif
++;
+
+ /**
+ * \defgroup deventFunctions Functions Drivers call to register with the INDI event utilities.
+@@ -348,5 +392,5 @@ extern void ISNewSwitch (const char *dev
+ #endif
+
+ /* For RCS Only -- Do Not Edit
+- * @(#) $RCSfile: indidevapi.h,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.5 $ $Name: $
++ * @(#) $RCSfile: indidevapi.h,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.5 $ $Name: KDE_3_3_BRANCH $
+ */
+Index: indi/indidrivermain.c
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/indidrivermain.c,v
+retrieving revision 1.8
+diff -u -3 -d -p -r1.8 indidrivermain.c
+--- kstars/kstars/indi/indidrivermain.c 27 May 2004 16:14:52 -0000 1.8
++++ kstars/kstars/indi/indidrivermain.c 6 Feb 2005 18:38:36 -0000
+@@ -45,8 +45,8 @@
+
+ static void usage(void);
+ static void clientMsgCB(int fd, void *arg);
+-static int dispatch (XMLEle *root, char msg[]);
+-static int crackDN (XMLEle *root, char **dev, char **name, char msg[]);
++static int dispatch (XMLEle *root, char errmsg[]);
++static int crackDN (XMLEle *root, char **dev, char **name, char errmsg[]);
+ const char *pstateStr(IPState s);
+ const char *sstateStr(ISState s);
+ const char *ruleStr(ISRule r);
+@@ -60,6 +60,9 @@ static LilXML *clixml; /* XML parser c
+ int
+ main (int ac, char *av[])
+ {
++ setgid( getgid() );
++ setuid( getuid() );
++
+ /* save handy pointer to our base name */
+ for (me = av[0]; av[0][0]; av[0]++)
+ if (av[0][0] == '/')
+@@ -177,6 +180,7 @@ IDDefNumber (const INumberVectorProperty
+ /* tell client to create a new switch vector property */
+ void
+ IDDefSwitch (const ISwitchVectorProperty *s, const char *fmt, ...)
++
+ {
+ int i;
+
+@@ -637,12 +641,12 @@ usage(void)
+ static void
+ clientMsgCB (int fd, void *arg)
+ {
+- char buf[1024], msg[1024], *bp;
++ char buf[1024], errmsg[ERRMSG_SIZE], *bp;
+ int nr;
+ arg=arg;
+
+ /* one read */
+- nr = read (fd, buf, sizeof(buf));
++ nr = read (fd, buf, sizeof(buf)-1);
+ if (nr < 0) {
+ fprintf (stderr, "%s: %s\n", me, strerror(errno));
+ exit(1);
+@@ -651,26 +655,27 @@ clientMsgCB (int fd, void *arg)
+ fprintf (stderr, "%s: EOF\n", me);
+ exit(1);
+ }
++ buf[ sizeof( buf )-1 ] = '\0';
+
+ /* crack and dispatch when complete */
+ for (bp = buf; nr-- > 0; bp++) {
+- XMLEle *root = readXMLEle (clixml, *bp, msg);
++ XMLEle *root = readXMLEle (clixml, *bp, errmsg);
+ if (root) {
+- if (dispatch (root, msg) < 0)
+- fprintf (stderr, "%s dispatch error: %s\n", me, msg);
++ if (dispatch (root, errmsg) < 0)
++ fprintf (stderr, "%s dispatch error: %s\n", me, errmsg);
+ delXMLEle (root);
+- } else if (msg[0])
+- fprintf (stderr, "%s XML error: %s\n", me, msg);
++ } else if (errmsg[0])
++ fprintf (stderr, "%s XML error: %s\n", me, errmsg);
+ }
+ }
+
+ /* crack the given INDI XML element and call driver's IS* entry points as they
+ * are recognized.
+- * return 0 if ok else -1 with reason in msg[].
++ * return 0 if ok else -1 with reason in errmsg[].
+ * N.B. exit if getProperties does not proclaim a compatible version.
+ */
+ static int
+-dispatch (XMLEle *root, char msg[])
++dispatch (XMLEle *root, char errmsg[])
+ {
+ XMLEle *ep;
+ int n;
+@@ -687,7 +692,7 @@ dispatch (XMLEle *root, char msg[])
+ char *dev, *name;
+
+ /* pull out device and name */
+- if (crackDN (root, &dev, &name, msg) < 0)
++ if (crackDN (root, &dev, &name, errmsg) < 0)
+ return (-1);
+
+ /* pull out each name/value pair */
+@@ -729,7 +734,7 @@ printf ("%s\n", valuXMLAtt(na));
+ /*XMLEle *ep;*/
+
+ /* pull out device and name */
+- if (crackDN (root, &dev, &name, msg) < 0)
++ if (crackDN (root, &dev, &name, errmsg) < 0)
+ return (-1);
+
+ /* pull out each name/state pair */
+@@ -775,7 +780,7 @@ printf ("%s\n", valuXMLAtt(na));
+ char *dev, *name;
+
+ /* pull out device and name */
+- if (crackDN (root, &dev, &name, msg) < 0)
++ if (crackDN (root, &dev, &name, errmsg) < 0)
+ return (-1);
+
+ /* pull out each name/text pair */
+@@ -828,28 +833,28 @@ printf ("%s\n", valuXMLAtt(na));
+ return (0);
+ }
+
+- sprintf (msg, "Unknown command: %s", tagXMLEle(root));
++ snprintf (errmsg, ERRMSG_SIZE, "Unknown command: %s", tagXMLEle(root));
+ return(1);
+ }
+
+ /* pull out device and name attributes from root.
+- * return 0 if ok else -1 with reason in msg[].
++ * return 0 if ok else -1 with reason in errmsg[].
+ */
+ static int
+-crackDN (XMLEle *root, char **dev, char **name, char msg[])
++crackDN (XMLEle *root, char **dev, char **name, char errmsg[])
+ {
+ XMLAtt *ap;
+
+ ap = findXMLAtt (root, "device");
+ if (!ap) {
+- sprintf (msg, "%s requires 'device' attribute", tagXMLEle(root));
++ snprintf (errmsg, ERRMSG_SIZE, "%s requires 'device' attribute", tagXMLEle(root));
+ return (-1);
+ }
+ *dev = valuXMLAtt(ap);
+
+ ap = findXMLAtt (root, "name");
+ if (!ap) {
+- sprintf (msg, "%s requires 'name' attribute", tagXMLEle(root));
++ snprintf (errmsg, ERRMSG_SIZE, "%s requires 'name' attribute", tagXMLEle(root));
+ return (-1);
+ }
+ *name = valuXMLAtt(ap);
+Index: indi/indiserver.c
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/indiserver.c,v
+retrieving revision 1.6
+diff -u -3 -d -p -r1.6 indiserver.c
+--- kstars/kstars/indi/indiserver.c 7 Jun 2004 05:59:20 -0000 1.6
++++ kstars/kstars/indi/indiserver.c 6 Feb 2005 18:38:37 -0000
+@@ -288,10 +288,10 @@ indiListen ()
+ exit(1);
+ }
+
+- /* bind to given port for any IP address */
++ /* bind to given port for local IP address */
+ memset (&serv_socket, 0, sizeof(serv_socket));
+ serv_socket.sin_family = AF_INET;
+- serv_socket.sin_addr.s_addr = htonl (INADDR_ANY);
++ serv_socket.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ serv_socket.sin_port = htons ((unsigned short)port);
+ if (setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0){
+ fprintf (stderr, "%s: setsockopt: %s", me, strerror(errno));
+@@ -423,7 +423,7 @@ clientMsg (int cli)
+ int i, nr;
+
+ /* read client */
+- nr = read (cp->s, buf, sizeof(buf));
++ nr = read (cp->s, buf, sizeof(buf)-1);
+ if (nr < 0) {
+ fprintf (stderr, "Client %d: %s\n", cp->s, strerror(errno));
+ closeClient (cli);
+@@ -435,6 +435,7 @@ clientMsg (int cli)
+ closeClient (cli);
+ return;
+ }
++ buf[ sizeof( buf )-1 ] = '\0';
+ if (verbose > 1)
+ fprintf (stderr, "Client %d: rcv from:\n%.*s", cp->s, nr, buf);
+
+@@ -464,7 +465,7 @@ driverMsg (int i)
+ int nr;
+
+ /* read driver */
+- nr = read (dp->rfd, buf, sizeof(buf));
++ nr = read (dp->rfd, buf, sizeof(buf)-1);
+ if (nr < 0) {
+ fprintf (stderr, "Driver %s: %s\n", dp->name, strerror(errno));
+ restartDvr (i);
+@@ -475,6 +476,7 @@ driverMsg (int i)
+ restartDvr (i);
+ return;
+ }
++ buf[ sizeof( buf )-1 ]='\0';
+ if (verbose > 1)
+ fprintf (stderr, "Driver %s: rcv from:\n%.*s", dp->name, nr, buf);
+
+@@ -591,4 +593,4 @@ newClSocket ()
+ }
+
+ /* For RCS Only -- Do Not Edit */
+-static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: indiserver.c,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.6 $ $Name: $"};
++static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: indiserver.c,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.6 $ $Name: KDE_3_3_BRANCH $"};
+Index: indi/lilxml.c
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/lilxml.c,v
+retrieving revision 1.6
+diff -u -3 -d -p -r1.6 lilxml.c
+--- kstars/kstars/indi/lilxml.c 7 Jun 2004 05:59:20 -0000 1.6
++++ kstars/kstars/indi/lilxml.c 6 Feb 2005 18:38:37 -0000
+@@ -32,6 +32,7 @@
+ #include <ctype.h>
+
+ #include "lilxml.h"
++#include "indicom.h"
+
+ static int oneXMLchar (LilXML *lp, int c, char errmsg[]);
+ static void initParser(LilXML *lp);
+@@ -156,7 +157,7 @@ readXMLEle (LilXML *lp, int newc, char e
+
+ /* EOF? */
+ if (newc == 0) {
+- sprintf (errmsg, "Line %d: XML EOF", lp->ln);
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: XML EOF", lp->ln);
+ initParser(lp);
+ return (NULL);
+ }
+@@ -344,7 +345,7 @@ nXMLAtt (XMLEle *ep)
+ /* search ep for an attribute with the given name and return its value.
+ * return "" if not found.
+ */
+-char *
++const char *
+ findXMLAttValu (XMLEle *ep, char *name)
+ {
+ XMLAtt *a = findXMLAtt (ep, name);
+@@ -428,7 +429,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ growString (&lp->ce->tag, c);
+ lp->cs = INTAG;
+ } else if (!isspace(c)) {
+- sprintf (errmsg, "Line %d: Bogus tag char %c", lp->ln, c);
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: Bogus tag char %c", lp->ln, c);
+ return (-1);
+ }
+ break;
+@@ -454,7 +455,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ growString (&lp->ce->at[lp->ce->nat-1]->name, c);
+ lp->cs = INATTRN;
+ } else if (!isspace(c)) {
+- sprintf (errmsg, "Line %d: Bogus leading attr name char: %c",
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: Bogus leading attr name char: %c",
+ lp->ln, c);
+ return (-1);
+ }
+@@ -467,7 +468,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ popXMLEle(lp);
+ lp->cs = LOOK4CON;
+ } else {
+- sprintf (errmsg, "Line %d: Bogus char %c before >", lp->ln, c);
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: Bogus char %c before >", lp->ln, c);
+ return (-1);
+ }
+ break;
+@@ -478,7 +479,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ else if (isspace(c) || c == '=')
+ lp->cs = LOOK4ATTRV;
+ else {
+- sprintf (errmsg, "Line %d: Bogus attr name char: %c", lp->ln,c);
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: Bogus attr name char: %c", lp->ln,c);
+ return (-1);
+ }
+ break;
+@@ -489,7 +490,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ growString (&lp->ce->at[lp->ce->nat-1]->valu, '\0');
+ lp->cs = INATTRV;
+ } else if (!(isspace(c) || c == '=')) {
+- sprintf (errmsg, "Line %d: No value for attribute %s", lp->ln,
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: No value for attribute %.100s", lp->ln,
+ lp->ce->at[lp->ce->nat-1]->name);
+ return (-1);
+ }
+@@ -547,7 +548,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ growString (&lp->endtag, c);
+ lp->cs = INCLOSETAG;
+ } else if (!isspace(c)) {
+- sprintf (errmsg, "Line %d: Bogus preend tag char %c", lp->ln,c);
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: Bogus preend tag char %c", lp->ln,c);
+ return (-1);
+ }
+ break;
+@@ -557,7 +558,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ growString (&lp->endtag, c);
+ else if (c == '>') {
+ if (strcmp (lp->ce->tag, lp->endtag)) {
+- sprintf (errmsg,"Line %d: closing tag %s does not match %s",
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: closing tag %.64s does not match %.64s",
+ lp->ln, lp->endtag, lp->ce->tag);
+ return (-1);
+ } else if (lp->ce->pe) {
+@@ -566,7 +567,7 @@ oneXMLchar (LilXML *lp, int c, char errm
+ } else
+ return (1); /* yes! */
+ } else if (!isspace(c)) {
+- sprintf (errmsg, "Line %d: Bogus end tag char %c", lp->ln, c);
++ snprintf (errmsg, ERRMSG_SIZE, "Line %d: Bogus end tag char %c", lp->ln, c);
+ return (-1);
+ }
+ break;
+@@ -723,7 +724,7 @@ int
+ main (int ac, char *av[])
+ {
+ LilXML *lp = newLilXML();
+- char errmsg[1024];
++ char errmsg[ERRMSG_SIZE];
+ XMLEle *root;
+
+ root = readXMLFile (stdin, lp, errmsg);
+@@ -742,4 +743,4 @@ main (int ac, char *av[])
+ #endif
+
+ /* For RCS Only -- Do Not Edit */
+-static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: lilxml.c,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.6 $ $Name: $"};
++static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: lilxml.c,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.6 $ $Name: KDE_3_3_BRANCH $"};
+Index: indi/lilxml.h
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/lilxml.h,v
+retrieving revision 1.6
+diff -u -3 -d -p -r1.6 lilxml.h
+--- kstars/kstars/indi/lilxml.h 7 Jun 2004 05:59:20 -0000 1.6
++++ kstars/kstars/indi/lilxml.h 6 Feb 2005 18:38:37 -0000
+@@ -189,7 +189,7 @@ extern int nXMLAtt (XMLEle *ep);
+ \param name the name of the XML attribute to retrieve its value.
+ \return the value string of an XML element on success. NULL on failure.
+ */
+-extern char *findXMLAttValu (XMLEle *ep, char *name);
++extern const char *findXMLAttValu (XMLEle *ep, char *name);
+
+ /** \brief Handy wrapper to read one xml file.
+ \param fp pointer to FILE to read.
+@@ -242,7 +242,7 @@ extern void prXMLEle (FILE *fp, XMLEle *
+ */
+
+ /* For RCS Only -- Do Not Edit
+- * @(#) $RCSfile: lilxml.h,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.6 $ $Name: $
++ * @(#) $RCSfile: lilxml.h,v $ $Date: 2004/06/07 05:59:20 $ $Revision: 1.6 $ $Name: KDE_3_3_BRANCH $
+ */
+
+ #endif /* LILXML_H */
+Index: indi/lx200_16.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/lx200_16.cpp,v
+retrieving revision 1.11
+diff -u -3 -d -p -r1.11 lx200_16.cpp
+--- kstars/kstars/indi/lx200_16.cpp 2 Jun 2004 23:42:35 -0000 1.11
++++ kstars/kstars/indi/lx200_16.cpp 6 Feb 2005 18:38:38 -0000
+@@ -224,8 +224,7 @@ void LX200_16::ISNewSwitch (const char *
+ }
+
+ FanStatusSw.s = IPS_OK;
+- strcpy(msg, index == 0 ? "Fan is ON" : "Fan is OFF");
+- IDSetSwitch (&FanStatusSw, msg);
++ IDSetSwitch (&FanStatusSw, index == 0 ? "Fan is ON" : "Fan is OFF");
+ return;
+ }
+
+@@ -240,7 +239,7 @@ void LX200_16::ISNewSwitch (const char *
+
+ index == 0 ? seekHomeAndSave() : seekHomeAndSet();
+ HomeSearchSw.s = IPS_BUSY;
+- IDSetSwitch (&HomeSearchSw, msg);
++ IDSetSwitch (&HomeSearchSw, index == 0 ? "Seek Home and Save" : "Seek Home and Set");
+ return;
+ }
+
+@@ -255,8 +254,7 @@ void LX200_16::ISNewSwitch (const char *
+
+ index == 0 ? seekHomeAndSave() : seekHomeAndSet();
+ FieldDeRotatorSw.s = IPS_OK;
+- strcpy(msg, index == 0 ? "Field deRotator is ON" : "Field deRotator is OFF");
+- IDSetSwitch (&FieldDeRotatorSw, msg);
++ IDSetSwitch (&FieldDeRotatorSw, index == 0 ? "Field deRotator is ON" : "Field deRotator is OFF");
+ return;
+ }
+
+Index: indi/lx200driver.c
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/lx200driver.c,v
+retrieving revision 1.18
+diff -u -3 -d -p -r1.18 lx200driver.c
+--- kstars/kstars/indi/lx200driver.c 27 May 2004 16:14:52 -0000 1.18
++++ kstars/kstars/indi/lx200driver.c 6 Feb 2005 18:38:38 -0000
+@@ -584,7 +584,7 @@ int setCommandInt(int data, const char *
+
+ char tempString[16];
+
+- sprintf(tempString, "%s%d#", cmd, data);
++ snprintf(tempString, sizeof( tempString ), "%s%d#", cmd, data);
+
+ if (portWrite(tempString) < 0)
+ return -1;
+@@ -596,7 +596,7 @@ int setMinElevationLimit(int min)
+ {
+ char tempString[16];
+
+- sprintf(tempString, "#:Sh%02d#", min);
++ snprintf(tempString, sizeof( tempString ), "#:Sh%02d#", min);
+
+ return (setStandardProcedure(tempString));
+ }
+@@ -605,7 +605,7 @@ int setMaxElevationLimit(int max)
+ {
+ char tempString[16];
+
+- sprintf(tempString, "#:So%02d*#", max);
++ snprintf(tempString, sizeof( tempString ), "#:So%02d*#", max);
+
+ return (setStandardProcedure(tempString));
+
+@@ -619,7 +619,7 @@ int setMaxSlewRate(int slewRate)
+ if (slewRate < 2 || slewRate > 8)
+ return -1;
+
+- sprintf(tempString, "#:Sw%d#", slewRate);
++ snprintf(tempString, sizeof( tempString ), "#:Sw%d#", slewRate);
+
+ return (setStandardProcedure(tempString));
+
+@@ -634,7 +634,7 @@ int setObjectRA(double ra)
+
+ getSexComponents(ra, &h, &m, &s);
+
+- sprintf(tempString, "#:Sr %02d:%02d:%02d#", h, m, s);
++ snprintf(tempString, sizeof( tempString ), "#:Sr %02d:%02d:%02d#", h, m, s);
+ IDLog("Set Object RA String %s\n", tempString);
+ return (setStandardProcedure(tempString));
+ }
+@@ -649,9 +649,9 @@ int setObjectDEC(double dec)
+
+ /* case with negative zero */
+ if (!d && dec < 0)
+- sprintf(tempString, "#:Sd -%02d:%02d:%02d#", d, m, s);
++ snprintf(tempString, sizeof( tempString ), "#:Sd -%02d:%02d:%02d#", d, m, s);
+ else
+- sprintf(tempString, "#:Sd %+03d:%02d:%02d#", d, m, s);
++ snprintf(tempString, sizeof( tempString ), "#:Sd %+03d:%02d:%02d#", d, m, s);
+
+ IDLog("Set Object DEC String %s\n", tempString);
+
+@@ -663,7 +663,7 @@ int setCommandXYZ(int x, int y, int z, c
+ {
+ char tempString[16];
+
+- sprintf(tempString, "%s %02d:%02d:%02d#", cmd, x, y, z);
++ snprintf(tempString, sizeof( tempString ), "%s %02d:%02d:%02d#", cmd, x, y, z);
+
+ return (setStandardProcedure(tempString));
+ }
+@@ -698,7 +698,7 @@ int setCalenderDate(int dd, int mm, int
+ char boolRet[2];
+ yy = yy % 100;
+
+- sprintf(tempString, "#:SC %02d/%02d/%02d#", mm, dd, yy);
++ snprintf(tempString, sizeof( tempString ), "#:SC %02d/%02d/%02d#", mm, dd, yy);
+
+ if (portWrite(tempString) < 0)
+ return -1;
+@@ -725,7 +725,7 @@ int setUTCOffset(double hours)
+ char tempString[16];
+
+ /*TODO add fractions*/
+- sprintf(tempString, "#:SG %+03d#", (int) hours);
++ snprintf(tempString, sizeof( tempString ), "#:SG %+03d#", (int) hours);
+
+ fprintf(stderr, "UTC string is %s\n", tempString);
+
+@@ -740,7 +740,7 @@ int setSiteLongitude(double Long)
+
+ getSexComponents(Long, &d, &m, &s);
+
+- sprintf(tempString, "#:Sg%03d:%02d#", d, m);
++ snprintf(tempString, sizeof( tempString ), "#:Sg%03d:%02d#", d, m);
+
+ return (setStandardProcedure(tempString));
+ }
+@@ -752,7 +752,7 @@ int setSiteLatitude(double Lat)
+
+ getSexComponents(Lat, &d, &m, &s);
+
+- sprintf(tempString, "#:St%+03d:%02d:%02d#", d, m, s);
++ snprintf(tempString, sizeof( tempString ), "#:St%+03d:%02d:%02d#", d, m, s);
+
+ return (setStandardProcedure(tempString));
+ }
+@@ -764,7 +764,7 @@ int setObjAz(double az)
+
+ getSexComponents(az, &d, &m, &s);
+
+- sprintf(tempString, "#:Sz%03d:%02d#", d, m);
++ snprintf(tempString, sizeof( tempString ), "#:Sz%03d:%02d#", d, m);
+
+ return (setStandardProcedure(tempString));
+
+@@ -777,7 +777,7 @@ int setObjAlt(double alt)
+
+ getSexComponents(alt, &d, &m, &s);
+
+- sprintf(tempString, "#:Sa%+02d*%02d#", d, m);
++ snprintf(tempString, sizeof( tempString ), "#:Sa%+02d*%02d#", d, m);
+
+ return (setStandardProcedure(tempString));
+ }
+@@ -791,16 +791,16 @@ int setSiteName(char * siteName, int sit
+ switch (siteNum)
+ {
+ case 1:
+- sprintf(tempString, "#:SM %s#", siteName);
++ snprintf(tempString, sizeof( tempString ), "#:SM %s#", siteName);
+ break;
+ case 2:
+- sprintf(tempString, "#:SN %s#", siteName);
++ snprintf(tempString, sizeof( tempString ), "#:SN %s#", siteName);
+ break;
+ case 3:
+- sprintf(tempString, "#:SO %s#", siteName);
++ snprintf(tempString, sizeof( tempString ), "#:SO %s#", siteName);
+ break;
+ case 4:
+- sprintf(tempString, "#:SP %s#", siteName);
++ snprintf(tempString, sizeof( tempString ), "#:SP %s#", siteName);
+ break;
+ default:
+ return -1;
+@@ -883,7 +883,7 @@ int setTrackFreq(double trackF)
+ {
+ char tempString[16];
+
+- sprintf(tempString, "#:ST %04.1f#", trackF);
++ snprintf(tempString, sizeof( tempString ), "#:ST %04.1f#", trackF);
+
+ return (setStandardProcedure(tempString));
+
+@@ -1044,13 +1044,13 @@ int selectCatalogObject(int catalog, int
+ switch (catalog)
+ {
+ case LX200_STAR_C:
+- sprintf(tempString, "#:LS%d#", NNNN);
++ snprintf(tempString, sizeof( tempString ), "#:LS%d#", NNNN);
+ break;
+ case LX200_DEEPSKY_C:
+- sprintf(tempString, "#:LC%d#", NNNN);
++ snprintf(tempString, sizeof( tempString ), "#:LC%d#", NNNN);
+ break;
+ case LX200_MESSIER_C:
+- sprintf(tempString, "#:LM%d#", NNNN);
++ snprintf(tempString, sizeof( tempString ), "#:LM%d#", NNNN);
+ break;
+ default:
+ return -1;
+@@ -1068,10 +1068,10 @@ int selectSubCatalog(int catalog, int su
+ switch (catalog)
+ {
+ case LX200_STAR_C:
+- sprintf(tempString, "#:LsD%d#", subCatalog);
++ snprintf(tempString, sizeof( tempString ), "#:LsD%d#", subCatalog);
+ break;
+ case LX200_DEEPSKY_C:
+- sprintf(tempString, "#:LoD%d#", subCatalog);
++ snprintf(tempString, sizeof( tempString ), "#:LoD%d#", subCatalog);
+ break;
+ case LX200_MESSIER_C:
+ return 1;
+Index: indi/lx200generic.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/lx200generic.cpp,v
+retrieving revision 1.33.2.1
+diff -u -3 -d -p -r1.33.2.1 lx200generic.cpp
+--- kstars/kstars/indi/lx200generic.cpp 11 Sep 2004 21:42:04 -0000 1.33.2.1
++++ kstars/kstars/indi/lx200generic.cpp 6 Feb 2005 18:38:39 -0000
+@@ -620,13 +620,13 @@ void LX200Generic::ISNewNumber (const ch
+ setSiteLatitude(newLat);
+ geoNum.np[0].value = newLat;
+ geoNum.np[1].value = newLong;
+- sprintf (msg, "Site location updated to Lat %s - Long %s", l, L);
++ snprintf (msg, sizeof(msg), "Site location updated to Lat %.32s - Long %.32s", l, L);
+ } else
+ {
+ geoNum.s = IPS_IDLE;
+- sprintf (msg, "Lat or Long missing or invalid");
++ strcpy(msg, "Lat or Long missing or invalid");
+ }
+- IDSetNumber (&geoNum, msg);
++ IDSetNumber (&geoNum, "%s", msg);
+ return;
+ }
+
+Index: indi/lx200gps.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/lx200gps.cpp,v
+retrieving revision 1.10.2.1
+diff -u -3 -d -p -r1.10.2.1 lx200gps.cpp
+--- kstars/kstars/indi/lx200gps.cpp 11 Sep 2004 21:42:04 -0000 1.10.2.1
++++ kstars/kstars/indi/lx200gps.cpp 6 Feb 2005 18:38:39 -0000
+@@ -133,8 +133,7 @@ void LX200GPS::ISNewNumber (const char *
+ index = getOnSwitch(&GPSPowerSw);
+ index == 0 ? turnGPSOn() : turnGPSOff();
+ GPSPowerSw.s = IPS_OK;
+- strcpy(msg, index == 0 ? "GPS System is ON" : "GPS System is OFF");
+- IDSetSwitch (&GPSPowerSw, msg);
++ IDSetSwitch (&GPSPowerSw, index == 0 ? "GPS System is ON" : "GPS System is OFF" );
+ return;
+ }
+
+@@ -164,7 +163,7 @@ void LX200GPS::ISNewNumber (const char *
+ }
+
+ GPSStatusSw.s = IPS_OK;
+- IDSetSwitch (&GPSStatusSw, msg);
++ IDSetSwitch (&GPSStatusSw, "%s", msg);
+ return;
+
+ }
+@@ -207,7 +206,7 @@ void LX200GPS::ISNewNumber (const char *
+ }
+
+ AltDecPecSw.s = IPS_OK;
+- IDSetSwitch(&AltDecPecSw, msg);
++ IDSetSwitch(&AltDecPecSw, "%s", msg);
+
+ return;
+ }
+@@ -233,7 +232,7 @@ void LX200GPS::ISNewNumber (const char *
+ }
+
+ AzRaPecSw.s = IPS_OK;
+- IDSetSwitch(&AzRaPecSw, msg);
++ IDSetSwitch(&AzRaPecSw, "%s", msg);
+
+ return;
+ }
+Index: indi/mount_simulation.c
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/mount_simulation.c,v
+retrieving revision 1.1
+diff -u -3 -d -p -r1.1 mount_simulation.c
+--- kstars/kstars/indi/mount_simulation.c 21 Jan 2004 18:21:01 -0000 1.1
++++ kstars/kstars/indi/mount_simulation.c 6 Feb 2005 18:38:39 -0000
+@@ -140,10 +140,10 @@ char *names[], int n)
+ targetDEC = newdec;
+ fs_sexa (r, targetRA, 2, 3600);
+ fs_sexa (d, targetDEC, 3, 3600);
+- sprintf (msg, "Moving to RA Dec %s %s", r, d);
++ snprintf (msg, sizeof(msg), "Moving to RA Dec %.32s %.32s", r, d);
+ } else {
+ eqNum.s = IPS_IDLE;
+- sprintf (msg, "RA or Dec absent or bogus");
++ snprintf (msg, sizeof(msg), "RA or Dec absent or bogus");
+ }
+ sendeq (msg);
+ return;
+Index: indi/v4ldriver.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/v4ldriver.cpp,v
+retrieving revision 1.10.2.1
+diff -u -3 -d -p -r1.10.2.1 v4ldriver.cpp
+--- kstars/kstars/indi/v4ldriver.cpp 31 Aug 2004 05:56:45 -0000 1.10.2.1
++++ kstars/kstars/indi/v4ldriver.cpp 6 Feb 2005 18:38:40 -0000
+@@ -51,8 +51,8 @@ void waitForData(int rp, int wp);
+ void updateDataChannel(void *p);
+ void updateStream(void * p);
+ void getBasicData(void);
+-void uploadFile(char * filename);
+-int writeFITS(char *filename, char errmsg[]);
++void uploadFile(const char * filename);
++int writeFITS(const char *filename, char errmsg[]);
+ int grabImage(void);
+ int checkPowerN(INumberVectorProperty *np);
+ int checkPowerS(ISwitchVectorProperty *sp);
+@@ -461,14 +461,14 @@ void ISNewNumber (const char *dev, const
+ int grabImage()
+ {
+ int err, fd;
+- char errmsg[1024];
++ char errmsg[ERRMSG_SIZE];
+ char filename[] = "/tmp/fitsXXXXXX";
+
+
+ if ((fd = mkstemp(filename)) < 0)
+ {
+- IDMessage(mydev, "Error making temporary filename.", NULL);
+- IDLog("Error making temporary filename.\n", NULL);
++ IDMessage(mydev, "Error making temporary filename.");
++ IDLog("Error making temporary filename.\n");
+ return -1;
+ }
+ close(fd);
+@@ -483,7 +483,7 @@ int grabImage()
+ return 0;
+ }
+
+-int writeFITS(char * filename, char errmsg[])
++int writeFITS(const char * filename, char errmsg[])
+ {
+ FITS_FILE* ofp;
+ int i, bpp, bpsl, width, height;
+@@ -495,7 +495,7 @@ int writeFITS(char * filename, char errm
+ ofp = fits_open (filename, "w");
+ if (!ofp)
+ {
+- sprintf(errmsg, "Error: cannot open file for writing.");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: cannot open file for writing.");
+ return (-1);
+ }
+
+@@ -508,12 +508,12 @@ int writeFITS(char * filename, char errm
+ hdu = create_fits_header (ofp, width, height, bpp);
+ if (hdu == NULL)
+ {
+- sprintf(errmsg, "Error: creating FITS header failed.");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: creating FITS header failed.");
+ return (-1);
+ }
+ if (fits_write_header (ofp, hdu) < 0)
+ {
+- sprintf(errmsg, "Error: writing to FITS header failed.");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: writing to FITS header failed.");
+ return (-1);
+ }
+
+@@ -532,7 +532,7 @@ int writeFITS(char * filename, char errm
+
+ if (ferror (ofp->fp))
+ {
+- sprintf(errmsg, "Error: write error occured");
++ snprintf(errmsg, ERRMSG_SIZE, "Error: write error occured");
+ return (-1);
+ }
+
+@@ -730,7 +730,7 @@ FITS_HDU_LIST * create_fits_header (FITS
+ hdulist->used.bscale = 1;
+ hdulist->bscale = 1.0;
+
+- sprintf(expose_s, "EXPOSURE= %d / milliseconds", V4LFrame->expose);
++ snprintf(expose_s, sizeof(expose_s), "EXPOSURE= %d / milliseconds", V4LFrame->expose);
+
+ fits_add_card (hdulist, expose_s);
+ fits_add_card (hdulist, instrumentName);
+@@ -813,7 +813,7 @@ void updateStream(void *p)
+
+ }
+
+-void uploadFile(char * filename)
++void uploadFile(const char * filename)
+ {
+ FILE * fitsFile;
+ char frameSize[FRAME_ILEN];
+Index: indi/v4lphilips.cpp
+===================================================================
+RCS file: /home/kde/kdeedu/kstars/kstars/indi/v4lphilips.cpp,v
+retrieving revision 1.9.2.1
+diff -u -3 -d -p -r1.9.2.1 v4lphilips.cpp
+--- kstars/kstars/indi/v4lphilips.cpp 31 Aug 2004 05:56:45 -0000 1.9.2.1
++++ kstars/kstars/indi/v4lphilips.cpp 6 Feb 2005 18:38:40 -0000
+@@ -52,8 +52,8 @@ void waitForData(int rp, int wp);
+ void updateDataChannel(void *p);
+ void updateStream(void * p);
+ void getBasicData(void);
+-void uploadFile(char * filename);
+-int writeFITS(char *filename, char errmsg[]);
++void uploadFile(const char* filename);
++int writeFITS(const char* filename, char errmsg[]);
+ int grabImage(void);
+ int checkPowerN(INumberVectorProperty *np);
+ int checkPowerS(ISwitchVectorProperty *sp);
+@@ -286,7 +286,7 @@ void ISGetProperties (const char *dev)
+
+ void ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
+ {
+- char errmsg[1024];
++ char errmsg[ERRMSG_SIZE];
+ int index=0;
+
+ /* ignore if not ours */
+@@ -364,7 +364,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ AntiFlickerS[0].s = ISS_OFF;
+ AntiFlickerS[1].s = ISS_ON;
+- IDSetSwitch(&AntiFlickerSP, errmsg);
++ IDSetSwitch(&AntiFlickerSP, "%s", errmsg);
+ return;
+ }
+
+@@ -377,7 +377,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ AntiFlickerS[0].s = ISS_ON;
+ AntiFlickerS[1].s = ISS_OFF;
+- IDSetSwitch(&AntiFlickerSP, errmsg);
++ IDSetSwitch(&AntiFlickerSP, "%s", errmsg);
+ return;
+ }
+
+@@ -403,7 +403,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ BackLightS[0].s = ISS_OFF;
+ BackLightS[1].s = ISS_ON;
+- IDSetSwitch(&BackLightSP, errmsg);
++ IDSetSwitch(&BackLightSP, "%s", errmsg);
+ return;
+ }
+
+@@ -416,7 +416,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ BackLightS[0].s = ISS_ON;
+ BackLightS[1].s = ISS_OFF;
+- IDSetSwitch(&BackLightSP, errmsg);
++ IDSetSwitch(&BackLightSP, "%s", errmsg);
+ return;
+ }
+
+@@ -447,7 +447,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ IUResetSwitches(&NoiseReductionSP);
+ NoiseReductionS[0].s = ISS_ON;
+- IDSetSwitch(&NoiseReductionSP, errmsg);
++ IDSetSwitch(&NoiseReductionSP, "%s", errmsg);
+ return;
+ }
+
+@@ -482,7 +482,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ IUResetSwitches(&WhiteBalanceModeSP),
+ WhiteBalanceModeS[0].s = ISS_ON;
+- IDSetSwitch(&WhiteBalanceModeSP, errmsg);
++ IDSetSwitch(&WhiteBalanceModeSP, "%s", errmsg);
+ return;
+ }
+ break;
+@@ -493,7 +493,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ IUResetSwitches(&WhiteBalanceModeSP),
+ WhiteBalanceModeS[0].s = ISS_ON;
+- IDSetSwitch(&WhiteBalanceModeSP, errmsg);
++ IDSetSwitch(&WhiteBalanceModeSP, "%s", errmsg);
+ return;
+ }
+ break;
+@@ -504,7 +504,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ IUResetSwitches(&WhiteBalanceModeSP),
+ WhiteBalanceModeS[0].s = ISS_ON;
+- IDSetSwitch(&WhiteBalanceModeSP, errmsg);
++ IDSetSwitch(&WhiteBalanceModeSP, "%s", errmsg);
+ return;
+ }
+ break;
+@@ -515,7 +515,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ IUResetSwitches(&WhiteBalanceModeSP),
+ WhiteBalanceModeS[0].s = ISS_ON;
+- IDSetSwitch(&WhiteBalanceModeSP, errmsg);
++ IDSetSwitch(&WhiteBalanceModeSP, "%s", errmsg);
+ return;
+ }
+ break;
+@@ -526,7 +526,7 @@ void ISNewSwitch (const char *dev, const
+ {
+ IUResetSwitches(&WhiteBalanceModeSP),
+ WhiteBalanceModeS[0].s = ISS_ON;
+- IDSetSwitch(&WhiteBalanceModeSP, errmsg);
++ IDSetSwitch(&WhiteBalanceModeSP, "%s", errmsg);
+ return;
+ }
+ break;
+@@ -555,7 +555,7 @@ void ISNewSwitch (const char *dev, const
+ if (saveSettings(errmsg) < 0)
+ {
+ IUResetSwitches(&CamSettingSP);
+- IDSetSwitch(&CamSettingSP, errmsg);
++ IDSetSwitch(&CamSettingSP, "%s", errmsg);
+ return;
+ }
+
+@@ -616,8 +616,7 @@ void ISNewText (const char *dev, const c
+
+ void ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n)
+ {
+-
+- char errmsg[1024];
++ char errmsg[ERRMSG_SIZE];
+
+ /* ignore if not ours */
+ if (dev && strcmp (dev, mydev))
+@@ -672,7 +671,7 @@ void ISNewNumber (const char *dev, const
+ if (setFrameRate( (int) FrameRateN[0].value, errmsg) < 0)
+ {
+ FrameRateN[0].value = oldFP;
+- IDSetNumber(&FrameRateNP, errmsg);
++ IDSetNumber(&FrameRateNP, "%s", errmsg);
+ return;
+ }
+
+@@ -727,7 +726,7 @@ void ISNewNumber (const char *dev, const
+ for (int i=0; i < 6; i++)
+ ImageAdjustN[i].value = oldImgPar[i];
+
+- IDSetNumber(&ImageAdjustNP, errmsg);
++ IDSetNumber(&ImageAdjustNP, "%s", errmsg);
+ return;
+ }
+ else
+@@ -745,7 +744,7 @@ void ISNewNumber (const char *dev, const
+ for (int i=0; i < 6; i++)
+ ImageAdjustN[i].value = oldImgPar[i];
+
+- IDSetNumber(&ImageAdjustNP, errmsg);
++ IDSetNumber(&ImageAdjustNP, "%s", errmsg);
+ return;
+ }
+ else
+@@ -775,7 +774,7 @@ void ISNewNumber (const char *dev, const
+
+ if (setExposure( (int) values[0], errmsg) < 0)
+ {
+- IDSetNumber(&ShutterSpeedNP, errmsg);
++ IDSetNumber(&ShutterSpeedNP, "%s", errmsg);
+ return;
+ }
+
+@@ -803,14 +802,14 @@ void ISNewNumber (const char *dev, const
+ {
+ WhiteBalanceN[0].value = oldBalance[0];
+ WhiteBalanceN[1].value = oldBalance[1];
+- IDSetNumber(&WhiteBalanceNP, errmsg);
++ IDSetNumber(&WhiteBalanceNP, "%s", errmsg);
+ return;
+ }
+ if (setWhiteBalanceBlue( (int) WhiteBalanceN[1].value * 256, errmsg))
+ {
+ WhiteBalanceN[0].value = oldBalance[0];
+ WhiteBalanceN[1].value = oldBalance[1];
+- IDSetNumber(&WhiteBalanceNP, errmsg);
++ IDSetNumber(&WhiteBalanceNP, "%s", errmsg);
+ return;
+ }
+
+@@ -865,8 +864,8 @@ int grabImage()
+
+ if ((fd = mkstemp(filename)) < 0)
+ {
+- IDMessage(mydev, "Error making temporary filename.", NULL);
+- IDLog("Error making temporary filename.\n", NULL);
++ IDMessage(mydev, "Error making temporary filename.");
++ IDLog("Error making temporary filename.\n");
+ return -1;
+ }
+ close(fd);
+@@ -881,19 +880,17 @@ int grabImage()
+ return 0;
+ }
+
+-int writeFITS(char * filename, char errmsg[])
++int writeFITS(const char* filename, char errmsg[])
+ {
+ FITS_FILE* ofp;
+ int i, bpp, bpsl, width, height;
+ long nbytes;
+ FITS_HDU_LIST *hdu;
+
+- IDLog("in writeFITS with filename %s\n", filename);
+-
+ ofp = fits_open (filename, "w");
+ if (!ofp)
+ {
+- sprintf(errmsg, "Error: cannot open file for writing.");
++ strcpy(errmsg, "Error: cannot open file for writing.");
+ return (-1);
+ }
+
+@@ -906,12 +903,12 @@ int writeFITS(char * filename, char errm
+ hdu = create_fits_header (ofp, width, height, bpp);
+ if (hdu == NULL)
+ {
+- sprintf(errmsg, "Error: creating FITS header failed.");
++ strcpy(errmsg, "Error: creating FITS header failed.");
+ return (-1);
+ }
+ if (fits_write_header (ofp, hdu) < 0)
+ {
+- sprintf(errmsg, "Error: writing to FITS header failed.");
++ strcpy(errmsg, "Error: writing to FITS header failed.");
+ return (-1);
+ }
+
+@@ -930,7 +927,7 @@ int writeFITS(char * filename, char errm
+
+ if (ferror (ofp->fp))
+ {
+- sprintf(errmsg, "Error: write error occured");
++ strcpy(errmsg, "Error: write error occured");
+ return (-1);
+ }
+
+@@ -997,7 +994,7 @@ void getBasicData()
+ if (setFrameRate( (int) FrameRateN[0].value, errmsg) < 0)
+ {
+ FrameRateNP.s = IPS_ALERT;
+- IDSetNumber(&FrameRateNP, errmsg);
++ IDSetNumber(&FrameRateNP, "%s", errmsg);
+ }
+ else
+ {
+@@ -1295,7 +1292,7 @@ void updateStream(void *p)
+ // IDLog("Leaving update stream\n");
+ }
+
+-void uploadFile(char * filename)
++void uploadFile(const char* filename)
+ {
+ FILE * fitsFile;
+ char frameSize[FRAME_ILEN];
diff --git a/misc/kdeedu3/files/patch-kstars_kstars_indi_Makefile.in b/misc/kdeedu3/files/patch-kstars_kstars_indi_Makefile.in
new file mode 100644
index 000000000000..f6947ade383b
--- /dev/null
+++ b/misc/kdeedu3/files/patch-kstars_kstars_indi_Makefile.in
@@ -0,0 +1,10 @@
+--- kstars/kstars/indi/Makefile.in.orig Tue Feb 8 01:38:36 2005
++++ kstars/kstars/indi/Makefile.in Tue Feb 8 01:38:55 2005
+@@ -962,7 +962,6 @@
+ $(LN_S) lx200generic $(DESTDIR)$(bindir)/lx200_16
+ rm -f $(DESTDIR)$(bindir)/lx200gps
+ $(LN_S) lx200generic $(DESTDIR)$(bindir)/lx200gps
+- chmod +s $(DESTDIR)$(bindir)/fliccd
+
+ uninstall-local:
+ rm $(DESTDIR)$(bindir)/lx200autostar $(DESTDIR)$(bindir)/lx200_16 $(DESTDIR)$(bindir)/lx200gps