mhhh... doesn't look too bad. Maybe it's a problem with the calling sequence. When do you call your new function? If should be called after the nsdConstruct but before the nsdConsructFinalize (actual function names may be slightly different).
Rainer > -----Original Message----- > From: [email protected] [mailto:rsyslog- > [email protected]] On Behalf Of Tomas Kubina > Sent: Thursday, January 21, 2010 11:21 AM > To: rsyslog-users > Subject: Re: [rsyslog] How to add new configuration option > > Rainer Gerhards wrote: > > Thanks for the code. Unfortunately, adding the config switch to it is > not > > quite easy in that case (good I asked for the actual code). I'd say > that you > > best do it similar to the other config directives, like the > authentication > > mode. They actual directives are in the upper level code > (imtcp/omfwd). > > There, they are shuffled over to the instance data, which goes along > with > > each of the configured listeners/sender. Then, when a new network > stream is > > created, the params are passed down to the generic stream interface > and there > > passed down to the selected stream driver, which finally stores and > acts on > > them. It's clumpsy and quite some work, but that is what is needed > for the > > old config system. You probably need to add around 50 to 100 lines of > code > > altogether to the various files. It's not complex, but easy to forget > > something. Best start by a directive (like $..AuthMode), see how it > is > > handled (and passed down) in imtcp and work your way down the stack > ;) > > > > Rainer > > > > > Hi Rainer, > > I have added some code that I have thought was necessary, but > I am stuck now. In nsd_gtls.c is added function: > > static rsRetVal > SetAddClientCN(nsd_t *pNsd, int mode) > { > DEFiRet; > nsd_gtls_t *pThis = (nsd_gtls_t*) pNsd; > > ISOBJ_TYPE_assert((pThis), nsd_gtls); > if(mode != 0 && mode != 1) { > errmsg.LogError(0, RS_RET_INVALID_DRVR_MODE, "error: driver > mode > %d not supported by " > "gtls netstream driver", mode); > ABORT_FINALIZE(RS_RET_INVALID_DRVR_MODE); > } > > pThis->iAddClientCN = mode; > dbgprintf("GTLS:%d\n", pThis->iAddClientCN); > finalize_it: > RETiRet; > } > > The "dbgprintf" shows correct value in pThis, but if I check > pThis->iAddClientCN > later in function: > > static rsRetVal > Rcv(nsd_t *pNsd, uchar *pBuf, ssize_t *pLenBuf) > { > DEFiRet; > ssize_t iBytesCopy; /* how many bytes are to be copied to the > client > buffer? */ > nsd_gtls_t *pThis = (nsd_gtls_t*) pNsd; > ISOBJ_TYPE_assert(pThis, nsd_gtls); > > cstr_t *pstrCN = NULL; > const gnutls_datum *cert_list; > unsigned int cert_list_size = 0; > gnutls_x509_crt cert; > int len = 0; > char *buf_temp; > > if(pThis->bAbortConn) > ABORT_FINALIZE(RS_RET_CONNECTION_ABORTREQ); > > if(pThis->iMode == 0) { > CHKiRet(nsd_ptcp.Rcv(pThis->pTcp, pBuf, pLenBuf)); > FINALIZE; > } > > /* --- in TLS mode now --- */ > > /* Buffer logic applies only if we are in TLS mode. Here we > * assume that we will switch from plain to TLS, but never back. > This > * assumption may be unsafe, but it is the model for the time being > and I > * do not see any valid reason why we should switch back to plain > TCP after > * we were in TLS mode. However, in that case we may lose something > that > * is already in the receive buffer ... risk accepted. -- > rgerhards, > 2008-06-23 > */ > > if(pThis->pszRcvBuf == NULL) { > /* we have no buffer, so we need to malloc one */ > CHKmalloc(pThis->pszRcvBuf = MALLOC(NSD_GTLS_MAX_RCVBUF)); > pThis->lenRcvBuf = -1; > } > > /* now check if we have something in our buffer. If so, we satisfy > * the request from buffer contents. > */ > if(pThis->lenRcvBuf == -1) { /* no data present, must read */ > CHKiRet(gtlsRecordRecv(pThis)); > } > > if(pThis->lenRcvBuf == 0) { /* EOS */ > *pLenBuf = 0; > /* in this case, we also need to free the receive buffer, if we > * allocated one. -- rgerhards, 2008-12-03 > */ > if(pThis->pszRcvBuf != NULL) { > free(pThis->pszRcvBuf); > pThis->pszRcvBuf = NULL; > } > ABORT_FINALIZE(RS_RET_CLOSED); > } > > /* if we reach this point, data is present in the buffer and must > be > copied */ > iBytesCopy = pThis->lenRcvBuf - pThis->ptrRcvBuf; > if(iBytesCopy > *pLenBuf) { > iBytesCopy = *pLenBuf; > } else { > pThis->lenRcvBuf = -1; /* buffer will be emptied below */ > } > > dbgprintf("!!!!!!!!!!!%d!!!!!!!!!!!!!!\n\n", pThis- > >iAddClientCN); > if (pThis->iAddClientCN) > { > if (pThis->clientCNValid != 1) > { > cert_list = gnutls_certificate_get_peers(pThis->sess, > &cert_list_size); > > if(cert_list_size > 0) > { > // we only print information about the first certificate > gnutls_x509_crt_init(&cert); > gnutls_x509_crt_import(cert, &cert_list[0], > GNUTLS_X509_FMT_DER); > > CHKiRet(gtlsGetCN(pThis, &cert, &pstrCN)); > > len = snprintf(NULL, 0, "CN:%s ", > (char*)cstrGetSzStr(pstrCN)); > if ( !(pThis->clientCN = malloc((len + 1)*sizeof(char))) > ) > return -1; > > snprintf(pThis->clientCN, len + 1, "CN:%s ", > (char*)cstrGetSzStr(pstrCN)); > pThis->clientCN[len] = '\0'; > pThis->clientCNLen = len + 1; > > pThis->clientCNValid = 1; > } > } > > iBytesCopy = iBytesCopy + pThis->clientCNLen - 1 < *pLenBuf ? > iBytesCopy + pThis->clientCNLen - 1 : *pLenBuf; > > buf_temp = (char*)malloc(iBytesCopy); > > if (buf_temp) > { > memset(buf_temp, 0, iBytesCopy); > strncpy(buf_temp, pThis->clientCN, iBytesCopy); > buf_temp[strlen(buf_temp)] ='\0'; > strncat(buf_temp, pThis->pszRcvBuf, iBytesCopy - > strlen(buf_temp)); > buf_temp[strlen(buf_temp)] ='\0'; > } > > memset(pBuf, 0, *pLenBuf); > memcpy(pBuf, buf_temp + pThis->ptrRcvBuf, iBytesCopy); > > if (buf_temp) > free(buf_temp); > } > else > { > memcpy(pBuf, pThis->pszRcvBuf + pThis->ptrRcvBuf, > iBytesCopy); > } > > pThis->ptrRcvBuf += iBytesCopy; > *pLenBuf = iBytesCopy; > > finalize_it: > dbgprintf("gtlsRcv return. nsd %p, iRet %d, lenRcvBuf %d, ptrRcvBuf > %d\n", pThis, iRet, pThis->lenRcvBuf, pThis->ptrRcvBuf); > RETiRet; > } > > The value is zero. Can you help me what I have to check in the sources > code? > > Thanks. > > Regards, > > Tomas > _______________________________________________ > rsyslog mailing list > http://lists.adiscon.net/mailman/listinfo/rsyslog > http://www.rsyslog.com _______________________________________________ rsyslog mailing list http://lists.adiscon.net/mailman/listinfo/rsyslog http://www.rsyslog.com

