be more carful wrt. signed vs. unsigned argument passing
[paraslash.git] / mysql_selector.c
index b2a925e09311a6cc71bf45c488c73eca8a163e99..a6c667725bee0ddce273621dbc9d9877345580b3 100644 (file)
@@ -228,11 +228,11 @@ out:
        return ret;
 }
 
-static char *escape_blob(const char* old, int size)
+static char *escape_blob(const char* old, size_t size)
 {
        char *new;
 
-       if (!mysql_ptr || size < 0)
+       if (!mysql_ptr)
                return NULL;
        new = para_malloc(2 * size * sizeof(char) + 1);
        mysql_real_escape_string(mysql_ptr, new, old, size);
@@ -368,8 +368,8 @@ int com_picadd(int fd, int argc, char *argv[])
  * print results to fd
  */
 static int print_results(int fd, void *result,
-               unsigned int top, unsigned int left,
-               unsigned int bottom, unsigned int right)
+               my_ulonglong top, my_ulonglong left,
+               my_ulonglong bottom, my_ulonglong right)
 {
        unsigned int i,j;
        int ret;
@@ -399,7 +399,7 @@ int com_verb(int fd, int argc, char *argv[])
 {
        void *result = NULL;
        int ret;
-       unsigned int num_rows, num_fields;
+       my_ulonglong num_rows, num_fields, top = 0, left = 0;
        char *tmp;
 
        if (argc < 2)
@@ -416,7 +416,7 @@ int com_verb(int fd, int argc, char *argv[])
        num_rows = mysql_num_rows(result);
        ret = 1;
        if (num_fields && num_rows)
-               ret = print_results(fd, result, 0, 0, num_rows - 1,
+               ret = print_results(fd, result, top, left, num_rows - 1,
                        num_fields - 1);
        mysql_free_result(result);
        return ret;
@@ -435,7 +435,7 @@ static void *get_all_attributes(void)
                mysql_free_result(result);
                return NULL;
        }
-       mysql_data_seek(result, 4); /* skip Lastplayed, Numplayed... */
+       mysql_data_seek(result, (my_ulonglong)4); /* skip Lastplayed, Numplayed... */
        return result;
 }
 
@@ -446,13 +446,18 @@ int com_laa(int fd, int argc, __a_unused char *argv[])
 {
        void *result;
        int ret;
+       my_ulonglong top = 0, left = 0, bottom, right = 0;
 
        if (argc != 1)
                return -E_MYSQL_SYNTAX;
        result = get_all_attributes();
        if (!result)
                return -E_NOATTS;
-       ret = print_results(fd, result, 0, 0, mysql_num_rows(result) - 5, 0);
+       bottom = mysql_num_rows(result);
+       if (bottom < 5)
+               return -E_MYSQL_SYNTAX;
+       bottom -= 5;
+       ret = print_results(fd, result, top, left, bottom, right);
        mysql_free_result(result);
        return ret;
 }
@@ -465,7 +470,7 @@ int com_hist(int fd, int argc, char *argv[])
        int ret;
        void *result = NULL;
        char *q, *atts;
-       unsigned int num_rows;
+       my_ulonglong num_rows, top = 0, left = 0, right = 1;
 
        if (argc > 3)
                return -E_MYSQL_SYNTAX;
@@ -488,7 +493,7 @@ int com_hist(int fd, int argc, char *argv[])
        num_rows = mysql_num_rows(result);
        ret = 1;
        if (num_rows)
-               ret = print_results(fd, result, 0, 0, num_rows - 1, 1);
+               ret = print_results(fd, result, top, left, num_rows - 1, right);
        mysql_free_result(result);
        return ret;
 }
@@ -501,6 +506,7 @@ int com_last(int fd, int argc, char *argv[])
        void *result = NULL;
        char *q;
        int num, ret;
+       my_ulonglong top = 0, left = 0, right = 0;
 
        if (argc < 2)
                num = 10;
@@ -514,7 +520,8 @@ int com_last(int fd, int argc, char *argv[])
        free(q);
        if (!result)
                return -E_NORESULT;
-       ret = print_results(fd, result, 0, 0, mysql_num_rows(result) - 1, 0);
+       ret = print_results(fd, result, top, left, mysql_num_rows(result) - 1,
+               right);
        mysql_free_result(result);
        return ret;
 }
@@ -524,7 +531,7 @@ int com_mbox(int fd, int argc, char *argv[])
        void *result;
        MYSQL_ROW row;
        int ret;
-       unsigned int num_rows, num_fields;
+       my_ulonglong num_rows, num_fields, top = 0, left = 0;
        char *query = para_strdup("select concat('From foo@localhost ', "
                "date_format(Lastplayed, '%a %b %e %T %Y'), "
                "'\nReceived: from\nTo: bar\n");
@@ -571,7 +578,8 @@ int com_mbox(int fd, int argc, char *argv[])
        num_rows = mysql_num_rows(result);
        if (!num_fields || !num_rows)
                goto out;
-       ret = print_results(fd, result, 0, 0, num_rows - 1, num_fields - 1);
+       ret = print_results(fd, result, top, left, num_rows - 1,
+               num_fields - 1);
 out:
        free(query);
        if (result)
@@ -592,7 +600,8 @@ static char *get_atts(char *name, int verbose)
        void *result = NULL, *result2 = NULL;
        MYSQL_ROW row, row2;
        int i;
-       unsigned num_fields;
+       my_ulonglong num_fields, offset = 4; /* skip Lastplayed, Numplayed... */
+
 
        result2 = get_all_attributes();
        if (!result2)
@@ -609,7 +618,7 @@ static char *get_atts(char *name, int verbose)
        num_fields = mysql_num_fields(result);
        if (num_fields < 5)
                goto out;
-       mysql_data_seek(result2, 4); /* skip Lastplayed, Numplayed... */
+       mysql_data_seek(result2, offset);
        row = mysql_fetch_row(result);
        if (!row)
                goto out;
@@ -994,7 +1003,7 @@ static int get_pic_id_by_name(char *name)
 {
        char *q, *ebn;
        void *result = NULL;
-       long unsigned ret;
+       int ret;
        MYSQL_ROW row;
 
        if (!(ebn = escaped_basename(name)))
@@ -1008,7 +1017,7 @@ static int get_pic_id_by_name(char *name)
        row = mysql_fetch_row(result);
        ret = -E_NOROW;
        if (row && row[0])
-               ret = atol(row[0]);
+               ret = atoi(row[0]);
        mysql_free_result(result);
        return ret;
 }
@@ -1367,7 +1376,7 @@ int com_ls(int fd, int argc, char *argv[])
        char *q;
        void *result;
        int ret;
-       unsigned int num_rows;
+       my_ulonglong num_rows, top = 0, left = 0, right = 0;
 
        if (argc > 2)
                return -E_MYSQL_SYNTAX;
@@ -1387,7 +1396,7 @@ int com_ls(int fd, int argc, char *argv[])
        num_rows = mysql_num_rows(result);
        ret = 1;
        if (num_rows)
-               ret = print_results(fd, result, 0, 0, num_rows - 1, 0);
+               ret = print_results(fd, result, top, left, num_rows - 1, right);
        mysql_free_result(result);
        return ret;
 }
@@ -1520,11 +1529,12 @@ static int com_ps_ns(__a_unused int fd, int argc, char *argv[])
        char *query, *stream = get_current_stream();
        void *result = get_result("select name from streams");
        MYSQL_ROW row;
-       int match = -1, ret, i;
-       unsigned int num_rows;
+       int ret;
+       my_ulonglong num_rows, match, i;
 
+       ret = -E_MYSQL_SYNTAX;
        if (argc != 1)
-               return -E_MYSQL_SYNTAX;
+               goto out;
        ret = -E_NORESULT;
        if (!result)
                goto out;
@@ -1539,14 +1549,13 @@ static int com_ps_ns(__a_unused int fd, int argc, char *argv[])
                        goto out;
                if (!strcmp(row[0], "current_stream"))
                        continue;
-               if (!strcmp(row[0], stream)) {
-                       match = i;
+               if (!strcmp(row[0], stream))
                        break;
-               }
        }
        ret = -E_NO_STREAM;
-       if (match < 0)
+       if (i == num_rows)
                goto out;
+       match = i;
        if (!strcmp(argv[0], "ps"))
                i = match > 0? match - 1 : num_rows - 1;
        else
@@ -1558,8 +1567,7 @@ static int com_ps_ns(__a_unused int fd, int argc, char *argv[])
                goto out;
        if (!strcmp(row[0], "current_stream")) {
                if (!strcmp(argv[0], "ps")) {
-                       i = match - 2;
-                       i = i < 0? i + num_rows : i;
+                       i = match < 2? match + num_rows - 2 : match - 2;
                } else {
                        i = match + 2;
                        i = i > num_rows - 1? i - num_rows : i;
@@ -1934,9 +1942,9 @@ static int com_vrfy_clean(int fd, int argc, __a_unused char *argv[])
        char *query;
        int ret, vrfy_mode = strcmp(argv[0], "clean");
        void *result = NULL;
-       unsigned int num_rows;
        MYSQL_ROW row;
        char *escaped_name;
+       my_ulonglong num_rows, top = 0, left = 0, right = 0;
 
        if (argc != 1)
                return -E_MYSQL_SYNTAX;
@@ -1953,7 +1961,7 @@ static int com_vrfy_clean(int fd, int argc, __a_unused char *argv[])
        if (vrfy_mode) {
                send_va_buffer(fd, "found %i invalid entr%s\n", num_rows,
                        num_rows == 1? "y" : "ies");
-               ret = print_results(fd, result, 0, 0, num_rows - 1, 0);
+               ret = print_results(fd, result, top, left, num_rows - 1, right);
                goto out;
        }
        while ((row = mysql_fetch_row(result))) {
@@ -2141,14 +2149,17 @@ success:
 static int init_mysql_server(void)
 {
        char *u = conf.mysql_user_arg? conf.mysql_user_arg : para_logname();
+       unsigned int port;
 
        mysql_ptr = mysql_init(NULL);
        if (!mysql_ptr) {
                PARA_CRIT_LOG("%s", "mysql init error\n");
                return -E_NOTCONN;
        }
-       PARA_DEBUG_LOG("connecting: %s@%s:%d\n", u, conf.mysql_host_arg,
-               conf.mysql_port_arg);
+       if (conf.mysql_port_arg < 0)
+               return -E_MYSQL_SYNTAX;
+       port = conf.mysql_port_arg;
+       PARA_DEBUG_LOG("connecting: %s@%s:%d\n", u, conf.mysql_host_arg, port);
        if (!conf.mysql_user_arg)
                free(u);
        /*
@@ -2160,7 +2171,7 @@ static int init_mysql_server(void)
                        conf.mysql_user_arg,
                        conf.mysql_passwd_arg,
                        conf.mysql_database_arg,
-                       conf.mysql_port_arg, NULL, 0))) {
+                       port, NULL, 0))) {
                PARA_CRIT_LOG("%s", "connect error\n");
                return -E_NOTCONN;
        }