summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@sun.com>2007-08-07 15:38:23 -0700
committerAlan Coopersmith <alan.coopersmith@sun.com>2007-08-07 15:38:23 -0700
commit77d50c0bf824f847bd9ede30c21618845258de76 (patch)
tree155bcd99daad5f77a1e45c37f064344a01d80f8f
parent118bd50a9bbc10cab7846fb6ac1a0d25ba4c3422 (diff)
Replace sprintf's with snprintf & strlcat
-rw-r--r--configure.ac2
-rw-r--r--xwininfo.c135
2 files changed, 83 insertions, 54 deletions
diff --git a/configure.ac b/configure.ac
index 9a8cdfe..8d69f83 100644
--- a/configure.ac
+++ b/configure.ac
@@ -31,6 +31,8 @@ AM_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_PROG_INSTALL
+AC_CHECK_FUNCS([strlcat])
+
# Checks for pkg-config packages
PKG_CHECK_MODULES(XWININFO, xmuu xext x11)
AC_SUBST(XWININFO_CFLAGS)
diff --git a/xwininfo.c b/xwininfo.c
index b21b2fb..dc3c6f8 100644
--- a/xwininfo.c
+++ b/xwininfo.c
@@ -45,6 +45,7 @@ of the copyright holder.
* 16-Jun-87
*/
+#include "config.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
@@ -66,7 +67,7 @@ typedef struct {
} binding;
void scale_init(void);
-char *nscale(int, int, int, char *);
+char *nscale(int, int, int, char *, size_t);
char *xscale(int);
char *yscale(int);
char *bscale(int);
@@ -88,6 +89,23 @@ void Display_WM_Info(Window);
static char *window_id_format = "0x%lx";
+#ifndef HAVE_STRLCAT
+static size_t strlcat(char *dst, const char *src, size_t dstsize)
+{
+ size_t sd = strlen(dst);
+ size_t ss = strlen(src);
+ size_t s = sd + ss;
+
+ if (s < dstsize) {
+ strcpy(dst + sd, src);
+ } else {
+ strncpy(dst + sd, src, dstsize-sd-1);
+ dst[dstsize] = '\0';
+ }
+ return s;
+}
+#endif
+
/*
* Report the syntax for calling xwininfo:
*/
@@ -172,56 +190,64 @@ scale_init(void)
#define FOOT (12)
char *
-nscale(int n, int np, int nmm, char *nbuf)
+nscale(int n, int np, int nmm, char *nbuf, size_t nbufsize)
{
- sprintf(nbuf, "%d", n);
- if(metric||english) {
- sprintf(nbuf+strlen(nbuf), " (");
- }
- if(metric) {
- sprintf(nbuf+strlen(nbuf),"%.2f mm%s", ((double) n)*nmm/np, english?"; ":"");
- }
- if(english) {
- double inch_frac;
- Bool printed_anything = False;
- int mi, yar, ft, inr;
-
- inch_frac = ((double) n)*(nmm/25.4)/np;
- inr = (int)inch_frac;
- inch_frac -= (double)inr;
- if(inr>=MILE) {
- mi = inr/MILE;
- inr %= MILE;
- sprintf(nbuf+strlen(nbuf), "%d %s(?!?)",
- mi, (mi==1)?"mile":"miles");
- printed_anything = True;
- }
- if(inr>=YARD) {
- yar = inr/YARD;
- inr %= YARD;
- if (printed_anything)
- sprintf(nbuf+strlen(nbuf), ", ");
- sprintf(nbuf+strlen(nbuf), "%d %s",
- yar, (yar==1)?"yard":"yards");
- printed_anything = True;
- }
- if(inr>=FOOT) {
- ft = inr/FOOT;
- inr %= FOOT;
- if (printed_anything)
- sprintf(nbuf+strlen(nbuf), ", ");
- sprintf(nbuf+strlen(nbuf), "%d %s",
- ft, (ft==1)?"foot":"feet");
- printed_anything = True;
- }
- if (!printed_anything || inch_frac != 0.0 || inr != 0) {
- if (printed_anything)
- sprintf(nbuf+strlen(nbuf), ", ");
- sprintf(nbuf+strlen(nbuf), "%.2f inches", inr+inch_frac);
+ int s;
+ snprintf(nbuf, nbufsize, "%d", n);
+
+ if (metric||english) {
+ s = strlcat(nbuf, " (", nbufsize);
+
+ if (metric) {
+ snprintf(nbuf+s, nbufsize-s, "%.2f mm%s",
+ ((double) n)*nmm/np, english ? "; " : "");
+ }
+ if (english) {
+ double inch_frac;
+ Bool printed_anything = False;
+ int mi, yar, ft, inr;
+
+ inch_frac = ((double) n)*(nmm/25.4)/np;
+ inr = (int)inch_frac;
+ inch_frac -= (double)inr;
+ if (inr >= MILE) {
+ mi = inr/MILE;
+ inr %= MILE;
+ s = strlen(nbuf);
+ snprintf(nbuf+s, nbufsize-s, "%d %s(?!?)",
+ mi, (mi==1) ? "mile" : "miles");
+ printed_anything = True;
+ }
+ if (inr >= YARD) {
+ yar = inr/YARD;
+ inr %= YARD;
+ if (printed_anything)
+ strlcat(nbuf, ", ", nbufsize);
+ s = strlen(nbuf);
+ snprintf(nbuf+s, nbufsize-s, "%d %s",
+ yar, (yar==1) ? "yard" : "yards");
+ printed_anything = True;
+ }
+ if (inr >= FOOT) {
+ ft = inr/FOOT;
+ inr %= FOOT;
+ if (printed_anything)
+ strlcat(nbuf, ", ", nbufsize);
+ s = strlen(nbuf);
+ snprintf(nbuf+s, nbufsize-s, "%d %s",
+ ft, (ft==1) ? "foot" : "feet");
+ printed_anything = True;
+ }
+ if (!printed_anything || inch_frac != 0.0 || inr != 0) {
+ if (printed_anything)
+ strlcat(nbuf, ", ", nbufsize);
+ s = strlen(nbuf);
+ snprintf(nbuf+s, nbufsize-s, "%.2f inches", inr+inch_frac);
+ }
+ }
+ strlcat (nbuf, ")", nbufsize);
}
- }
- if (english || metric) strcat (nbuf, ")");
- return(nbuf);
+ return(nbuf);
}
char xbuf[BUFSIZ];
@@ -231,7 +257,7 @@ xscale(int x)
if(!xp) {
scale_init();
}
- return(nscale(x, xp, xmm, xbuf));
+ return(nscale(x, xp, xmm, xbuf, sizeof(xbuf)));
}
char ybuf[BUFSIZ];
@@ -241,7 +267,7 @@ yscale(int y)
if(!yp) {
scale_init();
}
- return(nscale(y, yp, ymm, ybuf));
+ return(nscale(y, yp, ymm, ybuf, sizeof(ybuf)));
}
char bbuf[BUFSIZ];
@@ -251,7 +277,7 @@ bscale(int b)
if(!bp) {
scale_init();
}
- return(nscale(b, bp, bmm, bbuf));
+ return(nscale(b, bp, bmm, bbuf, sizeof(bbuf)));
}
/* end of pixel to inch, metric converter */
@@ -265,7 +291,7 @@ bad_window_handler(Display *disp, XErrorEvent *err)
{
char badid[20];
- sprintf(badid, window_id_format, err->resourceid);
+ snprintf(badid, sizeof(badid), window_id_format, err->resourceid);
Fatal_Error("No such window with id %s.", badid);
exit (1);
return 0;
@@ -427,7 +453,8 @@ LookupL(long code, binding *table)
{
char *name;
- sprintf(_lookup_buffer, "unknown (code = %ld. = 0x%lx)", code, code);
+ snprintf(_lookup_buffer, sizeof(_lookup_buffer),
+ "unknown (code = %ld. = 0x%lx)", code, code);
name = _lookup_buffer;
while (table->name) {