OSSP CVS Repository

ossp - Difference in ossp-pkg/sa/sa.c versions 1.8 and 1.9
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [History

ossp-pkg/sa/sa.c 1.8 -> 1.9

--- sa.c 2001/10/05 20:52:15     1.8
+++ sa.c 2001/10/06 16:01:48     1.9
@@ -71,6 +71,9 @@
     int              nWriteLen;   /* write buffer current length */
     int              nWriteSize;  /* write buffer current size */
     char            *cpWriteBuf;  /* write buffer memory chunk */
+    char             szError[256];
+    char             szErrorInfo[128];
+    sa_rc_t          rvErrorInfo;
 };
 
 /* boolean values */
@@ -210,6 +213,79 @@
     return chars;
 }
 
+/* remember extra error information */
+static sa_rc_t sa_errorinfo(sa_t *sa, sa_rc_t rv, const char *fmt, ...)
+{
+    va_list ap;
+
+    /* argument sanity check */
+    if (sa == NULL)
+        return SA_ERR_ARG;
+
+    if (rv == SA_OK && fmt == NULL) {
+        /* reset error information */
+        sa->szErrorInfo[0] = '\0';
+        sa->rvErrorInfo = SA_OK;
+    }
+    else {
+        /* remember error information */
+        va_start(ap, fmt);
+        sa_mvsnprintf(sa->szErrorInfo, sizeof(sa->szErrorInfo), fmt, ap);
+        sa->rvErrorInfo = rv;
+        va_end(ap);
+    }
+    return SA_OK;
+}
+
+/* return error string */
+sa_rc_t sa_error(sa_t *sa, sa_rc_t rv, char **str)
+{
+    char *sz;
+    char *cpBuf;
+    int nBuf;
+    int n;
+
+    /* argument sanity check */
+    if (sa == NULL || str == NULL)
+        return SA_ERR_ARG;
+
+    /* start at begin of buffer */
+    cpBuf = sa->szError;
+    nBuf  = sizeof(sa->szError);
+
+    /* translate result value into corresponding string */
+    if      (rv == SA_OK)      sz = "everything ok";
+    else if (rv == SA_ERR_ARG) sz = "invalid argument";
+    else if (rv == SA_ERR_USE) sz = "invalid use";
+    else if (rv == SA_ERR_MEM) sz = "no more memory available";
+    else if (rv == SA_ERR_SYS) sz = "operating system error";
+    else if (rv == SA_ERR_EOF) sz = "end of file in socket communication";
+    else if (rv == SA_ERR_INT) sz = "internal error";
+    else                       sz = "unknown error";
+    n = sa_msnprintf(cpBuf, nBuf, "%s", sz);
+    cpBuf += n;
+    nBuf  -= n;
+
+    /* optionally annotate with error information */
+    if (rv == sa->rvErrorInfo && sa->szErrorInfo[0] != '\0') {
+        n = sa_msnprintf(cpBuf, nBuf, "; %s", sa->szErrorInfo);
+        cpBuf += n;
+        nBuf  -= n;
+        sa_errorinfo(sa, SA_OK, NULL);
+    }
+
+    /* optionally annotate with operating system error information */
+    if (rv == SA_ERR_SYS) {
+        n = sa_msnprintf(cpBuf, nBuf, "; %s (%d)", strerror(errno), errno);
+        cpBuf += n;
+        nBuf  -= n;
+    }
+
+    /* return pointer to internal buffer */
+    *str = sa->szError;
+    return SA_OK;
+}
+
 /* create address object */
 sa_rc_t sa_addr_create(sa_addr_t **saap)
 {
@@ -612,6 +688,9 @@
     sa->nWriteLen         = 0;
     sa->nWriteSize        = 0;
     sa->cpWriteBuf        = NULL;
+    sa->szError[0]        = '\0';
+    sa->szErrorInfo[0]    = '\0';
+    sa->rvErrorInfo       = SA_OK;
 
     /* pass object to caller */
     *sap = sa;

CVSTrac 2.0.1