From f69847de79a407ef6d32acd3d708826133967947 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Fri, 15 Jul 2022 17:16:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE:=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- address.c | 28 ++++++++ address.h | 13 ++++ arguments.c | 1 + db.c | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++-- db.h | 17 ++++- freerdp.db | Bin 57344 -> 81920 bytes gui.c | 53 ++++++++++++--- 7 files changed, 286 insertions(+), 16 deletions(-) create mode 100644 address.c create mode 100644 address.h diff --git a/address.c b/address.c new file mode 100644 index 0000000..9c603f2 --- /dev/null +++ b/address.c @@ -0,0 +1,28 @@ +/* + * address.c + * + * Created on: 15 июл. 2022 г. + * Author: alexander + */ + +#include "address.h" + +#include +#include +#include +#include + +#include + +char *getHostIP(char *dnsName) +{ + char *result = NULL; + struct hostent *he = gethostbyname(dnsName); + if (he) + { + char *ip = inet_ntoa(*(struct in_addr*)he->h_addr); + result = (char *)malloc(sizeof(char) * strlen(ip)); + strcpy(result, ip); + } + return result; +} diff --git a/address.h b/address.h new file mode 100644 index 0000000..4f9327e --- /dev/null +++ b/address.h @@ -0,0 +1,13 @@ +/* + * address.h + * + * Created on: 15 июл. 2022 г. + * Author: alexander + */ + +#ifndef ADDRESS_H_ +#define ADDRESS_H_ + +char *getHostIP(char *dnsName); + +#endif /* ADDRESS_H_ */ diff --git a/arguments.c b/arguments.c index f4903c5..2f23097 100644 --- a/arguments.c +++ b/arguments.c @@ -15,6 +15,7 @@ void settingsLoad() { + dbGetHostsList(); if (!dbLoadData()) { addParameterKey(PARAMETER_XFREERDP, "xfreerdp", true, true, NULL, NULL); diff --git a/db.c b/db.c index ce10f9b..7e176f6 100644 --- a/db.c +++ b/db.c @@ -63,6 +63,8 @@ static int dbLoad(void *NotUsed, int argc, char **argv, char **azColName) addParameterValue(atoi(parameters[0]), atoi(parameters[4]), parameters[5], atoi(parameters[6])); } + free(parameters); + return 0; } @@ -96,6 +98,75 @@ bool dbLoadData() return true; } +static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColName) +{ + Hosts *hosts = *(Hosts **)answer; + Host *host = (Host*) malloc(sizeof(Host)); + host->data = (char **) malloc(sizeof(char*) * argc); + host->size = argc; + + for (int i = 0; i < argc; i++) + { + host->data[i] = (char *) malloc(sizeof(char) * strlen(argv[i])); + strcpy(host->data[i], argv[i]); + } + + Host **tmp = hosts->host; + hosts->host = (Host**) malloc(sizeof(Host*) * ++hosts->size); + for (size_t i = 0; i < hosts->size - 1; ++i) + { + hosts->host[i] = tmp[i]; + } + if (tmp) + { + free(tmp); + } + hosts->host[hosts->size - 1] = host; + + return 0; +} + +Hosts *dbGetHostsList() +{ + sqlite3 *db = dbGetBase("freerdp.db"); + if (!db) + { + return false; + } + + char *err_msg = 0; + char *sql = "SELECT ROW_NUMBER () OVER (ORDER BY `hosts`.`ip`) `item`, `hosts`.`dns` as `dns`, `hosts`.`set` as `set` FROM `hosts` as `hosts`"; + + Hosts *hosts = (Hosts *) malloc(sizeof(Hosts)); + hosts->size = 0; + hosts->host = NULL; + + if (sqlite3_exec(db, sql, dbCreateHostsList, &hosts, &err_msg) != SQLITE_OK) + { + fprintf(stderr, "Ошибка выполнения запроса: %s\n", err_msg); + sqlite3_free(err_msg); + sqlite3_close(db); + return false; + } + + sqlite3_close(db); + + return hosts; +} + +void dbFreeHosts(Hosts *hosts) +{ + for (size_t i = 0; i < hosts->size; ++i) + { + for (size_t j = 0; j < hosts->host[i]->size; ++j) + { + free(hosts->host[i]->data[j]); + } + free(hosts->host[i]); + } + free(hosts); +} + bool dbWriteParameter(Parameter name, bool set) { sqlite3 *db = dbGetBase("freerdp.db"); @@ -169,7 +240,116 @@ bool dbWriteValue(Value name, bool set) return true; } -bool dbSetValueCurrent(Value name, char *current) +int dbAddServer(char *ip, char *dns) +{ + int result = 0; + + if (!(ip && strlen(ip) && dns && strlen(dns))) + return -1; + + sqlite3 *db = dbGetBase("freerdp.db"); + if (!db) + { + return -2; + } + + sqlite3_stmt *res; + char *sql = "SELECT * FROM `hosts` WHERE `ip` = ?"; + if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK) + { + sqlite3_bind_text(res, 1, ip, -1, 0); + } + else + { + sqlite3_finalize(res); + sqlite3_close(db); + return -3; + } + + if (sqlite3_step(res) == SQLITE_ROW) + { + int id = atoi((const char *)sqlite3_column_text(res, 0)); + sqlite3_finalize(res); + + sql = "UPDATE `hosts` set `set` = 0"; + if (sqlite3_exec(db, sql, NULL, NULL, NULL) == SQLITE_OK) + { + sql = "UPDATE `hosts` set `dns` = ?, `set` = 1 where id = ?"; + + if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK) + { + sqlite3_bind_text(res, 1, dns, -1, 0); + sqlite3_bind_int(res, 2, id); + } + + if (sqlite3_step(res) == SQLITE_BUSY) + { + fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip); + result = 5; + } + if (sqlite3_step(res) == SQLITE_ERROR) + { + fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip); + result = 4; + } + if (sqlite3_step(res) == SQLITE_DONE) + { + fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip); + result = 3; + } + } + else + { + result = -5; + } + } + else if(sqlite3_step(res) == SQLITE_DONE) + { + sqlite3_finalize(res); + + sql = "UPDATE `hosts` set `set` = 0"; + if (sqlite3_exec(db, sql, NULL, NULL, NULL) == SQLITE_OK) + { + sql = "INSERT INTO `hosts` (`ip`, `dns`, `set`) VALUES (?, ?, 1)"; + if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK) + { + sqlite3_bind_text(res, 1, ip, -1, 0); + sqlite3_bind_text(res, 2, dns, -1, 0); + } + + if (sqlite3_step(res) == SQLITE_BUSY) + { + fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip); + result = 2; + } + if (sqlite3_step(res) == SQLITE_ERROR) + { + fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip); + result = 1; + } + if (sqlite3_step(res) == SQLITE_DONE) + { + fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip); + result = 0; + } + } + else + { + result = -6; + } + } + else + { + result = -4; + } + + sqlite3_finalize(res); + sqlite3_close(db); + + return result; +} + +bool dbSetUserNameCurrent(char *current) { sqlite3 *db = dbGetBase("freerdp.db"); if (!db) @@ -185,21 +365,21 @@ bool dbSetValueCurrent(Value name, char *current) { sqlite3_bind_text(res, 1, text, -1, 0); sqlite3_bind_int(res, 2, text ? true : false); - sqlite3_bind_int(res, 3, name); + sqlite3_bind_int(res, 3, VALUE_USERNAME); } if (sqlite3_step(res) == SQLITE_BUSY) { - fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(name)->key); + fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(VALUE_USERNAME)->key); } if (sqlite3_step(res) == SQLITE_ERROR) { - fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(name)->key); + fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(VALUE_USERNAME)->key); } if (sqlite3_step(res) == SQLITE_DONE) { - fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(name)->key); + fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(VALUE_USERNAME)->key); } sqlite3_finalize(res); diff --git a/db.h b/db.h index 7fd747b..325bcce 100644 --- a/db.h +++ b/db.h @@ -11,9 +11,24 @@ #include "parameter.h" #include "value.h" +typedef struct Host +{ + char **data; + size_t size; +} Host; + +typedef struct Hosts +{ + Host **host; + size_t size; +} Hosts; + bool dbLoadData(); +Hosts *dbGetHostsList(); +void dbFreeHosts(Hosts *hosts); bool dbWriteParameter(Parameter name, bool set); bool dbWriteValue(Value name, bool set); -bool dbSetValueCurrent(Value name, char *current); +bool dbSetUserNameCurrent(char *current); +int dbAddServer(char *ip, char *dns); #endif /* DB_H_ */ diff --git a/freerdp.db b/freerdp.db index 36e8c58d496764fe67b02224383dcb2516abed26..2e536902f0fc7f054838d9726a20e14e77337ad4 100644 GIT binary patch delta 749 zcmZ8eO=uHA6rRccO*Ywmo3^l8t!`IC8XDJZ3X(!Kjgo^HQ{biI(FWRx zgH;w@!#eE32Uvxtc3`>&IzStZ(wq8kcvVKluAJ1@6G;Xk(f*wfG#_2(mzO>AGBj;} z{uQvNF^B3)CEfm7K9RST#xHP#HRn?#c!5|bBlrxDpiBj(mV>(^0*8V@Vnz)!>VUre z^+}#Xp^(>{j2Y&+xVt7^EiBz$EX^0G;EYKfIKTMNI8LZ&l=MVKY_caBL9~0S+toYY zjP=@45e}%&Jp_MXANHV4Z{|G=a}36U;6$FMo3Tzs2*VKa95)n2bU4^R@Cn|+ci5n! v6}S;#Lb&H5YQ*`&4E046CW!k_EGSH<&wA8|bERCMmf}3g z^_=55Ul;F9zWw~W`FC$N6sTlZ<~`4N3aAko0Cir4@qz4<6Bi!c{G8(z3kw4m1H&oY diff --git a/gui.c b/gui.c index ef005af..49ed722 100644 --- a/gui.c +++ b/gui.c @@ -14,6 +14,7 @@ #include "node_settings.h" #include "images.h" #include "arguments.h" +#include "address.h" #include "db.h" @@ -24,10 +25,13 @@ static int guiExit(Ihandle *self) static int guiConnect(Ihandle *self) { - setParameterValue(PARAMETER_SERVER, VALUE_SERVER, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "LINEVALUE")); - dbSetValueCurrent(VALUE_SERVER, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "LINEVALUE")); + char *result = getHostIP(IupGetAttribute(IupGetDialogChild(self, "SERVER"), "VALUE")); + + if (!result) + return IUP_DEFAULT; + + setParameterValue(PARAMETER_SERVER, VALUE_SERVER, result); setParameterValue(PARAMETER_USERNAME, VALUE_USERNAME, IupGetAttribute(IupGetDialogChild(self, "USER"), "LINEVALUE")); - dbSetValueCurrent(VALUE_USERNAME, IupGetAttribute(IupGetDialogChild(self, "USER"), "LINEVALUE")); setParameterValue(PARAMETER_PASSWORD, VALUE_PASSWORD, IupGetAttribute(IupGetDialogChild(self, "PASSWORD"), "LINEVALUE")); Arguments args; @@ -39,9 +43,40 @@ static int guiConnect(Ihandle *self) printf("\n"); freeArguments(&args); + if (!dbAddServer(result, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "VALUE"))) + { + IupSetAttribute(IupGetDialogChild(self, "SERVER"), "APPENDITEM", IupGetAttribute(IupGetDialogChild(self, "SERVER"), "VALUE")); + } +// if (free_rdp_connect(args.argc, args.argv) != XF_EXIT_DNS_NAME_NOT_FOUND) +// { +// dbSetValueCurrent(VALUE_SERVER, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "LINEVALUE")); + dbSetUserNameCurrent(IupGetAttribute(IupGetDialogChild(self, "USER"), "LINEVALUE")); +// } + return IUP_DEFAULT; } +static void createHostsList(Ihandle *iupList) +{ + Hosts *hosts = dbGetHostsList(); + char *indexItem = NULL; + char *serverName = NULL; + + for (size_t i = 0; i < hosts->size; ++i) + { + Host *host = hosts->host[i]; + indexItem = (char *)malloc(sizeof(char) * strlen(host->data[0])); + strcpy(indexItem, host->data[0]); + serverName = (char *)malloc(sizeof(char) * strlen(host->data[1])); + strcpy(serverName, host->data[1]); + + IupSetAttribute(iupList, indexItem, serverName); + if (atoi(host->data[2])) + IupSetAttribute(iupList, "VALUE", serverName); + } + dbFreeHosts(hosts); +} + Ihandle* guiStart() { Ihandle *dlg; @@ -63,16 +98,16 @@ Ihandle* guiStart() labelServer = IupLabel("Компьютер:"); IupSetAttribute(labelServer, "SIZE", "80x16"); - // IupSetAttribute(labelServer, "FONT", "Helvetica, 14"); IupSetAttribute(labelServer, "ALIGNMENT", "ARIGHT:ACENTER"); IupSetAttribute(labelServer, "PADDING", "5"); - inputServer = IupText(NULL); + + inputServer = IupList(NULL); IupSetAttribute(inputServer, "NAME", "SERVER"); IupSetAttribute(inputServer, "TIP", "IP-адрес или имя удаленного сервера (обязательно)"); - IupSetAttribute(inputServer, "VALUE", getSetValueCurrent(PARAMETER_SERVER)); - // IupSetAttribute(inputServer, "BORDER", "NO"); + createHostsList(inputServer); IupSetAttribute(inputServer, "SIZE", "100"); - // IupSetAttribute(inputServer, "PADDING", "10x"); + IupSetAttribute(inputServer, "EDITBOX", "YES"); + IupSetAttribute(inputServer, "DROPDOWN", "YES"); hBoxServer = IupHbox(labelServer, inputServer, NULL); IupSetAttribute(hBoxServer, "MARGIN", "10x10"); @@ -85,7 +120,6 @@ Ihandle* guiStart() IupSetAttribute(inputUser, "TIP", "<домен>\\<имя пользователя> (обязательно)"); IupSetAttribute(inputUser, "VALUE", getSetValueCurrent(PARAMETER_USERNAME)); IupSetAttribute(inputUser, "SIZE", "100"); - // IupSetAttribute(inputUser, "PADDING", "10x10"); hBoxUser = IupHbox(labelUser, inputUser, NULL); IupSetAttribute(hBoxUser, "MARGIN", "10x0"); @@ -95,7 +129,6 @@ Ihandle* guiStart() IupSetAttribute(labelPassword, "PADDING", "5"); inputPassword = IupText(NULL); IupSetAttribute(inputPassword, "SIZE", "100"); - // IupSetAttribute(inputPassword, "PADDING", "10x10"); IupSetAttribute(inputPassword, "NAME", "PASSWORD"); IupSetAttribute(inputPassword, "TIP", "Пароль пользователя (необязательно)"); IupSetAttribute(inputPassword, "VALUE", getSetValueCurrent(PARAMETER_PASSWORD));