add public API for locating commands
[fw/openocd] / src / helper / ioutil.c
index 8fdbb2b66facff436898270543b9a5da3defb826..52ecb9f26fdd06ac4d6c5c46b33fb7491a95c0f9 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2007-2008 by Øyvind Harboe                              *
+ *   Copyright (C) 2007-2008 by Øyvind Harboe                              *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
 #endif
 
 #include "log.h"
-#include "types.h"
-#include "configuration.h"
-#include "target.h"
-
-#include "command.h"
-
-#include <time_support.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <strings.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#if !BUILD_ECOSBOARD
-#include <malloc.h>
-#endif
-#include <errno.h>
-
+#include "time_support.h"
 
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <netinet/tcp.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <net/if.h>
+#ifdef HAVE_ARPA_INET_H
 #include <arpa/inet.h>
-#include <sys/types.h>
-#include <sys/socket.h>
+#endif
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+#ifdef HAVE_NETDB_H
 #include <netdb.h>
-#include <netinet/in.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-#include <stdio.h>
-#include <string.h>
-
-#if !defined(__CYGWIN__)
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+//#ifdef HAVE_NETINET_TCP_H
+//#include <netinet/tcp.h>
+//#endif
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_IFADDRS_H
 #include <ifaddrs.h>
 #endif
+#ifdef HAVE_MALLOC_H
+#if !BUILD_ECOSBOARD
+#include <malloc.h>
+#endif
+#endif
 
-#include <unistd.h>
-#include <stdio.h>
 
-int handle_rm_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
+COMMAND_HANDLER(handle_rm_command)
 {
-       if (argc != 1)
+       if (CMD_ARGC != 1)
        {
-               command_print(cmd_ctx, "rm <filename>");
+               command_print(CMD_CTX, "rm <filename>");
                return ERROR_INVALID_ARGUMENTS;
        }
 
-       if (unlink(args[0]) != 0)
+       if (unlink(CMD_ARGV[0]) != 0)
        {
-               command_print(cmd_ctx, "failed: %d", errno);
+               command_print(CMD_CTX, "failed: %d", errno);
        }
 
        return ERROR_OK;
@@ -96,12 +83,12 @@ int loadFile(const char *fileName, void **data, size_t *len)
 
        FILE * pFile;
        pFile = fopen(fileName,"rb");
-       if (pFile==NULL)
+       if (pFile == NULL)
        {
                LOG_ERROR("Can't open %s\n", fileName);
                return ERROR_FAIL;
        }
-       if (fseek(pFile, 0, SEEK_END)!=0)
+       if (fseek(pFile, 0, SEEK_END) != 0)
        {
                LOG_ERROR("Can't open %s\n", fileName);
                fclose(pFile);
@@ -116,14 +103,14 @@ int loadFile(const char *fileName, void **data, size_t *len)
        }
        *len = fsize;
 
-       if (fseek(pFile, 0, SEEK_SET)!=0)
+       if (fseek(pFile, 0, SEEK_SET) != 0)
        {
                LOG_ERROR("Can't open %s\n", fileName);
                fclose(pFile);
                return ERROR_FAIL;
        }
        *data = malloc(*len + 1);
-       if (*data==NULL)
+       if (*data == NULL)
        {
                LOG_ERROR("Can't open %s\n", fileName);
                fclose(pFile);
@@ -146,14 +133,11 @@ int loadFile(const char *fileName, void **data, size_t *len)
        return ERROR_OK;
 }
 
-
-
-int handle_cat_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
+COMMAND_HANDLER(handle_cat_command)
 {
-       if (argc != 1)
+       if (CMD_ARGC != 1)
        {
-               command_print(cmd_ctx, "cat <filename>");
+               command_print(CMD_CTX, "cat <filename>");
                return ERROR_INVALID_ARGUMENTS;
        }
 
@@ -161,45 +145,44 @@ int handle_cat_command(struct command_context_s *cmd_ctx, char *cmd,
        void *data;
        size_t len;
 
-       int retval = loadFile(args[0], &data, &len);
+       int retval = loadFile(CMD_ARGV[0], &data, &len);
        if (retval == ERROR_OK)
        {
-               command_print(cmd_ctx, "%s", data);
+               command_print(CMD_CTX, "%s", (char *)data);
                free(data);
        }
        else
        {
-               command_print(cmd_ctx, "%s not found %d", args[0], retval);
+               command_print(CMD_CTX, "%s not found %d", CMD_ARGV[0], retval);
        }
 
        return ERROR_OK;
 }
-int handle_trunc_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
+
+COMMAND_HANDLER(handle_trunc_command)
 {
-       if (argc != 1)
+       if (CMD_ARGC != 1)
        {
-               command_print(cmd_ctx, "trunc <filename>");
+               command_print(CMD_CTX, "trunc <filename>");
                return ERROR_INVALID_ARGUMENTS;
        }
 
        FILE *config_file = NULL;
-       config_file = fopen(args[0], "w");
+       config_file = fopen(CMD_ARGV[0], "w");
        if (config_file != NULL)
                fclose(config_file);
 
        return ERROR_OK;
 }
 
-
-int handle_meminfo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_meminfo_command)
 {
        static int prev = 0;
        struct mallinfo info;
 
-       if (argc != 0)
+       if (CMD_ARGC != 0)
        {
-               command_print(cmd_ctx, "meminfo");
+               command_print(CMD_CTX, "meminfo");
                return ERROR_INVALID_ARGUMENTS;
        }
 
@@ -207,53 +190,58 @@ int handle_meminfo_command(struct command_context_s *cmd_ctx, char *cmd, char **
 
        if (prev > 0)
        {
-               command_print(cmd_ctx, "Diff:            %d", prev - info.fordblks);
+               command_print(CMD_CTX, "Diff:            %d", prev - info.fordblks);
        }
        prev = info.fordblks;
 
-       command_print(cmd_ctx, "Available ram:   %d", info.fordblks );
+       command_print(CMD_CTX, "Available ram:   %d", info.fordblks);
 
        return ERROR_OK;
 }
 
 
-int handle_append_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
+COMMAND_HANDLER(handle_append_command)
 {
-       if (argc < 1)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx,
+               command_print(CMD_CTX,
                                "append <filename> [<string1>, [<string2>, ...]]");
                return ERROR_INVALID_ARGUMENTS;
        }
 
+       int retval = ERROR_FAIL;
        FILE *config_file = NULL;
-       config_file = fopen(args[0], "a");
+       config_file = fopen(CMD_ARGV[0], "a");
        if (config_file != NULL)
        {
-               int i;
                fseek(config_file, 0, SEEK_END);
 
-               for (i = 1; i < argc; i++)
+               unsigned i;
+               for (i = 1; i < CMD_ARGC; i++)
                {
-                       fwrite(args[i], strlen(args[i]), 1, config_file);
-                       if (i != argc - 1)
+                       if (fwrite(CMD_ARGV[i], 1, strlen(CMD_ARGV[i]), config_file) != strlen(CMD_ARGV[i]))
+                               break;
+                       if (i != CMD_ARGC - 1)
                        {
-                               fwrite(" ", 1, 1, config_file);
+                               if (fwrite(" ", 1, 1, config_file) != 1)
+                                       break;
                        }
                }
-               fwrite("\n", 1, 1, config_file);
+               if ((i == CMD_ARGC) && (fwrite("\n", 1, 1, config_file) == 1))
+               {
+                       retval = ERROR_OK;
+               }
                fclose(config_file);
        }
 
-       return ERROR_OK;
+       return retval;
 }
 
 
 
-int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_cp_command)
 {
-       if (argc != 2)
+       if (CMD_ARGC != 2)
        {
                return ERROR_INVALID_ARGUMENTS;
        }
@@ -262,11 +250,11 @@ int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
        void *data;
        size_t len;
 
-       int retval = loadFile(args[0], &data, &len);
+       int retval = loadFile(CMD_ARGV[0], &data, &len);
        if (retval != ERROR_OK)
                return retval;
 
-       FILE *f = fopen(args[1], "wb");
+       FILE *f = fopen(CMD_ARGV[1], "wb");
        if (f == NULL)
                retval = ERROR_INVALID_ARGUMENTS;
 
@@ -280,7 +268,7 @@ int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                        chunk = maxChunk;
                }
 
-               if ((retval==ERROR_OK)&&(fwrite(((char *)data)+pos, 1, chunk, f)!=chunk))
+               if ((retval == ERROR_OK) && (fwrite(((char *)data) + pos, 1, chunk, f) != chunk))
                        retval = ERROR_INVALID_ARGUMENTS;
 
                if (retval != ERROR_OK)
@@ -288,7 +276,7 @@ int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                        break;
                }
 
-               command_print(cmd_ctx, "%d", len - pos);
+               command_print(CMD_CTX, "%zu", len - pos);
 
                pos += chunk;
 
@@ -298,10 +286,10 @@ int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
 
        if (retval == ERROR_OK)
        {
-               command_print(cmd_ctx, "Copied %s to %s", args[0], args[1]);
+               command_print(CMD_CTX, "Copied %s to %s", CMD_ARGV[0], CMD_ARGV[1]);
        } else
        {
-               command_print(cmd_ctx, "Failed: %d", retval);
+               command_print(CMD_CTX, "Failed: %d", retval);
        }
 
        if (data != NULL)
@@ -310,7 +298,7 @@ int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                fclose(f);
 
        if (retval != ERROR_OK)
-               unlink(args[1]);
+               unlink(CMD_ARGV[1]);
 
        return retval;
 }
@@ -329,36 +317,36 @@ void copyfile(char *name2, char *name1)
        int fd1, fd2;
        ssize_t done, wrote;
 
-       fd1 = open(name1, O_WRONLY | O_CREAT);
+       fd1 = open(name1, O_WRONLY | O_CREAT, 0664);
        if (fd1 < 0)
-               SHOW_RESULT( open, fd1 );
+               SHOW_RESULT(open, fd1);
 
        fd2 = open(name2, O_RDONLY);
        if (fd2 < 0)
-               SHOW_RESULT( open, fd2 );
+               SHOW_RESULT(open, fd2);
 
        for (;;)
        {
-               done = read(fd2, buf, IOSIZE );
+               done = read(fd2, buf, IOSIZE);
                if (done < 0)
                {
-                       SHOW_RESULT( read, done );
+                       SHOW_RESULT(read, done);
                        break;
                }
 
-        if( done == 0 ) break;
+        if (done == 0) break;
 
                wrote = write(fd1, buf, done);
-        if( wrote != done ) SHOW_RESULT( write, wrote );
+        if (wrote != done) SHOW_RESULT(write, wrote);
 
-        if( wrote != done ) break;
+        if (wrote != done) break;
        }
 
        err = close(fd1);
-    if( err < 0 ) SHOW_RESULT( close, err );
+    if (err < 0) SHOW_RESULT(close, err);
 
        err = close(fd2);
-    if( err < 0 ) SHOW_RESULT( close, err );
+    if (err < 0) SHOW_RESULT(close, err);
 
 }
 
@@ -369,7 +357,7 @@ void copydir(char *name, char *destdir)
        DIR *dirp;
 
        dirp = opendir(destdir);
-       if (dirp==NULL)
+       if (dirp == NULL)
        {
                mkdir(destdir, 0777);
        } else
@@ -378,7 +366,7 @@ void copydir(char *name, char *destdir)
        }
 
        dirp = opendir(name);
-    if( dirp == NULL ) SHOW_RESULT( opendir, -1 );
+    if (dirp == NULL) SHOW_RESULT(opendir, -1);
 
        for (;;)
        {
@@ -427,7 +415,7 @@ void copydir(char *name, char *destdir)
        }
 
        err = closedir(dirp);
-    if( err < 0 ) SHOW_RESULT( stat, err );
+    if (err < 0) SHOW_RESULT(stat, err);
 }
 
 
@@ -483,7 +471,7 @@ zylinjtag_Jim_Command_ls(Jim_Interp *interp,
                if (entry == NULL)
                        break;
 
-               if ((strcmp(".", entry->d_name)==0)||(strcmp("..", entry->d_name)==0))
+               if ((strcmp(".", entry->d_name) == 0)||(strcmp("..", entry->d_name) == 0))
                        continue;
 
         Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, entry->d_name, strlen(entry->d_name)));
@@ -495,32 +483,6 @@ zylinjtag_Jim_Command_ls(Jim_Interp *interp,
        return JIM_OK;
 }
 
-int handle_peek_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       if (argc != 1)
-       {
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-       unsigned long addr = strtoul(args[0], NULL, 0);
-       volatile unsigned *address = (volatile unsigned *)addr;
-       unsigned value = *address;
-       command_print(cmd_ctx, "0x%x : 0x%x", address, value);
-       return ERROR_OK;
-}
-
-int handle_poke_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       if (argc != 2)
-       {
-               return ERROR_INVALID_ARGUMENTS;
-       }
-       unsigned long addr = strtoul(args[0], NULL, 0);
-       volatile int *address = (volatile int *)addr;
-       int value=strtoul(args[1], NULL, 0);
-       *address=value;
-       return ERROR_OK;
-}
-
 static int
 zylinjtag_Jim_Command_peek(Jim_Interp *interp,
                                    int argc,
@@ -645,7 +607,7 @@ static int zylinjtag_Jim_Command_mac(Jim_Interp *interp, int argc,
        {
                //if (ifr->ifr_addr.sa_family == AF_INET)
                {
-                       if (strcmp("eth0", ifr->ifr_name)!=0)
+                       if (strcmp("eth0", ifr->ifr_name) != 0)
                                continue;
                        strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
                        if (ioctl(SockFD, SIOCGIFHWADDR, &ifreq) < 0)
@@ -683,24 +645,24 @@ static int zylinjtag_Jim_Command_mac(Jim_Interp *interp, int argc,
 
 
 
-int ioutil_init(struct command_context_s *cmd_ctx)
+int ioutil_init(struct command_context *cmd_ctx)
 {
-       register_command(cmd_ctx, NULL, "rm", handle_rm_command, COMMAND_ANY,
+       COMMAND_REGISTER(cmd_ctx, NULL, "rm", handle_rm_command, COMMAND_ANY,
                        "remove file");
 
-       register_command(cmd_ctx, NULL, "cat", handle_cat_command, COMMAND_ANY,
+       COMMAND_REGISTER(cmd_ctx, NULL, "cat", handle_cat_command, COMMAND_ANY,
                        "display file content");
 
-       register_command(cmd_ctx, NULL, "trunc", handle_trunc_command, COMMAND_ANY,
+       COMMAND_REGISTER(cmd_ctx, NULL, "trunc", handle_trunc_command, COMMAND_ANY,
                        "truncate a file to 0 size");
 
-       register_command(cmd_ctx, NULL, "cp", handle_cp_command,
+       COMMAND_REGISTER(cmd_ctx, NULL, "cp", handle_cp_command,
                                         COMMAND_ANY, "copy a file <from> <to>");
 
-       register_command(cmd_ctx, NULL, "append_file", handle_append_command,
+       COMMAND_REGISTER(cmd_ctx, NULL, "append_file", handle_append_command,
                        COMMAND_ANY, "append a variable number of strings to a file");
 
-       register_command(cmd_ctx, NULL, "meminfo", handle_meminfo_command,
+       COMMAND_REGISTER(cmd_ctx, NULL, "meminfo", handle_meminfo_command,
                        COMMAND_ANY, "display available ram memory");
 
     Jim_CreateCommand(interp, "rm", zylinjtag_Jim_Command_rm, NULL, NULL);