int main (int argc, char *argv[]) { int rc = 0; uint8_t db_type = PATTS_DBCONN_MYSQL; char *host = NULL, *user = NULL, *passwd = NULL, *database = NULL; char *port = "0"; struct option longopts[] = { {"database", required_argument, 0, 'd'}, {"help", no_argument, 0, 'e'}, {"host", required_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, {"user", required_argument, 0, 'u'}, {"version", no_argument, 0, 'v'}, {0, 0, 0, 0} }; if (argc > 1) { int c; int longindex; long temp_port; while ((c = getopt_long (argc, argv, "d:h:p:u:v", longopts, &longindex)) != -1) { switch (c) { case 'd': database = optarg; break; case 'e': puts (USAGE_INFO); return 0; case 'h': host = optarg; break; case 'p': c = sscanf (optarg, "%ld", &temp_port); if (c != 1) { fprintf (stderr, "patts-upg: %s is not a valid number\n", optarg); return 2; } if (temp_port < 0 || temp_port > 65535) { fprintf (stderr, "patts-upg: %s is not a valid port\n", optarg); return 2; } port = optarg; break; case 'u': user = optarg; break; case 'v': printf (VERSION_INFO, patts_get_library_version ()); return 0; case '?': return 1; }; } } bool free_host = false, free_user = false, free_pw = false, free_db = false; char *check; if (!host) { host = malloc (128 * sizeof (char)); if (!host) { fprintf (stderr, "patts-upg: Out of memory\n"); rc = PATTS_MEMORYERROR; goto end; } free_host = true; printf ("Server (default: localhost): "); check = fgets (host, 128, stdin); if (!check) { rc = PATTS_OVERFLOW; goto end; } trim (host); if (strlen (host) == 0) strcpy (host, "localhost"); } if (!user) { user = malloc (17 * sizeof (char)); if (!user) { fprintf (stderr, "patts-upg: Out of memory\n"); rc = PATTS_MEMORYERROR; goto end; } free_user = true; printf ("User (default: root): "); check = fgets (user, 17, stdin); if (!check) { rc = PATTS_OVERFLOW; goto end; } trim (user); if (strlen (user) == 0) strcpy (user, "root"); } passwd = patts_malloc (PASS_MAX * sizeof (char)); if (!passwd) { fprintf (stderr, "patts-upg: Out of memory\n"); rc = PATTS_MEMORYERROR; goto end; } free_pw = true; check = getpass ("Password (will not echo): "); if (!check) { rc = PATTS_OVERFLOW; goto end; } size_t plen = strlen (check); if (plen >= PASS_MAX) { rc = PATTS_OVERFLOW; goto end; } for (size_t i = 0; i <= plen; ++i) { passwd[i] = check[i]; check[i] = 0xDF; } if (!database) { database = malloc (128 * sizeof (char)); if (!database) { fprintf (stderr, "patts-upg: Out of memory\n"); rc = PATTS_MEMORYERROR; goto end; } free_db = true; printf ("Database (default: patts): "); check = fgets (database, 128, stdin); if (!check) { rc = PATTS_OVERFLOW; goto end; } trim (database); if (strlen (check) == 0) strcpy (database, "patts"); } sqon_init (); rc = patts_upgrade_db (db_type, host, user, passwd, database, port); if (rc) { if (PATTS_UNEXPECTED == rc) { fprintf (stderr, "patts-upg: An unexpected error occurred. This\n" "can happen if the database has a later version\n" "than is supported by your version of libpatts.\n\n"); } else { fprintf (stderr, "patts-upg: Error %d occurred.\n\n", rc); } fprintf (stderr, "patts-upg: Your libpatts version is \"%s\".\n" "Contact Delwink support for assistance.\n", patts_get_library_version ()); goto end; } puts ("patts-upg: Database upgrade completed successfully!"); end: if (free_host) free (host); if (free_user) free (user); if (free_pw) patts_free (passwd); if (free_db) free (database); return !!rc; }
int patts_init (uint8_t db_type, const char *host, const char *user, const char *passwd, const char *database, const char *port) { int rc = 0; const char *fmt = "SELECT isAdmin FROM User WHERE dbUser='******'"; char *query, *user_info, *esc_user; const char *isAdmin; json_t *list, *user_cols; size_t qlen = 1; if (strlen (user) >= 8) return PATTS_OVERFLOW; strcpy (user_id, user); sqon_init (); PATTSDB = sqon_new_connection (db_type, host, user, passwd, database, port); rc = sqon_escape (patts_get_db (), user, &esc_user, false); if (rc) return rc; qlen += strlen (fmt) - 2; qlen += strlen (esc_user); query = sqon_malloc (qlen * sizeof (char)); if (NULL == query) { sqon_free (esc_user); return PATTS_MEMORYERROR; } snprintf (query, qlen, fmt, esc_user); rc = sqon_query (patts_get_db (), query, &user_info, NULL); sqon_free (query); sqon_free (esc_user); if (rc) return rc; list = json_loads (user_info, 0, NULL); sqon_free (user_info); if (NULL == list) return PATTS_LOADERROR; if (0 == json_array_size (list)) return PATTS_NOSUCHUSER; user_cols = json_array_get (list, 0); isAdmin = json_string_value (json_object_get (user_cols, "isAdmin")); if (!strcmp (isAdmin, "\001") || !strcmp (isAdmin, "1")) HAVE_ADMIN = true; else if (!strcmp (isAdmin, "") || !strcmp (isAdmin, "0")) HAVE_ADMIN = false; else rc = PATTS_UNEXPECTED; json_decref (list); return rc; }