[Freeswitch-svn] [commit] r3757 - freeswitch/branches/igorneves/scripts/socket

Freeswitch SVN igorneves at freeswitch.org
Wed Dec 20 12:30:26 EST 2006


Author: igorneves
Date: Wed Dec 20 12:30:25 2006
New Revision: 3757

Modified:
   freeswitch/branches/igorneves/scripts/socket/fsconsole.c

Log:
new version, dont know the changes yet

Modified: freeswitch/branches/igorneves/scripts/socket/fsconsole.c
==============================================================================
--- freeswitch/branches/igorneves/scripts/socket/fsconsole.c	(original)
+++ freeswitch/branches/igorneves/scripts/socket/fsconsole.c	Wed Dec 20 12:30:25 2006
@@ -6,301 +6,491 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <string.h>
+
+#ifdef WIN32
+#include <winsock2.h>
+#else
+#define closesocket close
+#endif
+
+#ifdef _MSC_VER
+#include <io.h>
+#define write _write
+#else
 #include <netdb.h>
 #include <netinet/in.h>
 #include <sys/socket.h>
+#include <sys/errno.h>
 #include <unistd.h>
+#endif
 
-#define buflen 38
+
+#define buflen 4096
 #define NUL '\0'
 
-char *app = "freeswitch";
-char *version = "0.1";
-char *hostname = "127.0.0.1";
+char *app = "fsconsole";
+
+/* Defaults according to current (12-06-06) freeswitch.xml */
+char *hostname = "localhost";
 char *secret = "ClueCon";
-unsigned int port = 8021;
+u_short port = 8021;
 
-char *intro = "Welcome to FreeSWITCH Console.\n\n";
+/* Debug Level */
+int debug = 0;
 
+char *intro = "Welcome to the FreeSWITCH Console.\n";
+
 char    buffer[buflen], *command;
-int     sd, flag, prompt;
+#ifdef WIN32
+SOCKET  sd;
+#else
+int     sd;
+#endif
+int		flag, prompt, display;
 
 char *trim(char *str);
 void print_tokens(char *line);
-int fs_switch_read();
 
-// Debug level
-int debug = 3;
 
+#ifdef WIN32
+typedef SOCKET socket_t;
+#else
+typedef int socket_t;
+#endif
+
+typedef enum {
+	STATUS_SUCCESS
+} status_t;
+
+static int socket_set_nonblock(socket_t sd)
+{
+#ifdef WIN32
+	u_long argp = 1;
+	if (ioctlsocket(sd, FIONBIO, &argp) == SOCKET_ERROR) {
+		return ((WSAGetLastError() == 0) ? STATUS_SUCCESS : WSAGetLastError());
+	}
+#else
+	flag = fcntl(sd, F_GETFL, 0);
+	flag |= O_NONBLOCK;
+	if (fcntl(sd, F_SETFL, flag) == -1) {
+		return errno;
+	}
+#endif
+	return STATUS_SUCCESS;
+}
+
+unsigned long getaddr(char *host_name)
+{
+	struct hostent *host;
+	unsigned long addr = 0;
+	struct in_addr address;
+
+	if (isalpha(host_name[0])) {   /* host address is a name */
+		host = gethostbyname(host_name);
+		if(!host) {
+			return 0;
+		} else {
+			address = *(struct in_addr*)host->h_addr_list[0];
+			addr = address.s_addr;
+		}
+	}
+	else  { 
+	  addr = inet_addr(host_name);
+	}
+
+	return addr;
+}
+
 int main(int argc, char *argv[])
 {
-   if (argv[1] == "--help") {
-      fprintf(stderr,"usage %s hostname port\n", argv[0]);
-      exit(0);
-   }
 
-   /* Hostname and Port defined on command line */
-   if (argc > 1) {
-	strncpy(hostname, argv[1], sizeof(hostname));
-	hostname = argv[1];
-	port = atoi(argv[2]);
-   }
+	int len;
+	char    contents[4096];
 
-   sd = socket(AF_INET, SOCK_STREAM, 0);  /* init socket descriptor */
-   struct sockaddr_in sin;
-   struct hostent *host = gethostbyname(hostname);
+	char whitespace[] = "\r";
+	char *token, *token_split, *subtoken_split;
+	char token_key[32], token_val[32], token_contents[4096], subtoken_contents[4096];
+	char subtoken_key[32], subtoken_val[32];
 
-   //char buffer[buflen];
-   int len;
-   char *p;
-   char cmd[38];
-   int i, n, out;
+	struct sockaddr_in sin = {0};
 
-   /*** PLACE DATA IN sockaddr_in struct ***/
-   memcpy(&sin.sin_addr.s_addr, host->h_addr, host->h_length);
-   sin.sin_family = AF_INET;
-   sin.sin_port = htons(port);
+	char cmd[256];
 
-   /*** CONNECT SOCKET TO THE SERVICE DESCRIBED BY sockaddr_in struct ***/
-   if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
-     {
-     perror("connecting");
-     exit(1);
-     }
+	if (argv[1] && !strcmp(argv[1], "--help")) {
+		fprintf(stderr,"usage %s hostname port secret\n", argv[0]);
+		exit(0);
+	}
 
-   flag = fcntl(sd, F_GETFL, 0);
-   flag |= O_NONBLOCK;
-   fcntl(sd, F_SETFL, flag);
+	/* Hostname, Port and Secret defined on command line */
+	if (argc > 1) {
+		hostname = argv[1];
+	} else if (argc > 2) {
+		port = (u_short)atoi(argv[2]);
+	} else if (argc > 3) {
+		secret = argv[3];
+	}
 
-   printf(intro);
+	/* Init socket descriptor */
+	sd = socket(AF_INET, SOCK_STREAM, 0);  
 
-   /* Setup the prompt */
-   prompt = 1;
+	/* Put Data intoN sockaddr_in struct */
+	sin.sin_family = AF_INET;
+	sin.sin_port =  htons(port);
+	sin.sin_addr.s_addr = getaddr(hostname);
 
-   while(1)
+	/* Connect Socket */
+	if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
+	{
+		perror("connecting");
+		exit(1);
+	}
+
+	/* Set Socket Descriptor to Non-Blocking */
+	socket_set_nonblock(sd);
+
+	/* Set the prompt to non-blocking */
+	socket_set_nonblock(0);
+
+	/* Print the Introduction */
+	printf(intro);
+
+	/* First Prompt = No, would show before authentication.... */
+	prompt = 0;
+
+	/* While Program is Running... */
+	for(;;)
      	{
+		/* If Authenticated -- print the current version */
+		if (command)
+		{
+			if(!strcmp(command,"authenticated"))
+			{
+				/* Print the version */
+				printf("\nRunning Version:\n");
+				sprintf(buffer, "api version\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
 
+				/* Authentication Complete -- set current command to blank */
+				command = "";
+			}
+		}
+
 		/* Prompt */
 		if (prompt)
 		{
-			printf("%s %s> ", app, version);
+			printf("\n%s@%s> ", app, hostname);
 			prompt = 0;
 		}
 
+                memset(contents, 0, sizeof(buffer));
                 memset(buffer, 0, sizeof(buffer));
                 memset(cmd, 0, sizeof(cmd));
 
-		/* Setup the first read */
-		fs_switch_read(sd, buffer);
+		len = atoi(buffer);
+		if (len <= 0) len += buflen;
+		len = recv(sd, buffer, len, 0);
+  
+		if (len > 0)
+		{
+			if (debug > 1)
+				printf("Received a response: len %d.\n", len);
 
-                flag = fcntl(0, F_GETFL, 0);
-                flag |= O_NONBLOCK;
-                fcntl(0, F_SETFL, flag);
+			if (debug > 2)
+				display = 1;
 
-                fgets(cmd, 36, stdin);
-                cmd[strlen(cmd) - 1] = 0;
+			memset(contents, 0, sizeof(contents));
+			strncpy(contents, buffer, len);
 
-		if (!strcmp(cmd, "exit")) {
-			printf("Exiting.. goodbye\n");
-       	                exit(0);
-		}
+			/* Print Incoming input to screen if debug enabled or display is set */
+			if (debug > 0 || display == 1) 
+			{
+				write(1,contents,len);
 
-		if (!strcmp(cmd, "version")) {
-			printf("Version %s\n", version);
-			prompt = 1;
-		} 
- 
-		if (!strcmp(cmd, "\n")) {
-			prompt = 1;
-		}
+				/* If not debugging, Prevent Display of Response */
+				if (debug < 2)
+					display = 0;
 
-               	if (fs_switch_read() > 0) {
-			// Do nothing
-		} else {
-			// Sleep
-	               	sleep(1);
-		}
-	}
+				/* Response received -- Set the prompt */
+				prompt = 1;
 
-   close(sd);
-}
 
+			}
 
+			/* print_tokens(contents); */
+			for (token=strtok(contents,whitespace); token !=NULL; token=strtok(NULL,whitespace))
+			{
 
-int fs_switch_read()
-  {
+				/* Multiline requires \r, set back to \r
+					to properly execute the display of responses! UNF */
+				strcpy(whitespace, "\r");
 
-  int len;
-  char    buf[4096], reply[4096], tmp[255], contents[4096];
+				sprintf(token_contents, "%s", token);
+	
+				token_split = strtok(token_contents, ":");
+					sprintf(token_key, "%s", token_split);
+				token_split = strtok(NULL, "\n");
+					sprintf(token_val, "%s", token_split);
+				token_split = strtok(NULL, "\n");
 
-  char content[32];
-  char content_type[32];
-  char content_following[32];
-  char content_after[32];
-  char junk[32];
+				token = strtok(NULL, "\n\n");
 
-  len = atoi(tmp);
-  if (len <= 0) len += 255;
-  len = recv(sd, buffer, len, 0);
-  
-  if (len > 0)
-  {
-	memset(contents, 0, sizeof(contents));
-	strncpy(contents, buffer, len);
+				trim(token_val);
 
-	// Print Incoming input to screen
-	if (debug > 0) 
-		write(1,contents,len);
+				if (debug > 2)
+					printf("\nkey: '%s', val: '%s'\n", token_key, token_val);
 
-	char whitespace[] = "\r";
-	char *token, *token_split, *subtoken_split;
-	char token_key[32], token_val[32], token_contents[4096], subtoken_contents[4096];
-	char subtoken_key[32], subtoken_val[32];
+				if (strcmp(token_key, "Content-Type") == 0)
+				{
+					display = 1;
 
-	//print_tokens(contents);
+					if (strcmp(token_val, "auth/request") == 0)
+					{
 
-	for (token=strtok(contents,whitespace); token !=NULL; token=strtok(NULL,whitespace))
-	{
+						printf("\nAuthenticating...\n");
+			
+						command = "auth";
+						sprintf(buffer, "auth %s\n\n", secret);
+						write((int)sd, buffer, (unsigned int)strlen(buffer));
 
-		//printf("Next token is %s\n", token);
+						/* If not debugging, Prevent Display of Response */
+						if (debug < 2)
+							display = 0;
 
-		sprintf(token_contents, "%s", token);
+				     	} else if (strcmp(token_val, "command/reply") == 0) {
 
-		token_split = strtok(token_contents, ":");
-			sprintf(token_key, "%s", token_split);
-		token_split = strtok(NULL, "\n");
-			sprintf(token_val, "%s", token_split);
-		token_split = strtok(NULL, "\n");
+						/* Parse the reply */		
+						sprintf(subtoken_contents, "%s", token_split);
+	
+						subtoken_split = strtok(subtoken_contents, ":");
+							sprintf(subtoken_key, "%s", subtoken_split);
+						subtoken_split = strtok(NULL, "\n");
+							sprintf(subtoken_val, "%s", subtoken_split);
+						subtoken_split = strtok(NULL, "\n");
 
-		token = strtok(NULL, "\n\n");
+						trim(subtoken_val);
 
-		trim(token_val);
+						if (debug > 2)
+							printf("subkey: '%s', subval: '%s'\n", subtoken_key, subtoken_val);
 
-		if (debug > 1)
-			printf("\nkey: '%s', val: '%s'\n", token_key, token_val);
+						if (strcmp(subtoken_key, "Reply-Text") == 0)
+						{
+							if (strcmp(subtoken_val, "+OK accepted") == 0)
+							{
+								if (strcmp(command, "auth") == 0)
+								{
+									printf("Authentication Successful\n");
+									command = "authenticated";
 
+									/* Auth Command received -- Prompt and Display handled elsewhere */
+									prompt = 0;
+									display = 0;
 
-	  if (strcmp(token_key, "Content-Type") == 0)
-	  {
+									/* Authentication required a \r, set back to \n 
+										to properly execute the display of responses! */
+									strcpy(whitespace, "\n");
 
-	     	if (strcmp(token_val, "auth/request") == 0)
-	     	{
-			printf("\nAuthenticating...\n");
-			
-			command = "auth";
-			sprintf(buf, "auth %s\n\n", secret);
-			write(sd, buf, strlen(buf));
+								}
+							} else if (strncmp(subtoken_val, "-", 1) == 0) {
+								/* Received an error, print */
 
-	     	} else if (strcmp(token_val, "command/reply") == 0) {
+								printf("\n%s\n", subtoken_val);
+								/* Since we received a response, set the prompt */
+								prompt = 1;
 
-			/* Parse the reply */		
-			sprintf(subtoken_contents, "%s", token_split);
-	
-			subtoken_split = strtok(subtoken_contents, ":");
-				sprintf(subtoken_key, "%s", subtoken_split);
-			subtoken_split = strtok(NULL, "\n");
-				sprintf(subtoken_val, "%s", subtoken_split);
-			subtoken_split = strtok(NULL, "\n");
+							} else if (strncmp(subtoken_val, "+", 1) == 0) {
+								/* Received an uncoded OK, print */
 
-			trim(subtoken_val);
+								printf("\n%s\n", subtoken_val);
+								/* Since we received a response, set the prompt */
+								prompt = 1;
 
-			if (debug > 1)
-				printf("subkey: '%s', subval: '%s'\n", subtoken_key, subtoken_val);
-	
-			if (strcmp(subtoken_key, "Reply-Text") == 0)
-			{
-				if (strcmp(subtoken_val, "+OK accepted") == 0)
-				{
-					if (strcmp(command, "auth") == 0)
-					{
-						printf("\nAuthentication Successful\n");
-						command = "";
+							}
+
+											/* || "ts" is a hack -- why? */
+						} else if (strcmp(subtoken_key, "") == 0 || strcmp(subtoken_key, "ts") == 0) {
+							printf("\n%s\n", subtoken_val);
+							/* Since we received a response, set the prompt */
+							prompt = 1;
+						}
+
+					} else if (strcmp(token_val, "api/response") == 0) {
+
+						/* Since we received an api response, display results */
+						if (command && strcmp(command,"authenticated"))
+						{
+							display = 1;
+						}
+
 					}
-				}
+				} 
+
 			}
 
 		}
-	  } 
 
+		/* Get the command */
+		fgets(cmd, 254, stdin);
 
-	}
-	/* Set the prompt */
-	prompt = 1;
+		/* Received a Command */
+		if (strlen(cmd))
+		{
 
-        return 1;
-   } else {
-	return 0;
-   }
-  
-}
+			/* Received an Enter Only - Reset Prompt*/
+			if (strcmp(cmd, "\n") == 0) {
+				prompt = 1;
+			}
 
+			/* Drop the \n */
+			cmd[strlen(cmd) - 1] = 0;
 
-void print_tokens(char *line)
-{
-	char whitespace[] = "\n";
-	char *token;
-	
-	for (token=strtok(line,whitespace); token !=NULL; token=strtok(NULL,whitespace))
-	{
-		printf("Next token is %s\n", token);
+			/* If not debugging, Prevent Display of Response */
+			if (debug < 2)
+				display = 0;
+			
+			if (strcmp(cmd, "exit") == 0 || strcmp(cmd, "quit") == 0) {
+				printf("Exiting.. goodbye.\n");
+				break;
+			} else if (strncmp(cmd, "event", 5) == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strcmp(cmd, "noevents") == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strncmp(cmd, "log", 3) == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strcmp(cmd, "nolog") == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strncmp(cmd, "api", 3) == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strncmp(cmd, "bgapi", 5) == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strncmp(cmd, "sendevent", 9) == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strncmp(cmd, "sendmsg", 7) == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				sprintf(buffer, "%s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else if (strncmp(cmd, "help", 4) == 0 || strncmp(cmd, "?", 1) == 0) {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+				printf("\n-  Console  -\n");
+				printf("Valid Commands:\n\n");
+				printf("event [xml|plain] <list of events to log or all for all> - enable or disable events by class or all\n");
+				printf("noevents - disable all events that were previously enabled w/ event\n");
+				printf("nixevent <some_event> - command to allow 'events all' followed by 'nixevent <some_event>' to do all but <some_event>\n");
+				printf("log <level> - enable log output.  Levels same as the console.conf values\n");
+				printf("nolog - disable log output previously enabled by the log command\n");
+				printf("api <command> <arg> - send an api command (blocking mode)\n");
+				printf("bgapi <command> <arg> - send an api command (non-blocking mode) this will let you execute a job in the background\n");
+				printf("sendevent <event-name> - send an event into the event system (multi line input for headers)\n");
+				printf("exit - close the fsconsole\n");
+
+				printf("\n-    API    - ");
+
+				/* Print the additional api commands available from console... */
+				sprintf(buffer, "api help\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+			} else {
+				if (debug > 2)
+					printf("Received Command: %s\n", cmd);
+
+
+				sprintf(buffer, "api %s\n\n", cmd);
+				write((int)sd, buffer, (unsigned int)strlen(buffer));
+
+				printf("\n");
+
+			}
+
+		}
+
+		/* 100% CPU fix */
+		usleep(1);
+
 	}
+
+   closesocket(sd);
 }
 
-
 char *trim(char *str)
 {
-      char *ibuf = str, *obuf = str;
-      int i = 0, cnt = 0;
+	char *ibuf = str, *obuf = str;
+	int i = 0, cnt = 0;
 
-      /*
-      **  Trap NULL
-      */
+	/*
+	**  Trap NULL
+	*/
 
-      if (str)
-      {
-            /*
-            **  Remove leading spaces (from RMLEAD.C)
-            */
+	if (str)
+	{
+		/* Remove leading spaces */
+		for (ibuf = str; *ibuf && isspace(*ibuf); ++ibuf)
+		;
+		if (str != ibuf)
+			memmove(str, ibuf, ibuf - str);
 
-            for (ibuf = str; *ibuf && isspace(*ibuf); ++ibuf)
-                  ;
-            if (str != ibuf)
-                  memmove(str, ibuf, ibuf - str);
+		/*  Collapse embedded spaces */
 
-            /*
-            **  Collapse embedded spaces (from LV1WS.C)
-            */
+		while (*ibuf)
+		{
+			if (isspace(*ibuf) && cnt) {
+				ibuf++;
+			} else {
 
-            while (*ibuf)
-            {
-                  if (isspace(*ibuf) && cnt)
-                        ibuf++;
-                  else
-                  {
-                        if (!isspace(*ibuf))
-                              cnt = 0;
-                        else
-                        {
-                              *ibuf = ' ';
-                              cnt = 1;
-                        }
-                        obuf[i++] = *ibuf++;
-                  }
-            }
-            obuf[i] = NUL;
+				if (!isspace(*ibuf)) {
+					cnt = 0;
+				} else {
+					*ibuf = ' ';
+					cnt = 1;
+				}
 
-            /*
-            **  Remove trailing spaces (from RMTRAIL.C)
-            */
+				obuf[i++] = *ibuf++;
+			}
+		}
 
-            while (--i >= 0)
-            {
-                  if (!isspace(obuf[i]))
-                        break;
-            }
-            obuf[++i] = NUL;
-      }
-      return str;
+		obuf[i] = NUL;
+
+		/*  Remove trailing spaces */
+		while (--i >= 0)
+		{
+			if (!isspace(obuf[i]))
+				break;
+		}
+
+		obuf[++i] = NUL;
+	}
+
+	return str;
+
 }
 
 



More information about the Freeswitch-svn mailing list