commit 3cba8965cabd149e5bdfe6165e798e2a79d4530f Author: Andrew Wansink Date: Fri Jan 22 11:49:37 2010 +1100 Added "open socket" command to dbpmda. diff --git a/src/dbpmda/src/dbpmda.h b/src/dbpmda/src/dbpmda.h index 914ec24..7711e0b 100644 --- a/src/dbpmda/src/dbpmda.h +++ b/src/dbpmda/src/dbpmda.h @@ -53,6 +53,11 @@ extern void closepmda(void); extern void dopmda(int); extern void watch(char *); +#if HAVE_SYS_UN_H +extern void opensocket(char *); +extern void closesocket(void); +#endif + /* * make sure these are different to PDU_BINARY or PDU_ASCII */ diff --git a/src/dbpmda/src/gram.y b/src/dbpmda/src/gram.y index ee13d9c..4991acc 100644 --- a/src/dbpmda/src/gram.y +++ b/src/dbpmda/src/gram.y @@ -71,7 +71,7 @@ param_t param; OPEN CLOSE DESC GETDESC FETCH INSTANCE PROFILE HELP WATCH DBG QUIT STATUS STORE INFO TIMER NAMESPACE WAIT PMNS_NAME PMNS_PMID PMNS_CHILDREN PMNS_TRAVERSE - DSO PIPE + DSO PIPE SOCKET ADD DEL ALL NONE INDOM ON OFF PLUS EOL @@ -101,6 +101,10 @@ stmt : OPEN EOL { openpmda($3); stmt_type = OPEN; YYACCEPT; } + | OPEN SOCKET fname { + opensocket($3); + stmt_type = OPEN; YYACCEPT; + } | CLOSE EOL { stmt_type = CLOSE; YYACCEPT; } diff --git a/src/dbpmda/src/lex.l b/src/dbpmda/src/lex.l index b3c8117..6ce64fc 100644 --- a/src/dbpmda/src/lex.l +++ b/src/dbpmda/src/lex.l @@ -68,6 +68,7 @@ off { return OFF; } on { return ON; } open { return OPEN; } pipe { BEGIN FNAME; return PIPE; } +socket { BEGIN FNAME; return SOCKET; } pmid { return PMNS_PMID; } profile { return PROFILE; } q { return QUIT; } diff --git a/src/dbpmda/src/pmda.c b/src/dbpmda/src/pmda.c index 8fcdf5c..e5f96b4 100644 --- a/src/dbpmda/src/pmda.c +++ b/src/dbpmda/src/pmda.c @@ -25,6 +25,11 @@ #endif #include +#include +#if HAVE_SYS_UN_H +#include +#endif + #include "./dbpmda.h" #include "./lex.h" #include "./gram.h" @@ -170,6 +175,78 @@ openpmda(char *fname) } } +#if HAVE_SYS_UN_H +void +closesocket(void) +{ + if (infd) + close(infd); + __pmResetIPC(infd); + connmode = PDU_NOT; + if (myPmdaName != NULL) + free(myPmdaName); +} + +void +opensocket(char *fname) +{ + int fd; + struct stat buf; + struct sockaddr_un s_un; + int len; + + if (stat(fname, &buf) < 0) { + fprintf(stderr, "opensocket: %s: %s\n", fname, strerror(errno)); + return; + } + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + fprintf(stderr, "opensocket: socket: %s\n", strerror(errno)); + return; + } + + memset(&s_un, 0, sizeof(s_un)); + s_un.sun_family = AF_UNIX; + strncpy(s_un.sun_path, fname, strlen(fname)); + len = sizeof(s_un.sun_family) + strlen(fname); + + closesocket(); + + if (connect(fd, (struct sockaddr *)&s_un, len) < 0) { + fprintf(stderr, "opensocket: bind: %s\n", strerror(errno)); + close(fd); + return; + } + + infd = fd; + outfd = fd; + + printf("Connect PDMA on named pipe %s\n", fname); + + putchar('\n'); + + connmode = PDU_BINARY; + reset_profile(); + if (myPmdaName != NULL) + free(myPmdaName); + myPmdaName = strdup(fname); + pmdaversion(); +} +#else +void +opensocket(char *fname) +{ + __pmNotifyErr(LOG_CRIT, "UNIX domain sockets unsupported\n"); +} + +void +closesocket(void) +{ + __pmNotifyErr(LOG_CRIT, "UNIX domain sockets unsupported\n"); +} +#endif + void closepmda(void) { diff --git a/src/dbpmda/src/util.c b/src/dbpmda/src/util.c index e7bf94a..d6f9810 100644 --- a/src/dbpmda/src/util.c +++ b/src/dbpmda/src/util.c @@ -269,6 +269,7 @@ dohelp(int command, int full) case OPEN: puts("open dso dsoname init_routine [ domain# ]"); puts("open pipe execname [ arg ... ]"); + puts("open socket sockname"); break; case PMNS_CHILDREN: puts("children metric-name"); @@ -357,10 +358,12 @@ dohelp(int command, int full) break; case OPEN: puts( -"Open a PMDA as either a DSO or a daemon (connected with a pipe). The\n" -"'dsoname' and 'execname' fields are the path to the PMDA shared object file\n" -"or executable. The arguments to this command are similar to a line in the\n" -"pmcd.conf file.\n"); +"Open a PMDA as either a DSO, via socket, or as a daemon (connected with a \n" +"pipe). The 'dsoname' and 'execname' fields are the path to the PMDA shared \n" +"object file or executable. The arguments to this command are similar to a \n" +"line in the pmcd.conf file. The 'sockname field is the path of a named pipe\n" +"where a PMDA is listening for connections\n"); + break; case PMNS_CHILDREN: puts(