From f53fc681aba6edd9bb9e664dde710414a98964d9 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Mon, 18 Jul 2022 14:13:49 +0300 Subject: [PATCH 1/4] =?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?=D0=BC=D0=BE=D0=BD=D0=B8=D1=82=D0=BE=D1=80=D0=BE=D0=B2,=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BC=D0=BE=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arguments.c | 46 ++----- db.c | 178 +++++++++++++++++++++++++++- db.h | 20 ++++ freerdp.db | Bin 81920 -> 81920 bytes monitor.c | 82 +++++++++++++ monitor.h | 16 +++ xrandr.c => rxrandr.c | 2 +- xrandr.h => rxrandr.h | 0 xrandr_broker.c => rxrandr_broker.c | 3 +- settings.c | 21 ++-- 10 files changed, 313 insertions(+), 55 deletions(-) create mode 100644 monitor.c create mode 100644 monitor.h rename xrandr.c => rxrandr.c (99%) rename xrandr.h => rxrandr.h (100%) rename xrandr_broker.c => rxrandr_broker.c (96%) diff --git a/arguments.c b/arguments.c index 30da47c..bf42643 100644 --- a/arguments.c +++ b/arguments.c @@ -10,51 +10,21 @@ #include "node_settings.h" #include "concat.h" -#include "xrandr.h" +#include "rxrandr.h" #include "db.h" +#include "monitor.h" void settingsLoad() { -// dbGetHostsList(); - if (!dbLoadData()) + dbLoadData(); + + Monitors *monitors = dbGetMonitorsList(); + for (size_t i = 0; i < monitors->size; ++i) { - addParameterKey(PARAMETER_XFREERDP, "xfreerdp", true, true, NULL, NULL); - addParameterKey(PARAMETER_SERVER, "/v:", true, true, NULL, NULL); - addParameterKey(PARAMETER_USERNAME, "/u:", true, true, NULL, NULL); - addParameterKey(PARAMETER_PASSWORD, "/p:", true, true, NULL, NULL); - addParameterKey(PARAMETER_CERTIGNORE, "/cert-ignore", true, true, NULL, NULL); - addParameterKey(PARAMETER_THEMES, "-themes", false, true, NULL, NULL); - addParameterKey(PARAMETER_WALLPAPER, "-wallpaper", false, true, NULL, NULL); - addParameterKey(PARAMETER_ENCRYPTION, "-encryption", false, true, NULL, NULL); - addParameterKey(PARAMETER_FONTS, "-fonts", false, true, NULL, NULL); - addParameterKey(PARAMETER_SOUND, "/sound", false, true, NULL, NULL); - addParameterKey(PARAMETER_COMPRESSION, "+compression", false, true, NULL, NULL); - addParameterKey(PARAMETER_FULLSCREEN, "/f", false, true, NULL, NULL); - addParameterKey(PARAMETER_MULTIMONITOR, "/multimon", false, true, getParameter(PARAMETER_FULLSCREEN), NULL); - addParameterKey(PARAMETER_AUTHENTICATION, "-authentication", true, true, NULL, NULL); - addParameterKey(PARAMETER_SECURITY, "/sec:", true, true, NULL, NULL); - addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_TLS, "tls", true); - addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_RDP, "rdp", false); - addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_NLA, "nla", false); - addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_EXT, "ext", false); - addParameterKey(PARAMETER_BITSPERPIXEL, "/bpp:", true, true, NULL, NULL); - addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_8, "8", true); - addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_16, "16", false); - addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_24, "24", false); - addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_32, "32", false); - - addParameterKey(PARAMETER_USB, "/a:drive,USB,", true, true, NULL, NULL); - addParameterValue(PARAMETER_USB, VALUES_USB_DRIVE, "/mnt/usbdevice", true); - - addParameterKey(PARAMETER_MONITORS, "/monitors:", false, true, getParameter(PARAMETER_FULLSCREEN), getParameter(PARAMETER_MULTIMONITOR)); + addParameterValue(PARAMETER_MONITORS, i, monitors->monitor[i]->data[3], !i); } - x_info *monitors = getXInfo(); - for (size_t i = 0; i < monitors->count; ++i) - { - addParameterValue(PARAMETER_MONITORS, i, monitors->monitor[i].ptrIndexMonitor, !i); - } - freeXInfo(monitors); + dbFreeMonitors(monitors); } void settingsFree() diff --git a/db.c b/db.c index 5cacce3..585e48d 100644 --- a/db.c +++ b/db.c @@ -5,9 +5,7 @@ * Author: alexander */ -#include #include "sqlite3.h" -#include #include #include @@ -386,3 +384,179 @@ bool dbSetUserNameCurrent(char *current) return true; } + +static int dbCreateMonitorsList(void *answer, int argc, char **argv, char **azColName) +{ + Monitors *monitors = *(Monitors **)answer; + Monitor *monitor = (Monitor*) malloc(sizeof(Monitor)); + monitor->data = (char **) malloc(sizeof(char*) * argc); + monitor->size = argc; + + for (int i = 0; i < argc; i++) + { + monitor->data[i] = (char *) malloc(sizeof(char) * strlen(argv[i])); + strcpy(monitor->data[i], argv[i]); + } + + Monitor **tmp = monitors->monitor; + monitors->monitor = (Monitor**) malloc(sizeof(Monitor*) * ++monitors->size); + for (size_t i = 0; i < monitors->size - 1; ++i) + { + monitors->monitor[i] = tmp[i]; + } + if (tmp) + { + free(tmp); + } + monitors->monitor[monitors->size - 1] = monitor; + + return 0; +} + +Monitors *dbGetMonitorsList() +{ + sqlite3 *db = dbGetBase("freerdp.db"); + if (!db) + { + return false; + } + + char *err_msg = 0; + char *sql = "SELECT ROW_NUMBER () OVER (ORDER BY `monitors`.`set` DESC) `item`, `monitors`.`name` as `name`, `monitors`.`set` as `set`, (ROW_NUMBER () OVER (ORDER BY `monitors`.`id`)) - 1 `item` FROM `monitors` as `monitors`"; + + Monitors *monitors = (Monitors *) malloc(sizeof(Monitors)); + monitors->size = 0; + monitors->monitor = NULL; + + if (sqlite3_exec(db, sql, dbCreateMonitorsList, &monitors, &err_msg) != SQLITE_OK) + { + fprintf(stderr, "Ошибка выполнения запроса: %s\n", err_msg); + sqlite3_free(err_msg); + sqlite3_close(db); + exit(-1); + } + + sqlite3_close(db); + + return monitors; +} + +void dbFreeMonitors(Monitors *monitors) +{ + for (size_t i = 0; i < monitors->size; ++i) + { + for (size_t j = 0; j < monitors->monitor[i]->size; ++j) + { + free(monitors->monitor[i]->data[j]); + } + free(monitors->monitor[i]->data); + free(monitors->monitor[i]); + } + free(monitors); +} + +bool deleteAllMonitors() +{ + sqlite3 *db = dbGetBase("freerdp.db"); + if (!db) + { + return false; + } + + bool result = false; + char *sql = "DELETE FROM `monitors`"; + + if (sqlite3_exec(db, sql, NULL, NULL, NULL) == SQLITE_OK) + { + result = true; + } + + sqlite3_close(db); + + return result; +} + +int dbAddMonitor(char *monitor, bool set) +{ + if (!(monitor && strlen(monitor))) + return -1; + + sqlite3 *db = dbGetBase("freerdp.db"); + if (!db) + { + return -2; + } + + sqlite3_stmt *res; + char *sql = "INSERT INTO `monitors` (`name`, `set`) VALUES (?, ?)"; + if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK) + { + sqlite3_bind_text(res, 1, monitor, -1, 0); + sqlite3_bind_int(res, 2, set); + } + +// if (sqlite3_step(res) == SQLITE_BUSY) +// { +// fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", text ? "установлено" : "очищено", text ? getValue(VALUE_USERNAME)->current : ""); +// } +// if (sqlite3_step(res) == SQLITE_ERROR) +// { +// fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", text ? "установлено" : "очищено", text ? getValue(VALUE_USERNAME)->current : ""); +// } + if (sqlite3_step(res) == SQLITE_DONE) + { + fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", monitor ? "установлено" : "очищено", monitor ? monitor : ""); + return 0; + } + + sqlite3_finalize(res); + sqlite3_close(db); + + return -3; +} + +int dbSaveMonitors(char *name) +{ + int result = 0; + + if (!(name && strlen(name))) + return -1; + + sqlite3 *db = dbGetBase("freerdp.db"); + if (!db) + { + return -2; + } + + char *sql = "UPDATE `monitors` set `set` = 0"; + if (sqlite3_exec(db, sql, NULL, NULL, NULL) == SQLITE_OK) + { + sqlite3_stmt *res; + sql = "UPDATE `monitors` SET `set` = 1 WHERE `name` = ?"; + if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK) + { + sqlite3_bind_text(res, 1, name, -1, 0); + } + + if (sqlite3_step(res) == SQLITE_BUSY) + { + fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", name ? "установлено" : "очищено", name); + result = 2; + } + if (sqlite3_step(res) == SQLITE_ERROR) + { + fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", name ? "установлено" : "очищено", name); + result = 1; + } + if (sqlite3_step(res) == SQLITE_DONE) + { + fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", name ? "установлено" : "очищено", name); + result = 0; + } + sqlite3_finalize(res); + } + + sqlite3_close(db); + + return result; +} diff --git a/db.h b/db.h index 325bcce..2f9b864 100644 --- a/db.h +++ b/db.h @@ -8,6 +8,9 @@ #ifndef DB_H_ #define DB_H_ +#include +#include + #include "parameter.h" #include "value.h" @@ -23,9 +26,26 @@ typedef struct Hosts size_t size; } Hosts; +typedef struct Monitor +{ + char **data; + size_t size; +} Monitor; + +typedef struct Monitors +{ + Monitor **monitor; + size_t size; +} Monitors; + bool dbLoadData(); Hosts *dbGetHostsList(); void dbFreeHosts(Hosts *hosts); +Monitors *dbGetMonitorsList(); +void dbFreeMonitors(Monitors *monitors); +bool deleteAllMonitors(); +int dbAddMonitor(char *monitor, bool set); +int dbSaveMonitors(char *name); bool dbWriteParameter(Parameter name, bool set); bool dbWriteValue(Value name, bool set); bool dbSetUserNameCurrent(char *current); diff --git a/freerdp.db b/freerdp.db index d3ca45bf3427ee21beebdb8175650cd4da93796a..9809b4bf0b8842dea69070706ef11cc98db69d2a 100644 GIT binary patch delta 384 zcmZo@U~On%oggK|$i~3HAOgiqKssQeju9_VR4-nVm-ixrAbZ!uY*{w;F8)e>kBxnQ z*i0Jro!G@?Wf_|cOA?cEQgie3GE4G{ieWUbbC9cJh^s<~qmz%Tf)Ye{vLdHCOI~7b z>f{L=Qj<$KB_?O`DQ>pmU}fj!0@?`#`YvqZ&a#sgxFsZECdC`USp53VFj--kSiB*O z#kYACf0Tj%8~OV delta 168 zcmZo@U~On%oggK|aF&6AK?I6ffwccb9V1?#s9wAzFYiSLJ`S6S*|Kc>{vf!q?+@F= z4YOE);)f?Xifp#wU}a~_nYb`x^D6!*1p!w6)hztS`M2>u;lIJZnt$qML5Bu@aen@9 s42nR5(ZJ@__Mr{inFSdC@^2RqVEh0jCvH&Q^nu-hk!3rF0pkyT0E4tEQ2+n{ diff --git a/monitor.c b/monitor.c new file mode 100644 index 0000000..940a885 --- /dev/null +++ b/monitor.c @@ -0,0 +1,82 @@ +/* + * monitor.c + * + * Created on: 18 июл. 2022 г. + * Author: alexander + */ + +#include +#include + +#include "monitor.h" +#include "rxrandr.h" + +static bool checkMonitor(Monitors *dbMonitors, x_info *pcMonitors) +{ + if (!dbMonitors->size || !pcMonitors->count || + !(dbMonitors->size == pcMonitors->count)) + { + return false; + } + + bool compare = false; + + for (size_t i = 0; i < dbMonitors->size; ++i) + { + for (size_t j = 0; j < pcMonitors->count; ++j) + { + if (!strcmp(pcMonitors->monitor[j].name, dbMonitors->monitor[i]->data[1])) + { + compare = true; + } + } + + if (!compare) + { + return false; + } + + compare = false; + } + + return true; +} + +Monitors *loadMonitors() +{ + Monitors *dbMonitors = dbGetMonitorsList(); + x_info *pcMonitors = getXInfo(); + if (!checkMonitor(dbMonitors, pcMonitors)) // Если строки не равны, произвести перезапись в БД + { + dbFreeMonitors(dbMonitors); + if (!deleteAllMonitors()) + { + fprintf(stderr, "Не удалось удалить записи мониторов из БД\n"); + exit(1); + } + + for (size_t i = 0; i < pcMonitors->count; ++i) + { + dbAddMonitor(pcMonitors->monitor[i].name, pcMonitors->monitor[i].primary); + } + freeXInfo(pcMonitors); + + return dbGetMonitorsList(); + } + + freeXInfo(pcMonitors); + + return dbMonitors; +} + +void freeMonitors(Monitors *monitors) +{ + for (size_t i = 0; i < monitors->size; ++i) + { + free(monitors->monitor[i]->data[2]); + free(monitors->monitor[i]->data[3]); + free(monitors->monitor[i]->data); + free(monitors->monitor[i]); + } + free(monitors); +} diff --git a/monitor.h b/monitor.h new file mode 100644 index 0000000..1a6dde2 --- /dev/null +++ b/monitor.h @@ -0,0 +1,16 @@ +/* + * monitor.h + * + * Created on: 18 июл. 2022 г. + * Author: alexander + */ + +#ifndef MONITOR_H_ +#define MONITOR_H_ + +#include "db.h" + +Monitors *loadMonitors(); +void freeMonitors(Monitors *monitors); + +#endif /* MONITOR_H_ */ diff --git a/xrandr.c b/rxrandr.c similarity index 99% rename from xrandr.c rename to rxrandr.c index b529932..eaee924 100644 --- a/xrandr.c +++ b/rxrandr.c @@ -15,7 +15,7 @@ #include -#include "xrandr.h" +#include "rxrandr.h" static char *program_name; static Display *dpy; diff --git a/xrandr.h b/rxrandr.h similarity index 100% rename from xrandr.h rename to rxrandr.h diff --git a/xrandr_broker.c b/rxrandr_broker.c similarity index 96% rename from xrandr_broker.c rename to rxrandr_broker.c index e94d549..137cc24 100644 --- a/xrandr_broker.c +++ b/rxrandr_broker.c @@ -5,7 +5,7 @@ * Author: alexander */ -#include "xrandr.h" +#include "rxrandr.h" #include #include @@ -14,6 +14,7 @@ x_info *getXInfo() { x_info *monitors = (x_info *) malloc(sizeof(x_info)); + monitors->count = 0; XInfo(monitors); for (int i = 0; i < monitors->count; ++i) diff --git a/settings.c b/settings.c index 15ac171..2286f84 100644 --- a/settings.c +++ b/settings.c @@ -10,7 +10,7 @@ #include #include -#include "xrandr.h" +#include "monitor.h" #include #include "settings.h" @@ -33,6 +33,7 @@ static int settingsClose(Ihandle *self) static int settingsSave(Ihandle *self) { saveChangeSettings(); + dbSaveMonitors(IupGetAttribute(IupGetDialogChild(self, "MONITORS"), "VALUESTRING")); IupSetAttribute(IupGetDialog(self), "SIMULATEMODAL", "OFF"); IupHide(IupGetDialog(self)); return IUP_DEFAULT; @@ -324,27 +325,21 @@ static Ihandle* settingsBoxMonitor() tglFullscreen = IupToggle("На весь экран", NULL); ddMonitor = IupList(NULL); - x_info *monitors = getXInfo(); - char *allMonitorIndex = (char*) malloc(sizeof(char) * 3); - sprintf(allMonitorIndex, "%hu", monitors->count + 1); - size_t setValueIndex = 0; - - for (short i = 0; i < monitors->count; ++i) + Monitors *monitors = loadMonitors(); + for (size_t i = 0; i < monitors->size; ++i) { - IupSetAttribute(ddMonitor, monitors->monitor[i].ptrIndexItem, monitors->monitor[i].ptrName); - if (getSetValue(PARAMETER_MONITORS, i)) - setValueIndex = i + 1; + IupSetAttribute(ddMonitor, monitors->monitor[i]->data[0], monitors->monitor[i]->data[1]); + if (monitors->monitor[i]->data[2][0] == '1') + IupSetAttribute(ddMonitor, "VALUE", monitors->monitor[i]->data[0]); } + freeMonitors(monitors); - IupSetInt(ddMonitor, "VALUE", setValueIndex ? setValueIndex : 1); IupSetInt(tglMultimonitor, "VALUE", getSetParameter(PARAMETER_MULTIMONITOR)); IupSetInt(tglFullscreen, "VALUE", getSetParameter(PARAMETER_FULLSCREEN)); IupSetInt(tglMultimonitor, "ACTIVE", getSetParameter(PARAMETER_FULLSCREEN)); IupSetInt(ddMonitor, "ACTIVE", getSetParameter(PARAMETER_FULLSCREEN) && !getSetParameter(PARAMETER_MULTIMONITOR)); - free(monitors); - return IupSetAttributes( IupFrame( IupVbox( From 5e743f843fc68b241c908c64eb2cf107c182adc3 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Mon, 18 Jul 2022 15:01:15 +0300 Subject: [PATCH 2/4] =?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=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D1=83=D1=82=D1=8C=20=D0=BA=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D1=83=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arguments.c | 4 +++- arguments.h | 2 +- db.c | 31 +++++++++++++++++++++---------- db.h | 2 ++ freerdp.db | Bin 81920 -> 81920 bytes xfreerdp.c | 5 ++++- 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/arguments.c b/arguments.c index bf42643..0cd049f 100644 --- a/arguments.c +++ b/arguments.c @@ -14,8 +14,10 @@ #include "db.h" #include "monitor.h" -void settingsLoad() +void settingsLoad(char *pathDB) { + getPathDB(pathDB); + dbLoadData(); Monitors *monitors = dbGetMonitorsList(); diff --git a/arguments.h b/arguments.h index ddbe840..040ce8d 100644 --- a/arguments.h +++ b/arguments.h @@ -17,7 +17,7 @@ typedef struct void buildArguments(Arguments *args); void freeArguments(Arguments *args); -void settingsLoad(); +void settingsLoad(char *pathDB); void settingsFree(); #endif /* ARGUMENTS_H_ */ diff --git a/db.c b/db.c index 585e48d..7fbb523 100644 --- a/db.c +++ b/db.c @@ -12,6 +12,17 @@ #include "db.h" #include "node_settings.h" +char *getPathDB(char *path) +{ + static char *current = NULL; + if (path) + { + current = path; + } + + return current; +} + static sqlite3 *dbGetBase(char *path) { sqlite3 *db = NULL; @@ -68,7 +79,7 @@ static int dbLoad(void *NotUsed, int argc, char **argv, char **azColName) bool dbLoadData() { - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return false; @@ -126,7 +137,7 @@ static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColNa Hosts *dbGetHostsList() { - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return false; @@ -167,7 +178,7 @@ void dbFreeHosts(Hosts *hosts) bool dbWriteParameter(Parameter name, bool set) { - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return false; @@ -204,7 +215,7 @@ bool dbWriteParameter(Parameter name, bool set) bool dbWriteValue(Value name, bool set) { - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return false; @@ -245,7 +256,7 @@ int dbAddServer(char *ip, char *dns) if (!(ip && strlen(ip) && dns && strlen(dns))) return -1; - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return -2; @@ -349,7 +360,7 @@ int dbAddServer(char *ip, char *dns) bool dbSetUserNameCurrent(char *current) { - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return false; @@ -415,7 +426,7 @@ static int dbCreateMonitorsList(void *answer, int argc, char **argv, char **azCo Monitors *dbGetMonitorsList() { - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return false; @@ -457,7 +468,7 @@ void dbFreeMonitors(Monitors *monitors) bool deleteAllMonitors() { - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return false; @@ -481,7 +492,7 @@ int dbAddMonitor(char *monitor, bool set) if (!(monitor && strlen(monitor))) return -1; - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return -2; @@ -522,7 +533,7 @@ int dbSaveMonitors(char *name) if (!(name && strlen(name))) return -1; - sqlite3 *db = dbGetBase("freerdp.db"); + sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { return -2; diff --git a/db.h b/db.h index 2f9b864..89c7e1c 100644 --- a/db.h +++ b/db.h @@ -38,6 +38,8 @@ typedef struct Monitors size_t size; } Monitors; +char *getPathDB(char *path); + bool dbLoadData(); Hosts *dbGetHostsList(); void dbFreeHosts(Hosts *hosts); diff --git a/freerdp.db b/freerdp.db index 9809b4bf0b8842dea69070706ef11cc98db69d2a..1b31d0021ef46c5473389c7dce5698118ecbc530 100644 GIT binary patch delta 32 ocmZo@U~On%ogmG~HBrWyk!xdu$$v(U$y5IaF>-Ex@n6CL0IA{&egFUf delta 32 ocmZo@U~On%ogmG~Hc`fzk!@pw$$v)9$y5IaF>-8v@n6CL0I5U^b^rhX diff --git a/xfreerdp.c b/xfreerdp.c index c4edaa0..abdf3ca 100644 --- a/xfreerdp.c +++ b/xfreerdp.c @@ -6,7 +6,10 @@ int main(int argc, char **argv) { - settingsLoad(); + if (argc > 1) + settingsLoad(argv[1]); + else + settingsLoad("/etc/freerdp/freerdp.db"); IupOpen(&argc, &argv); From 6eac429923c9706893d6cc0bb6da1b42bc619dd1 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Mon, 18 Jul 2022 18:38:38 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B0=20=D1=81=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85,=20=D0=BD=D1=83?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=20=D0=BF=D1=80=D0=B2=D0=BE=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B2=D1=81=D0=B5=20free()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arguments.c | 2 +- db.c | 67 +++++++++++++++++++++++++---------------------------- gui.c | 23 +++++++++++------- monitor.c | 4 +++- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/arguments.c b/arguments.c index 0cd049f..e3837cc 100644 --- a/arguments.c +++ b/arguments.c @@ -20,7 +20,7 @@ void settingsLoad(char *pathDB) dbLoadData(); - Monitors *monitors = dbGetMonitorsList(); + Monitors *monitors = loadMonitors(); for (size_t i = 0; i < monitors->size; ++i) { addParameterValue(PARAMETER_MONITORS, i, monitors->monitor[i]->data[3], !i); diff --git a/db.c b/db.c index 7fbb523..5bcf388 100644 --- a/db.c +++ b/db.c @@ -12,7 +12,7 @@ #include "db.h" #include "node_settings.h" -char *getPathDB(char *path) +char* getPathDB(char *path) { static char *current = NULL; if (path) @@ -23,7 +23,7 @@ char *getPathDB(char *path) return current; } -static sqlite3 *dbGetBase(char *path) +static sqlite3* dbGetBase(char *path) { sqlite3 *db = NULL; @@ -51,29 +51,17 @@ static sqlite3 *dbGetBase(char *path) */ static int dbLoad(void *NotUsed, int argc, char **argv, char **azColName) { - NotUsed = 0; - - char **parameters = (char **) malloc(sizeof(char*) * argc); - - for (int i = 0; i < argc; i++) + if (!getParameter(atoi(argv[0]))) { - parameters[i] = argv[i]; + addParameterKey(atoi(argv[0]), argv[1], atoi(argv[2]), atoi(argv[3]), argv[7] ? getParameter(atoi(argv[7])) : NULL, + argv[8] ? getParameter(atoi(argv[8])) : NULL); } - if (!getParameter(atoi(parameters[0]))) + if (argv[4] && argv[5]) { - addParameterKey(atoi(parameters[0]), parameters[1], atoi(parameters[2]), atoi(parameters[3]), - parameters[7] ? getParameter(atoi(parameters[7])) : NULL, - parameters[8] ? getParameter(atoi(parameters[8])) : NULL); + addParameterValue(atoi(argv[0]), atoi(argv[4]), argv[5], atoi(argv[6])); } - if (parameters[4] && parameters[5]) - { - addParameterValue(atoi(parameters[0]), atoi(parameters[4]), parameters[5], atoi(parameters[6])); - } - - free(parameters); - return 0; } @@ -109,17 +97,20 @@ bool dbLoadData() static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColName) { - Hosts *hosts = *(Hosts **)answer; + fprintf(stderr, "dbCreateHostsList 1\n"); + Hosts *hosts = *(Hosts**) answer; Host *host = (Host*) malloc(sizeof(Host)); - host->data = (char **) malloc(sizeof(char*) * argc); + 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])); + host->data[i] = (char*) malloc(sizeof(char) * strlen(argv[i])); strcpy(host->data[i], argv[i]); } + fprintf(stderr, "dbCreateHostsList 2\n"); + Host **tmp = hosts->host; hosts->host = (Host**) malloc(sizeof(Host*) * ++hosts->size); for (size_t i = 0; i < hosts->size - 1; ++i) @@ -132,11 +123,14 @@ static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColNa } hosts->host[hosts->size - 1] = host; + fprintf(stderr, "dbCreateHostsList 3\n"); + return 0; } -Hosts *dbGetHostsList() +Hosts* dbGetHostsList() { + fprintf(stderr, "dbGetHostsList 1\n"); sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { @@ -145,8 +139,8 @@ Hosts *dbGetHostsList() 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)); + fprintf(stderr, "dbGetHostsList 2\n"); + Hosts *hosts = (Hosts*) malloc(sizeof(Hosts)); hosts->size = 0; hosts->host = NULL; @@ -157,9 +151,9 @@ Hosts *dbGetHostsList() sqlite3_close(db); exit(-1); } - + fprintf(stderr, "dbGetHostsList 3\n"); sqlite3_close(db); - + fprintf(stderr, "dbGetHostsList 4\n"); return hosts; } @@ -171,6 +165,7 @@ void dbFreeHosts(Hosts *hosts) { free(hosts->host[i]->data[j]); } + free(hosts->host[i]->data); free(hosts->host[i]); } free(hosts); @@ -193,7 +188,6 @@ bool dbWriteParameter(Parameter name, bool set) sqlite3_bind_int(res, 2, name); } - if (sqlite3_step(res) == SQLITE_BUSY) { fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", set ? "включено" : "выключено", getParameter(name)->key); @@ -277,7 +271,7 @@ int dbAddServer(char *ip, char *dns) if (sqlite3_step(res) == SQLITE_ROW) { - int id = atoi((const char *)sqlite3_column_text(res, 0)); + int id = atoi((const char*) sqlite3_column_text(res, 0)); sqlite3_finalize(res); sql = "UPDATE `hosts` set `set` = 0"; @@ -312,7 +306,7 @@ int dbAddServer(char *ip, char *dns) result = -5; } } - else if(sqlite3_step(res) == SQLITE_DONE) + else if (sqlite3_step(res) == SQLITE_DONE) { sqlite3_finalize(res); @@ -398,14 +392,14 @@ bool dbSetUserNameCurrent(char *current) static int dbCreateMonitorsList(void *answer, int argc, char **argv, char **azColName) { - Monitors *monitors = *(Monitors **)answer; + Monitors *monitors = *(Monitors**) answer; Monitor *monitor = (Monitor*) malloc(sizeof(Monitor)); - monitor->data = (char **) malloc(sizeof(char*) * argc); + monitor->data = (char**) malloc(sizeof(char*) * argc); monitor->size = argc; for (int i = 0; i < argc; i++) { - monitor->data[i] = (char *) malloc(sizeof(char) * strlen(argv[i])); + monitor->data[i] = (char*) malloc(sizeof(char) * strlen(argv[i])); strcpy(monitor->data[i], argv[i]); } @@ -424,7 +418,7 @@ static int dbCreateMonitorsList(void *answer, int argc, char **argv, char **azCo return 0; } -Monitors *dbGetMonitorsList() +Monitors* dbGetMonitorsList() { sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) @@ -433,9 +427,10 @@ Monitors *dbGetMonitorsList() } char *err_msg = 0; - char *sql = "SELECT ROW_NUMBER () OVER (ORDER BY `monitors`.`set` DESC) `item`, `monitors`.`name` as `name`, `monitors`.`set` as `set`, (ROW_NUMBER () OVER (ORDER BY `monitors`.`id`)) - 1 `item` FROM `monitors` as `monitors`"; + char *sql = + "SELECT ROW_NUMBER () OVER (ORDER BY `monitors`.`set` DESC) `item`, `monitors`.`name` as `name`, `monitors`.`set` as `set`, (ROW_NUMBER () OVER (ORDER BY `monitors`.`id`)) - 1 `item` FROM `monitors` as `monitors`"; - Monitors *monitors = (Monitors *) malloc(sizeof(Monitors)); + Monitors *monitors = (Monitors*) malloc(sizeof(Monitors)); monitors->size = 0; monitors->monitor = NULL; diff --git a/gui.c b/gui.c index fc44f50..9f34cec 100644 --- a/gui.c +++ b/gui.c @@ -58,7 +58,9 @@ static int guiConnect(Ihandle *self) static void createHostsList(Ihandle *iupList) { + fprintf(stderr, "ERROR 1\n"); Hosts *hosts = dbGetHostsList(); + fprintf(stderr, "ERROR 2\n"); char *indexItem = NULL; char *serverName = NULL; @@ -74,6 +76,7 @@ static void createHostsList(Ihandle *iupList) if (atoi(host->data[2])) IupSetAttribute(iupList, "VALUE", serverName); } + fprintf(stderr, "ERROR 3\n"); dbFreeHosts(hosts); } @@ -104,13 +107,15 @@ Ihandle* guiStart() inputServer = IupList(NULL); IupSetAttribute(inputServer, "NAME", "SERVER"); IupSetAttribute(inputServer, "TIP", "IP-адрес или имя удаленного сервера (обязательно)"); + fprintf(stderr, "guiStart 1\n"); createHostsList(inputServer); + fprintf(stderr, "guiStart 2\n"); IupSetAttribute(inputServer, "SIZE", "100"); IupSetAttribute(inputServer, "EDITBOX", "YES"); IupSetAttribute(inputServer, "DROPDOWN", "YES"); hBoxServer = IupHbox(labelServer, inputServer, NULL); IupSetAttribute(hBoxServer, "MARGIN", "10x10"); - + fprintf(stderr, "guiStart 3\n"); labelUser = IupLabel("Пользователь:"); IupSetAttribute(labelUser, "SIZE", "80x16"); IupSetAttribute(labelUser, "ALIGNMENT", "ARIGHT:ACENTER"); @@ -122,7 +127,7 @@ Ihandle* guiStart() IupSetAttribute(inputUser, "SIZE", "100"); hBoxUser = IupHbox(labelUser, inputUser, NULL); IupSetAttribute(hBoxUser, "MARGIN", "10x0"); - + fprintf(stderr, "guiStart 4\n"); labelPassword = IupLabel("Пароль:"); IupSetAttribute(labelPassword, "SIZE", "80x16"); IupSetAttribute(labelPassword, "ALIGNMENT", "ARIGHT:ACENTER"); @@ -135,38 +140,38 @@ Ihandle* guiStart() IupSetAttribute(inputPassword, "PASSWORD", "YES"); hBoxPassword = IupHbox(labelPassword, inputPassword, NULL); IupSetAttribute(hBoxPassword, "MARGIN", "10x10"); - + fprintf(stderr, "guiStart 5\n"); btnConnect = IupButton("Подключение", NULL); IupSetHandle("CONNECT", btnConnect); IupSetAttribute(btnConnect, "NAME", "CONNECT"); IupSetAttribute(btnConnect, "TIP", "Выполнить подключение"); IupSetAttribute(btnConnect, "BGCOLOR", "0 179 0"); IupSetAttribute(btnConnect, "FGCOLOR", "255 255 255"); - + fprintf(stderr, "guiStart 6\n"); btnClose = IupButton("Закрыть", NULL); IupSetHandle("CLOSE", btnClose); IupSetAttribute(btnClose, "NAME", "CLOSE"); IupSetAttribute(btnClose, "TIP", "Закрыть FreeRDP"); IupSetAttribute(btnClose, "BGCOLOR", "204 0 0"); IupSetAttribute(btnClose, "FGCOLOR", "255 255 255"); - + fprintf(stderr, "guiStart 7\n"); btnSettings = IupButton("Настройки", NULL); IupSetAttribute(btnSettings, "NAME", "SETTINGS"); IupSetAttribute(btnSettings, "TIP", "Перейти в настройки"); IupSetAttribute(btnSettings, "BGCOLOR", "0 136 204"); IupSetAttribute(btnSettings, "FGCOLOR", "255 255 255"); - + fprintf(stderr, "guiStart 8\n"); hBoxButtons = IupHbox(IupFill(), btnSettings, btnConnect, btnClose, IupFill(), NULL); IupSetAttribute(hBoxButtons, "ALIGNMENT", "ACENTER:ACENTER"); IupSetAttribute(hBoxButtons, "GAP", "10"); IupSetAttribute(hBoxButtons, "MARGIN", "10x10"); - + fprintf(stderr, "guiStart 9\n"); vBoxMain = IupVbox(labelImage, hBoxServer, hBoxUser, hBoxPassword, hBoxButtons, NULL); IupSetCallback(btnConnect, "ACTION", (Icallback) guiConnect); IupSetCallback(btnClose, "ACTION", (Icallback) guiExit); IupSetCallback(btnSettings, "ACTION", (Icallback) settingsMainWindow); - + fprintf(stderr, "guiStart 10\n"); dlg = IupDialog(vBoxMain); IupSetAttribute(dlg, "IMAGE", "BG_HEAD"); IupSetAttribute(dlg, "ICON", "icon"); @@ -175,6 +180,6 @@ Ihandle* guiStart() IupSetAttribute(dlg, "PARENTDIALOG", "MAIN_WINDOW"); IupSetAttribute(dlg, "DEFAULTENTER", "CONNECT"); IupSetAttribute(dlg, "DEFAULTESC", "CLOSE"); - + fprintf(stderr, "guiStart 11\n"); return dlg; } diff --git a/monitor.c b/monitor.c index 940a885..ee365fa 100644 --- a/monitor.c +++ b/monitor.c @@ -48,7 +48,9 @@ Monitors *loadMonitors() x_info *pcMonitors = getXInfo(); if (!checkMonitor(dbMonitors, pcMonitors)) // Если строки не равны, произвести перезапись в БД { - dbFreeMonitors(dbMonitors); + if (dbMonitors) + dbFreeMonitors(dbMonitors); + if (!deleteAllMonitors()) { fprintf(stderr, "Не удалось удалить записи мониторов из БД\n"); From d74ba6de54f8ee1c41effbe7522fc670bff4224d Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Tue, 19 Jul 2022 13:13:57 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B=20=D1=81=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 44 ++++++++++++++++++++++++++++++++++++++++++++ address.c | 5 +++-- concat.c | 4 ++-- db.c | 33 ++++++++++++++------------------- gui.c | 33 +++++++++++++++------------------ node_settings.c | 14 ++++++++------ parameter.h | 2 +- rxrandr_broker.c | 6 ++++-- 8 files changed, 91 insertions(+), 50 deletions(-) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..73179f5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 2.8) +project(xfree) +#include_directories(/home/alexander/repositories/iup/include) +include_directories(/root/iup/include) +set(SOURCE_EXE + address.c + arguments.c + concat.c + db.c + gui.c + images.c + monitor.c + node_settings.c + rxrandr_broker.c + rxrandr.c + settings.c + xfreerdp.c + xrdp.c +) +add_executable(xfree ${SOURCE_EXE}) +#target_link_libraries(xfree iup X11 Xrandr m /home/alexander/programming/c/iup/sqlite3.a) +target_link_libraries(xfree + gtk-3 + gdk-3 + pangocairo-1.0 + pango-1.0 + atk-1.0 + cairo-gobject + cairo + gdk_pixbuf-2.0 + gio-2.0 + gobject-2.0 + glib-2.0 + X11 + Xrandr + m + + dl + pthread + + /root/iup/lib/Linux515/libiup.a + /root/SQLite/sqlite3.a +) +#target_link_libraries(xfree iup X11 Xrandr m sqlite3 -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lX11 -lXrandr -lm) diff --git a/address.c b/address.c index 9c603f2..69c70d0 100644 --- a/address.c +++ b/address.c @@ -21,8 +21,9 @@ char *getHostIP(char *dnsName) if (he) { char *ip = inet_ntoa(*(struct in_addr*)he->h_addr); - result = (char *)malloc(sizeof(char) * strlen(ip)); - strcpy(result, ip); + size_t size = strlen(ip) + 1; + result = (char *)malloc(sizeof(char) * size); + strncpy(result, ip, size); } return result; } diff --git a/concat.c b/concat.c index 8ee7b56..d75a07a 100644 --- a/concat.c +++ b/concat.c @@ -26,11 +26,11 @@ char* concat(char *s1, char *s2) if (s1) { - strcpy(result, s1); + strncpy(result, s1, (len1 + 1)); } if (s2) { - strcpy(result + len1, s2); + strncpy(result + len1, s2, (len2 + 1)); } return result; diff --git a/db.c b/db.c index 5bcf388..d6d1aa1 100644 --- a/db.c +++ b/db.c @@ -6,6 +6,7 @@ */ #include "sqlite3.h" +//#include #include #include @@ -15,7 +16,7 @@ char* getPathDB(char *path) { static char *current = NULL; - if (path) + if (path && !current) { current = path; } @@ -53,8 +54,9 @@ static int dbLoad(void *NotUsed, int argc, char **argv, char **azColName) { if (!getParameter(atoi(argv[0]))) { - addParameterKey(atoi(argv[0]), argv[1], atoi(argv[2]), atoi(argv[3]), argv[7] ? getParameter(atoi(argv[7])) : NULL, - argv[8] ? getParameter(atoi(argv[8])) : NULL); + addParameterKey(atoi(argv[0]), argv[1], atoi(argv[2]), atoi(argv[3]), + (argv[7] ? getParameter(atoi(argv[7])) : NULL), + (argv[8] ? getParameter(atoi(argv[8])) : NULL)); } if (argv[4] && argv[5]) @@ -97,7 +99,6 @@ bool dbLoadData() static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColName) { - fprintf(stderr, "dbCreateHostsList 1\n"); Hosts *hosts = *(Hosts**) answer; Host *host = (Host*) malloc(sizeof(Host)); host->data = (char**) malloc(sizeof(char*) * argc); @@ -105,12 +106,11 @@ static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColNa for (int i = 0; i < argc; i++) { - host->data[i] = (char*) malloc(sizeof(char) * strlen(argv[i])); - strcpy(host->data[i], argv[i]); + size_t size = strlen(argv[i]) + 1; + host->data[i] = (char*) malloc(sizeof(char) * size); + strncpy(host->data[i], argv[i], size); } - fprintf(stderr, "dbCreateHostsList 2\n"); - Host **tmp = hosts->host; hosts->host = (Host**) malloc(sizeof(Host*) * ++hosts->size); for (size_t i = 0; i < hosts->size - 1; ++i) @@ -123,14 +123,11 @@ static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColNa } hosts->host[hosts->size - 1] = host; - fprintf(stderr, "dbCreateHostsList 3\n"); - return 0; } Hosts* dbGetHostsList() { - fprintf(stderr, "dbGetHostsList 1\n"); sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { @@ -139,7 +136,6 @@ Hosts* dbGetHostsList() 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`"; - fprintf(stderr, "dbGetHostsList 2\n"); Hosts *hosts = (Hosts*) malloc(sizeof(Hosts)); hosts->size = 0; hosts->host = NULL; @@ -151,9 +147,7 @@ Hosts* dbGetHostsList() sqlite3_close(db); exit(-1); } - fprintf(stderr, "dbGetHostsList 3\n"); sqlite3_close(db); - fprintf(stderr, "dbGetHostsList 4\n"); return hosts; } @@ -399,8 +393,9 @@ static int dbCreateMonitorsList(void *answer, int argc, char **argv, char **azCo for (int i = 0; i < argc; i++) { - monitor->data[i] = (char*) malloc(sizeof(char) * strlen(argv[i])); - strcpy(monitor->data[i], argv[i]); + size_t size = strlen(argv[i]) + 1; + monitor->data[i] = (char*) malloc(sizeof(char) * size); + strncpy(monitor->data[i], argv[i], size); } Monitor **tmp = monitors->monitor; @@ -423,7 +418,7 @@ Monitors* dbGetMonitorsList() sqlite3 *db = dbGetBase(getPathDB(NULL)); if (!db) { - return false; + exit(-1); } char *err_msg = 0; @@ -436,10 +431,10 @@ Monitors* dbGetMonitorsList() if (sqlite3_exec(db, sql, dbCreateMonitorsList, &monitors, &err_msg) != SQLITE_OK) { - fprintf(stderr, "Ошибка выполнения запроса: %s\n", err_msg); + fprintf(stderr, "Получение списка мониторов. Ошибка выполнения запроса: %s\n", err_msg); sqlite3_free(err_msg); sqlite3_close(db); - exit(-1); + exit(-2); } sqlite3_close(db); diff --git a/gui.c b/gui.c index 9f34cec..dfa8591 100644 --- a/gui.c +++ b/gui.c @@ -58,25 +58,24 @@ static int guiConnect(Ihandle *self) static void createHostsList(Ihandle *iupList) { - fprintf(stderr, "ERROR 1\n"); Hosts *hosts = dbGetHostsList(); - fprintf(stderr, "ERROR 2\n"); 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]); + size_t size = strlen(host->data[0]) + 1; + indexItem = (char *)malloc(sizeof(char) * size); + strncpy(indexItem, host->data[0], size); + size = strlen(host->data[1]) + 1; + serverName = (char *)malloc(sizeof(char) * size); + strncpy(serverName, host->data[1], size); IupSetAttribute(iupList, indexItem, serverName); if (atoi(host->data[2])) IupSetAttribute(iupList, "VALUE", serverName); } - fprintf(stderr, "ERROR 3\n"); dbFreeHosts(hosts); } @@ -107,15 +106,13 @@ Ihandle* guiStart() inputServer = IupList(NULL); IupSetAttribute(inputServer, "NAME", "SERVER"); IupSetAttribute(inputServer, "TIP", "IP-адрес или имя удаленного сервера (обязательно)"); - fprintf(stderr, "guiStart 1\n"); createHostsList(inputServer); - fprintf(stderr, "guiStart 2\n"); IupSetAttribute(inputServer, "SIZE", "100"); IupSetAttribute(inputServer, "EDITBOX", "YES"); IupSetAttribute(inputServer, "DROPDOWN", "YES"); hBoxServer = IupHbox(labelServer, inputServer, NULL); IupSetAttribute(hBoxServer, "MARGIN", "10x10"); - fprintf(stderr, "guiStart 3\n"); + labelUser = IupLabel("Пользователь:"); IupSetAttribute(labelUser, "SIZE", "80x16"); IupSetAttribute(labelUser, "ALIGNMENT", "ARIGHT:ACENTER"); @@ -127,7 +124,7 @@ Ihandle* guiStart() IupSetAttribute(inputUser, "SIZE", "100"); hBoxUser = IupHbox(labelUser, inputUser, NULL); IupSetAttribute(hBoxUser, "MARGIN", "10x0"); - fprintf(stderr, "guiStart 4\n"); + labelPassword = IupLabel("Пароль:"); IupSetAttribute(labelPassword, "SIZE", "80x16"); IupSetAttribute(labelPassword, "ALIGNMENT", "ARIGHT:ACENTER"); @@ -140,38 +137,38 @@ Ihandle* guiStart() IupSetAttribute(inputPassword, "PASSWORD", "YES"); hBoxPassword = IupHbox(labelPassword, inputPassword, NULL); IupSetAttribute(hBoxPassword, "MARGIN", "10x10"); - fprintf(stderr, "guiStart 5\n"); + btnConnect = IupButton("Подключение", NULL); IupSetHandle("CONNECT", btnConnect); IupSetAttribute(btnConnect, "NAME", "CONNECT"); IupSetAttribute(btnConnect, "TIP", "Выполнить подключение"); IupSetAttribute(btnConnect, "BGCOLOR", "0 179 0"); IupSetAttribute(btnConnect, "FGCOLOR", "255 255 255"); - fprintf(stderr, "guiStart 6\n"); + btnClose = IupButton("Закрыть", NULL); IupSetHandle("CLOSE", btnClose); IupSetAttribute(btnClose, "NAME", "CLOSE"); IupSetAttribute(btnClose, "TIP", "Закрыть FreeRDP"); IupSetAttribute(btnClose, "BGCOLOR", "204 0 0"); IupSetAttribute(btnClose, "FGCOLOR", "255 255 255"); - fprintf(stderr, "guiStart 7\n"); + btnSettings = IupButton("Настройки", NULL); IupSetAttribute(btnSettings, "NAME", "SETTINGS"); IupSetAttribute(btnSettings, "TIP", "Перейти в настройки"); IupSetAttribute(btnSettings, "BGCOLOR", "0 136 204"); IupSetAttribute(btnSettings, "FGCOLOR", "255 255 255"); - fprintf(stderr, "guiStart 8\n"); + hBoxButtons = IupHbox(IupFill(), btnSettings, btnConnect, btnClose, IupFill(), NULL); IupSetAttribute(hBoxButtons, "ALIGNMENT", "ACENTER:ACENTER"); IupSetAttribute(hBoxButtons, "GAP", "10"); IupSetAttribute(hBoxButtons, "MARGIN", "10x10"); - fprintf(stderr, "guiStart 9\n"); + vBoxMain = IupVbox(labelImage, hBoxServer, hBoxUser, hBoxPassword, hBoxButtons, NULL); IupSetCallback(btnConnect, "ACTION", (Icallback) guiConnect); IupSetCallback(btnClose, "ACTION", (Icallback) guiExit); IupSetCallback(btnSettings, "ACTION", (Icallback) settingsMainWindow); - fprintf(stderr, "guiStart 10\n"); + dlg = IupDialog(vBoxMain); IupSetAttribute(dlg, "IMAGE", "BG_HEAD"); IupSetAttribute(dlg, "ICON", "icon"); @@ -180,6 +177,6 @@ Ihandle* guiStart() IupSetAttribute(dlg, "PARENTDIALOG", "MAIN_WINDOW"); IupSetAttribute(dlg, "DEFAULTENTER", "CONNECT"); IupSetAttribute(dlg, "DEFAULTESC", "CLOSE"); - fprintf(stderr, "guiStart 11\n"); + return dlg; } diff --git a/node_settings.c b/node_settings.c index aa87236..3a74035 100644 --- a/node_settings.c +++ b/node_settings.c @@ -24,8 +24,9 @@ static NodeValue* newNodeValue(Value name, char *current, bool set) node->change = false; node->next = NULL; - node->current = (char*) malloc(sizeof(char) * strlen(current)); - strcpy(node->current, current); + size_t size = strlen(current) + 1; + node->current = (char*) malloc(sizeof(char) * size); + strncpy(node->current, current, size); return node; } @@ -63,8 +64,9 @@ static NodeParameter* newNodeParameter(Parameter name, char *key, bool set, bool node->conflict = conflict; node->next = NULL; - node->key = (char*) malloc(sizeof(char) * strlen(key)); - strcpy(node->key, key); + size_t size = strlen(key) + 1; + node->key = (char*) malloc(sizeof(char) * size); + strncpy(node->key, key, size); return node; } @@ -304,7 +306,7 @@ void setParameterValue(Parameter pName, Value vName, char *current) return; } - size_t length = strlen(current); + size_t length = strlen(current) + 1; if (!length) { @@ -338,7 +340,7 @@ void setParameterValue(Parameter pName, Value vName, char *current) { free(nodeValue->current); nodeValue->current = (char*) malloc(sizeof(char) * length); - strcpy(nodeValue->current, current); + strncpy(nodeValue->current, current, length); } else { diff --git a/parameter.h b/parameter.h index cbcd5c1..b78f3dc 100644 --- a/parameter.h +++ b/parameter.h @@ -22,8 +22,8 @@ typedef enum PARAMETER_SOUND, PARAMETER_COMPRESSION, PARAMETER_FULLSCREEN, - PARAMETER_MONITORS, PARAMETER_MULTIMONITOR, + PARAMETER_MONITORS, PARAMETER_AUTHENTICATION, PARAMETER_SECURITY, PARAMETER_BITSPERPIXEL, diff --git a/rxrandr_broker.c b/rxrandr_broker.c index 137cc24..1f80566 100644 --- a/rxrandr_broker.c +++ b/rxrandr_broker.c @@ -19,11 +19,13 @@ x_info *getXInfo() for (int i = 0; i < monitors->count; ++i) { - monitors->monitor[i].ptrName = (char *)malloc(sizeof(char) * strlen(monitors->monitor[i].name)); + size_t size = strlen(monitors->monitor[i].name) + 1; + + monitors->monitor[i].ptrName = (char *)malloc(sizeof(char) * size); monitors->monitor[i].ptrIndexItem = (char *)malloc(sizeof(char) * 3); monitors->monitor[i].ptrIndexMonitor = (char *)malloc(sizeof(char) * 3); - strcpy(monitors->monitor[i].ptrName, monitors->monitor[i].name); + strncpy(monitors->monitor[i].ptrName, monitors->monitor[i].name, size); sprintf(monitors->monitor[i].ptrIndexItem, "%d", i + 1); sprintf(monitors->monitor[i].ptrIndexMonitor, "%d", i); }