1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2025-02-11 00:18:29 +00:00

Implement -U for NetBSD.

Tested on NetBSD 10.
Takes part of #2072.
This commit is contained in:
Tóth János 2024-12-11 11:11:10 +01:00
parent fa045548af
commit b0cb25059b
7 changed files with 53 additions and 14 deletions

View File

@ -163,7 +163,7 @@ file.
**-U \| \--unique** **-U \| \--unique**
: Conky won't start if another Conky process is already running. Implemented : Conky won't start if another Conky process is already running. Implemented
only for Linux, FreeBSD and Haiku. only for Linux, FreeBSD, NetBSD and Haiku.
**-v \| -V \| \--version** **-v \| -V \| \--version**

View File

@ -53,7 +53,7 @@ bool bsdcommon::init_kvm() {
} }
kvm_initialised = true; kvm_initialised = true;
return false; return true;
} }
void bsdcommon::deinit_kvm() { void bsdcommon::deinit_kvm() {
@ -223,7 +223,7 @@ static bool is_top_process(BSD_COMMON_PROC_STRUCT *p) {
#endif #endif
} }
static int32_t get_pd(BSD_COMMON_PROC_STRUCT *p) { static int32_t get_pid(BSD_COMMON_PROC_STRUCT *p) {
#if defined(__NetBSD__) #if defined(__NetBSD__)
return p->p_pid; return p->p_pid;
#else #else
@ -309,7 +309,7 @@ void bsdcommon::update_top_info() {
continue; continue;
} }
proc = get_process(get_pd(p)); proc = get_process(get_pid(p));
if (!proc) { if (!proc) {
continue; continue;
} }
@ -317,3 +317,36 @@ void bsdcommon::update_top_info() {
proc_from_bsdproc(proc, p); proc_from_bsdproc(proc, p);
} }
} }
static bool is_process(BSD_COMMON_PROC_STRUCT *p, const char *name) {
#if defined(__NetBSD__)
return p->p_comm[0] != 0 && strcmp(p->p_comm, name) == 0;
#else
#error Not supported BSD system
#endif
}
bool bsdcommon::is_conky_already_running() {
if (!init_kvm()) {
return false;
}
struct process *proc = nullptr;
short unsigned int nprocs = 0;
int instances = 0;
BSD_COMMON_PROC_STRUCT *ps = get_processes(&nprocs);
if (ps == nullptr) {
return false;
}
for (int i = 0; i < nprocs && instances < 2; ++i) {
BSD_COMMON_PROC_STRUCT *p = &ps[i];
if (is_process(p, "conky")) {
++instances;
}
}
return instances > 1;
}

View File

@ -56,6 +56,7 @@ namespace bsdcommon {
void get_number_of_running_processes(short unsigned int *run_procs); void get_number_of_running_processes(short unsigned int *run_procs);
void update_top_info(); void update_top_info();
}; bool is_conky_already_running();
}
#endif /*BSDCOMMON_H_*/ #endif /*BSDCOMMON_H_*/

View File

@ -2110,9 +2110,9 @@ void set_current_config() {
const char *getopt_string = const char *getopt_string =
"vVqdDSs:t:u:i:hc:p:" "vVqdDSs:t:u:i:hc:p:"
#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
defined(__HAIKU__) defined(__HAIKU__) || defined(__NetBSD__)
"U" "U"
#endif /* Linux || FreeBSD || Haiku */ #endif /* Linux || FreeBSD || Haiku || NetBSD */
#ifdef BUILD_X11 #ifdef BUILD_X11
"x:y:w:a:X:m:f:" "x:y:w:a:X:m:f:"
#ifdef OWN_WINDOW #ifdef OWN_WINDOW
@ -2144,9 +2144,9 @@ const struct option longopts[] = {
{"text", 1, nullptr, 't'}, {"interval", 1, nullptr, 'u'}, {"text", 1, nullptr, 't'}, {"interval", 1, nullptr, 'u'},
{"pause", 1, nullptr, 'p'}, {"pause", 1, nullptr, 'p'},
#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
defined(__HAIKU__) defined(__HAIKU__) || defined(__NetBSD__)
{"unique", 0, nullptr, 'U'}, {"unique", 0, nullptr, 'U'},
#endif /* Linux || FreeBSDi || Haiku */ #endif /* Linux || FreeBSDi || Haiku || NetBSD */
{nullptr, 0, nullptr, 0} {nullptr, 0, nullptr, 0}
}; };

View File

@ -282,9 +282,9 @@ static void print_help(const char *prog_name) {
" -p, --pause=SECS pause for SECS seconds at startup " " -p, --pause=SECS pause for SECS seconds at startup "
"before doing anything\n" "before doing anything\n"
#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
defined(__HAIKU__) defined(__HAIKU__) || defined(__NetBSD__)
" -U, --unique only one conky process can be created\n" " -U, --unique only one conky process can be created\n"
#endif /* Linux || FreeBSD || Haiku */ #endif /* Linux || FreeBSD || Haiku || NetBSD */
, prog_name); , prog_name);
} }
@ -368,18 +368,18 @@ int main(int argc, char **argv) {
break; break;
#endif /* BUILD_X11 */ #endif /* BUILD_X11 */
#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
defined(__HAIKU__) defined(__HAIKU__) || defined(__NetBSD__)
case 'U': case 'U':
unique_process = true; unique_process = true;
break; break;
#endif /* Linux || FreeBSD || Haiku */ #endif /* Linux || FreeBSD || Haiku || NetBSD */
case '?': case '?':
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
defined(__HAIKU__) defined(__HAIKU__) || defined(__NetBSD__)
if (unique_process && is_conky_already_running()) { if (unique_process && is_conky_already_running()) {
NORM_ERR("already running"); NORM_ERR("already running");
return 0; return 0;

View File

@ -322,3 +322,6 @@ int update_diskio(void) {
return 1; return 1;
} }
bool is_conky_already_running() {
return bsdcommon::is_conky_already_running();
}

View File

@ -20,4 +20,6 @@
int get_entropy_avail(unsigned int *); int get_entropy_avail(unsigned int *);
int get_entropy_poolsize(unsigned int *); int get_entropy_poolsize(unsigned int *);
bool is_conky_already_running();
#endif /*NETBSD_H_*/ #endif /*NETBSD_H_*/