projects
/
routeros-api.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
src/{ros.c,system_resource.c}: Add support for the uptime field.
[routeros-api.git]
/
src
/
main.c
diff --git
a/src/main.c
b/src/main.c
index
53e96c2
..
010572d
100644
(file)
--- a/
src/main.c
+++ b/
src/main.c
@@
-1,5
+1,5
@@
/**
/**
- * lib
mikrotik
- src/main.c
+ * lib
routeros
- src/main.c
* Copyright (C) 2009 Florian octo Forster
*
* This program is free software; you can redistribute it and/or modify it
* Copyright (C) 2009 Florian octo Forster
*
* This program is free software; you can redistribute it and/or modify it
@@
-27,6
+27,8
@@
# define _POSIX_C_SOURCE 200112L
#endif
# define _POSIX_C_SOURCE 200112L
#endif
+#include "config.h"
+
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
@@
-44,12
+46,16
@@
#include "routeros_api.h"
#include "routeros_api.h"
-#if
1
+#if
WITH_DEBUG
# define ros_debug(...) fprintf (stdout, __VA_ARGS__)
#else
# define ros_debug(...) /**/
#endif
# define ros_debug(...) fprintf (stdout, __VA_ARGS__)
#else
# define ros_debug(...) /**/
#endif
+#if !__GNUC__
+# define __attribute__(x) /**/
+#endif
+
/* FIXME */
char *strdup (const char *);
/* FIXME */
char *strdup (const char *);
@@
-110,7
+116,7
@@
static int read_exact (int fd, void *buffer, size_t buffer_size) /* {{{ */
return (status);
}
return (status);
}
- assert (
status
<= want_bytes);
+ assert (
((size_t) status)
<= want_bytes);
have_bytes += status;
buffer_ptr += status;
}
have_bytes += status;
buffer_ptr += status;
}
@@
-165,6
+171,7
@@
static int reply_add_keyval (ros_reply_t *r, const char *key, /* {{{ */
return (0);
} /* }}} int reply_add_keyval */
return (0);
} /* }}} int reply_add_keyval */
+#if WITH_DEBUG
static void reply_dump (const ros_reply_t *r) /* {{{ */
{
if (r == NULL)
static void reply_dump (const ros_reply_t *r) /* {{{ */
{
if (r == NULL)
@@
-188,6
+195,9
@@
static void reply_dump (const ros_reply_t *r) /* {{{ */
reply_dump (r->next);
} /* }}} void reply_dump */
reply_dump (r->next);
} /* }}} void reply_dump */
+#else
+# define reply_dump(foo) /**/
+#endif
static void reply_free (ros_reply_t *r) /* {{{ */
{
static void reply_free (ros_reply_t *r) /* {{{ */
{
@@
-338,6
+348,12
@@
static int send_command (ros_connection_t *c, /* {{{ */
size_t i;
int status;
size_t i;
int status;
+ assert (c != NULL);
+ assert (command != NULL);
+
+ if ((args == NULL) && (args_num > 0))
+ return (EINVAL);
+
/* FIXME: For debugging only */
memset (buffer, 0, sizeof (buffer));
/* FIXME: For debugging only */
memset (buffer, 0, sizeof (buffer));
@@
-383,7
+399,7
@@
static int send_command (ros_connection_t *c, /* {{{ */
else
return (errno);
}
else
return (errno);
}
- assert (
bytes_written
<= buffer_size);
+ assert (
((size_t) bytes_written)
<= buffer_size);
buffer_ptr += bytes_written;
buffer_size -= bytes_written;
buffer_ptr += bytes_written;
buffer_size -= bytes_written;
@@
-402,6
+418,8
@@
static int read_word (ros_connection_t *c, /* {{{ */
if ((buffer == NULL) || (*buffer_size < 1))
return (EINVAL);
if ((buffer == NULL) || (*buffer_size < 1))
return (EINVAL);
+ assert (c != NULL);
+
/* read one byte from the socket */
status = read_exact (c->fd, word_length, 1);
if (status != 0)
/* read one byte from the socket */
status = read_exact (c->fd, word_length, 1);
if (status != 0)
@@
-548,6
+566,9
@@
static ros_reply_t *receive_reply (ros_connection_t *c) /* {{{ */
ros_reply_t *head;
ros_reply_t *tail;
ros_reply_t *head;
ros_reply_t *tail;
+ if (c == NULL)
+ return (NULL);
+
head = NULL;
tail = NULL;
head = NULL;
tail = NULL;
@@
-629,16
+650,22
@@
static int create_socket (const char *node, const char *service) /* {{{ */
return (-1);
} /* }}} int create_socket */
return (-1);
} /* }}} int create_socket */
-static int login2_handler (ros_connection_t *c, const ros_reply_t *r, /* {{{ */
- void *user_data)
+static int login2_handler (__attribute__((unused)) ros_connection_t *c, /* {{{ */
+ const ros_reply_t *r,
+ __attribute__((unused)) void *user_data)
{
if (r == NULL)
return (EINVAL);
{
if (r == NULL)
return (EINVAL);
- printf ("login2_handler has been called.\n");
reply_dump (r);
reply_dump (r);
- if (strcmp (r->status, "done") != 0)
+ if (strcmp (r->status, "trap") == 0)
+ {
+ ros_debug ("login2_handler: Logging in failed: %s.\n",
+ ros_reply_param_val_by_key (r, "message"));
+ return (EACCES);
+ }
+ else if (strcmp (r->status, "done") != 0)
{
ros_debug ("login2_handler: Unexpected status: %s.\n", r->status);
return (EPROTO);
{
ros_debug ("login2_handler: Unexpected status: %s.\n", r->status);
return (EPROTO);
@@
-721,8
+748,6
@@
static int login_handler (ros_connection_t *c, const ros_reply_t *r, /* {{{ */
* =ret=ebddd18303a54111e2dea05a92ab46b4
* -- >8 --
*/
* =ret=ebddd18303a54111e2dea05a92ab46b4
* -- >8 --
*/
-
- printf ("login_handler has been called.\n");
reply_dump (r);
if (strcmp (r->status, "done") != 0)
reply_dump (r);
if (strcmp (r->status, "done") != 0)
@@
-797,6
+822,13
@@
ros_connection_t *ros_connect (const char *node, const char *service, /* {{{ */
status = ros_query (c, "/login", /* args num = */ 0, /* args = */ NULL,
login_handler, &user_data);
status = ros_query (c, "/login", /* args num = */ 0, /* args = */ NULL,
login_handler, &user_data);
+ if (status != 0)
+ {
+ ros_disconnect (c);
+ errno = status;
+ return (NULL);
+ }
+
return (c);
} /* }}} ros_connection_t *ros_connect */
return (c);
} /* }}} ros_connection_t *ros_connect */
@@
-824,6
+856,9
@@
int ros_query (ros_connection_t *c, /* {{{ */
int status;
ros_reply_t *r;
int status;
ros_reply_t *r;
+ if ((c == NULL) || (command == NULL) || (handler == NULL))
+ return (EINVAL);
+
status = send_command (c, command, args_num, args);
if (status != 0)
return (status);
status = send_command (c, command, args_num, args);
if (status != 0)
return (status);