Commit ed8382c88dc986225fadd4099bd0625cbe5b47f1

Luke Dashjr 2012-03-12T14:56:05

Make curses TUI support optional at compile-time.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
diff --git a/adl.c b/adl.c
index 7a4707e..e561fa2 100644
--- a/adl.c
+++ b/adl.c
@@ -12,9 +12,12 @@
 #if defined(HAVE_ADL) && (defined(__linux) || defined (WIN32))
 
 #include <stdio.h>
-#include <curses.h>
 #include <string.h>
 
+#ifdef HAVE_CURSES
+#include <curses.h>
+#endif
+
 #include "miner.h"
 #include "ADL_SDK/adl_sdk.h"
 #include "compat.h"
@@ -850,6 +853,7 @@ static void get_vddcrange(int gpu, float *imin, float *imax)
 	*imax = (float)ga->lpOdParameters.sVddc.iMax / 1000;
 }
 
+#ifdef HAVE_CURSES
 static float curses_float(const char *query)
 {
 	float ret;
@@ -860,6 +864,7 @@ static float curses_float(const char *query)
 	free(cvar);
 	return ret;
 }
+#endif
 
 int set_vddc(int gpu, float fVddc)
 {
@@ -1138,6 +1143,7 @@ void set_defaultengine(int gpu)
 	unlock_adl();
 }
 
+#ifdef HAVE_CURSES
 void change_autosettings(int gpu)
 {
 	struct gpu_adl *ga = &gpus[gpu].adl;
@@ -1294,6 +1300,7 @@ updated:
 	sleep(1);
 	goto updated;
 }
+#endif
 
 void clear_adl(int nDevs)
 {
diff --git a/cgminer.c b/cgminer.c
index c336f8b..217e759 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -11,7 +11,9 @@
 
 #include "config.h"
 
+#ifdef HAVE_CURSES
 #include <curses.h>
+#endif
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -116,7 +118,13 @@ int gpu_threads;
 int opt_n_threads = -1;
 int mining_threads;
 int num_processors;
-bool use_curses = true;
+bool use_curses =
+#ifdef HAVE_CURSES
+	true
+#else
+	false
+#endif
+;
 static bool opt_submit_stale;
 static int opt_shares;
 static bool opt_fail_only;
@@ -141,7 +149,9 @@ int longpoll_thr_id;
 static int stage_thr_id;
 static int watchpool_thr_id;
 static int watchdog_thr_id;
+#ifdef HAVE_CURSES
 static int input_thr_id;
+#endif
 int gpur_thr_id;
 static int api_thr_id;
 static int total_threads;
@@ -151,7 +161,9 @@ struct work_restart *work_restart = NULL;
 static pthread_mutex_t hash_lock;
 static pthread_mutex_t qd_lock;
 static pthread_mutex_t *stgd_lock;
+#ifdef HAVE_CURSES
 static pthread_mutex_t curses_lock;
+#endif
 static pthread_rwlock_t blk_lock;
 pthread_rwlock_t netacc_lock;
 
@@ -179,6 +191,9 @@ enum pool_strategy pool_strategy = POOL_FAILOVER;
 int opt_rotate_period;
 static int total_urls, total_users, total_passes, total_userpasses;
 
+#ifndef HAVE_CURSES
+const
+#endif
 static bool curses_active = false;
 
 static char current_block[37];
@@ -828,7 +843,12 @@ static struct opt_table opt_config_table[] = {
 #endif
 	OPT_WITHOUT_ARG("--text-only|-T",
 			opt_set_invbool, &use_curses,
-			"Disable ncurses formatted screen output"),
+#ifdef HAVE_CURSES
+			"Disable ncurses formatted screen output"
+#else
+			opt_hidden
+#endif
+	),
 	OPT_WITH_ARG("--url|-o",
 		     set_url, NULL, NULL,
 		     "URL for bitcoin JSON-RPC server"),
@@ -1127,13 +1147,16 @@ static int requests_staged(void)
 	return ret;
 }
 
+#ifdef HAVE_CURSES
 WINDOW *mainwin, *statuswin, *logwin;
+#endif
 double total_secs = 0.1;
 static char statusline[256];
 static int devcursor, logstart, logcursor;
 struct cgpu_info gpus[MAX_GPUDEVICES]; /* Maximum number apparently possible */
 struct cgpu_info *cpus;
 
+#ifdef HAVE_CURSES
 static inline void unlock_curses(void)
 {
 	mutex_unlock(&curses_lock);
@@ -1154,6 +1177,7 @@ static bool curses_active_locked(void)
 		unlock_curses();
 	return ret;
 }
+#endif
 
 void tailsprintf(char *f, const char *fmt, ...)
 {
@@ -1192,6 +1216,7 @@ static void text_print_status(int thr_id)
 	}
 }
 
+#ifdef HAVE_CURSES
 /* Must be called with curses mutex lock held and curses_active */
 static void curses_print_status(void)
 {
@@ -1274,6 +1299,7 @@ static void curses_print_devstatus(int thr_id)
 
 		wclrtoeol(statuswin);
 }
+#endif
 
 static void print_status(int thr_id)
 {
@@ -1281,6 +1307,7 @@ static void print_status(int thr_id)
 		text_print_status(thr_id);
 }
 
+#ifdef HAVE_CURSES
 /* Check for window resize. Called with curses mutex locked */
 static inline bool change_logwinsize(void)
 {
@@ -1336,7 +1363,9 @@ void wlogprint(const char *f, ...)
 		unlock_curses();
 	}
 }
+#endif
 
+#ifdef HAVE_CURSES
 void log_curses(int prio, const char *f, va_list ap)
 {
 	bool high_prio;
@@ -1366,6 +1395,7 @@ void clear_logwin(void)
 		unlock_curses();
 	}
 }
+#endif
 
 /* regenerate the full work->hash value and also return true if it's a block */
 bool regeneratehash(const struct work *work)
@@ -1700,6 +1730,7 @@ static void workio_cmd_free(struct workio_cmd *wc)
 	free(wc);
 }
 
+#ifdef HAVE_CURSES
 static void disable_curses(void)
 {
 	if (curses_active_locked()) {
@@ -1728,6 +1759,7 @@ static void disable_curses(void)
 		unlock_curses();
 	}
 }
+#endif
 
 static void print_summary(void);
 
@@ -2259,6 +2291,7 @@ static bool stage_work(struct work *work)
 	return true;
 }
 
+#ifdef HAVE_CURSES
 int curses_int(const char *query)
 {
 	int ret;
@@ -2269,8 +2302,11 @@ int curses_int(const char *query)
 	free(cvar);
 	return ret;
 }
+#endif
 
+#ifdef HAVE_CURSES
 static bool input_pool(bool live);
+#endif
 
 int active_pools(void)
 {
@@ -2284,6 +2320,7 @@ int active_pools(void)
 	return ret;
 }
 
+#ifdef HAVE_CURSES
 static void display_pool_summary(struct pool *pool)
 {
 	double efficiency = 0.0;
@@ -2331,6 +2368,7 @@ static void remove_pool(struct pool *pool)
 	pool->pool_no = total_pools;
 	total_pools--;
 }
+#endif
 
 void write_config(FILE *fcfg)
 {
@@ -2481,6 +2519,7 @@ void write_config(FILE *fcfg)
 	fputs("\n}", fcfg);
 }
 
+#ifdef HAVE_CURSES
 static void display_pools(void)
 {
 	struct pool *pool;
@@ -2685,10 +2724,12 @@ retry:
 	immedok(logwin, false);
 	opt_loginput = false;
 }
+#endif
 
 static void start_longpoll(void);
 static void stop_longpoll(void);
 
+#ifdef HAVE_CURSES
 static void set_options(void)
 {
 	int selected;
@@ -2829,6 +2870,7 @@ static void *input_thread(void __maybe_unused *userdata)
 
 	return NULL;
 }
+#endif
 
 /* This thread should not be shut down unless a problem occurs */
 static void *workio_thread(void *userdata)
@@ -3709,6 +3751,7 @@ out:
 	return NULL;
 }
 
+__maybe_unused
 static void stop_longpoll(void)
 {
 	struct thr_info *thr = &thr_info[longpoll_thr_id];
@@ -3795,6 +3838,7 @@ static void *watchdog_thread(void __maybe_unused *userdata)
 
 		hashmeter(-1, &zero_tv, 0);
 
+#ifdef HAVE_CURSES
 		if (curses_active_locked()) {
 			change_logwinsize();
 			curses_print_status();
@@ -3806,6 +3850,7 @@ static void *watchdog_thread(void __maybe_unused *userdata)
 			wrefresh(logwin);
 			unlock_curses();
 		}
+#endif
 
 		gettimeofday(&now, NULL);
 
@@ -4010,7 +4055,9 @@ static void clean_up(void)
 #endif
 
 	gettimeofday(&total_tv_end, NULL);
+#ifdef HAVE_CURSES
 	disable_curses();
+#endif
 	if (!opt_realquiet && successful_connect)
 		print_summary();
 
@@ -4037,6 +4084,7 @@ void quit(int status, const char *format, ...)
 	exit(status);
 }
 
+#ifdef HAVE_CURSES
 char *curses_input(const char *query)
 {
 	char *input;
@@ -4054,6 +4102,7 @@ char *curses_input(const char *query)
 	noecho();
 	return input;
 }
+#endif
 
 int add_pool_details(bool live, char *url, char *user, char *pass)
 {
@@ -4089,6 +4138,7 @@ int add_pool_details(bool live, char *url, char *user, char *pass)
 	return ADD_POOL_OK;
 }
 
+#ifdef HAVE_CURSES
 static bool input_pool(bool live)
 {
 	char *url = NULL, *user = NULL, *pass = NULL;
@@ -4140,6 +4190,7 @@ out:
 	}
 	return ret;
 }
+#endif
 
 #if defined(unix)
 	static void fork_monitor()
@@ -4209,6 +4260,7 @@ out:
 	}
 #endif // defined(unix)
 
+#ifdef HAVE_CURSES
 void enable_curses(void) {
 	int x,y;
 
@@ -4231,6 +4283,7 @@ void enable_curses(void) {
 	curses_active = true;
 	unlock_curses();
 }
+#endif
 
 /* TODO: fix need a dummy CPU device_api even if no support for CPU mining */
 #ifndef WANT_CPUMINE
@@ -4280,7 +4333,9 @@ int main (int argc, char *argv[])
 
 	mutex_init(&hash_lock);
 	mutex_init(&qd_lock);
+#ifdef HAVE_CURSES
 	mutex_init(&curses_lock);
+#endif
 	mutex_init(&control_lock);
 	rwlock_init(&blk_lock);
 	rwlock_init(&netacc_lock);
@@ -4362,8 +4417,10 @@ int main (int argc, char *argv[])
 		successful_connect = true;
 	}
 
+#ifdef HAVE_CURSES
 	if (use_curses)
 		enable_curses();
+#endif
 
 	applog(LOG_WARNING, "Started %s", packagename);
 
@@ -4467,14 +4524,18 @@ int main (int argc, char *argv[])
 	logstart += total_devices;
 	logcursor = logstart + 1;
 
+#ifdef HAVE_CURSES
 	check_winsizes();
 
 	if (opt_realquiet)
 		use_curses = false;
+#endif
 
 	if (!total_pools) {
 		applog(LOG_WARNING, "Need to specify at least one pool server.");
-		if (!use_curses || (use_curses && !input_pool(false)))
+#ifdef HAVE_CURSES
+		if (!use_curses || !input_pool(false))
+#endif
 			quit(1, "Pool setup failed");
 	}
 
@@ -4596,6 +4657,7 @@ int main (int argc, char *argv[])
 				applog(LOG_WARNING, "Pool: %d  URL: %s  User: %s  Password: %s",
 				       i, pool->rpc_url, pool->rpc_user, pool->rpc_pass);
 			}
+#ifdef HAVE_CURSES
 			if (use_curses) {
 				halfdelay(150);
 				applog(LOG_ERR, "Press any key to exit, or cgminer will try again in 15s.");
@@ -4603,6 +4665,7 @@ int main (int argc, char *argv[])
 					quit(0, "No servers could be used! Exiting.");
 				nocbreak();
 			} else
+#endif
 				quit(0, "No servers could be used! Exiting.");
 		}
 	} while (!pools_active);
@@ -4707,6 +4770,7 @@ begin_bench:
 		quit(1, "API thread create failed");
 	pthread_detach(thr->pth);
 
+#ifdef HAVE_CURSES
 	/* Create curses input thread for keyboard input. Create this last so
 	 * that we know all threads are created since this can call kill_work
 	 * to try and shut down ll previous threads. */
@@ -4715,6 +4779,7 @@ begin_bench:
 	if (thr_info_create(thr, NULL, input_thread, thr))
 		quit(1, "input thread create failed");
 	pthread_detach(thr->pth);
+#endif
 
 	/* main loop - simply wait for workio thread to exit. This is not the
 	 * normal exit path and only occurs should the workio_thread die
diff --git a/configure.ac b/configure.ac
index f505383..a6a97d8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -207,12 +207,33 @@ if test "x$icarus" = xyes; then
 fi
 AM_CONDITIONAL([HAS_ICARUS], [test x$icarus = xyes])
 
-AC_SEARCH_LIBS(addstr, ncurses pdcurses, ,
-        AC_MSG_ERROR([Could not find curses library - please install libncurses-dev or pdcurses-dev]))
 
-AC_CHECK_LIB(ncurses, addstr, NCURSES_LIBS=-lncurses)
-AC_CHECK_LIB(pdcurses, addstr, PDCURSES_LIBS=-lpdcurses)
+curses="auto"
 
+AC_ARG_WITH([curses],
+	[AC_HELP_STRING([--without-curses],[Compile support for curses TUI (default enabled)])],
+	[curses=$withval]
+	)
+if test "x$curses" = "xno"; then
+	cursesmsg='User specified --without-curses. TUI support DISABLED'
+else
+	AC_SEARCH_LIBS(addstr, ncurses pdcurses, [
+		curses=yes
+		cursesmsg="FOUND: ${ac_cv_search_addstr:2}"
+		AC_DEFINE([HAVE_CURSES], [1], [Defined to 1 if curses TUI support is wanted])
+	], [
+		if test "x$curses" = "xyes"; then
+			AC_MSG_ERROR([Could not find curses library - please install libncurses-dev or pdcurses-dev (or configure --without-curses)])
+		else
+			AC_MSG_WARN([Could not find curses library - if you want a TUI, install libncurses-dev or pdcurses-dev])
+			curses=no
+			cursesmsg='NOT FOUND. TUI support DISABLED'
+		fi
+	])
+fi
+
+
+AM_CONDITIONAL([HAVE_CURSES], [test x$curses = xyes])
 AM_CONDITIONAL([WANT_JANSSON], [test x$request_jansson = xtrue])
 AM_CONDITIONAL([HAVE_WINDOWS], [test x$have_win32 = xtrue])
 AM_CONDITIONAL([HAVE_x86_64], [test x$have_x86_64 = xtrue])
@@ -365,6 +386,8 @@ echo
 echo "Configuration Options Summary:"
 echo
 
+echo "  curses.TUI...........: $cursesmsg"
+
 if test "x$opencl" != xno; then
 	if test $found_opencl = 1; then
 		echo "  OpenCL...............: FOUND. GPU mining support enabled"
diff --git a/device-gpu.c b/device-gpu.c
index 70dea39..1a3e35d 100644
--- a/device-gpu.c
+++ b/device-gpu.c
@@ -11,7 +11,10 @@
 
 #include "config.h"
 
+#ifdef HAVE_CURSES
 #include <curses.h>
+#endif
+
 #include <string.h>
 #include <stdbool.h>
 #include <stdint.h>
@@ -32,8 +35,10 @@
 
 /* TODO: cleanup externals ********************/
 
+#ifdef HAVE_CURSES
 extern WINDOW *mainwin, *statuswin, *logwin;
 extern void enable_curses(void);
+#endif
 
 extern int mining_threads;
 extern double total_secs;
@@ -526,6 +531,9 @@ void pause_dynamic_threads(int gpu)
 
 struct device_api opencl_api;
 
+#endif /* HAVE_OPENCL */
+
+#if defined(HAVE_OPENCL) && defined(HAVE_CURSES)
 void manage_gpu(void)
 {
 	struct thr_info *thr;
@@ -1177,11 +1185,13 @@ static bool opencl_thread_prepare(struct thr_info *thr)
 			applog(LOG_ERR, "Restarting the GPU from the menu will not fix this.");
 			applog(LOG_ERR, "Try restarting cgminer.");
 			failmessage = true;
+#ifdef HAVE_CURSES
 			if (use_curses) {
 				buf = curses_input("Press enter to continue");
 				if (buf)
 					free(buf);
 			}
+#endif
 		}
 		cgpu->deven = DEV_DISABLED;
 		cgpu->status = LIFE_NOSTART;
diff --git a/logging.c b/logging.c
index a73db08..cf5e403 100644
--- a/logging.c
+++ b/logging.c
@@ -18,9 +18,29 @@ bool opt_log_output = false;
 /* per default priorities higher than LOG_NOTICE are logged */
 int opt_log_level = LOG_NOTICE;
 
-void vapplog(int prio, const char *fmt, va_list ap)
+static void my_log_curses(int prio, char *f, va_list ap)
 {
+#ifdef HAVE_CURSES
 	extern bool use_curses;
+	if (use_curses)
+		log_curses(prio, f, ap);
+	else
+#endif
+	{
+		int len = strlen(f);
+
+		strcpy(f + len - 1, "                    \n");
+
+#ifdef HAVE_CURSES
+		log_curses(prio, f, ap);
+#else
+		vprintf(f, ap);
+#endif
+	}
+}
+
+void vapplog(int prio, const char *fmt, va_list ap)
+{
 	if (!opt_debug && prio == LOG_DEBUG)
 		return;
 
@@ -60,15 +80,7 @@ void vapplog(int prio, const char *fmt, va_list ap)
 			fflush(stderr);
 		}
 
-		if (use_curses)
-			log_curses(prio, f, ap);
-		else {
-			int len = strlen(f);
-
-			strcpy(f + len - 1, "                    \n");
-
-			log_curses(prio, f, ap);
-		}
+		my_log_curses(prio, f, ap);
 	}
 }
 
@@ -90,7 +102,6 @@ void applog(int prio, const char *fmt, ...)
  */
 static void __maybe_unused log_generic(int prio, const char *fmt, va_list ap)
 {
-	extern bool use_curses;
 #ifdef HAVE_SYSLOG_H
 	if (use_syslog) {
 		vsyslog(prio, fmt, ap);
@@ -127,15 +138,7 @@ static void __maybe_unused log_generic(int prio, const char *fmt, va_list ap)
 			fflush(stderr);
 		}
 
-		if (use_curses)
-			log_curses(prio, f, ap);
-		else {
-			int len = strlen(f);
-
-			strcpy(f + len - 1, "                    \n");
-
-			log_curses(prio, f, ap);
-		}
+		my_log_curses(prio, f, ap);
 	}
 }
 /* we can not generalize variable argument list */
diff --git a/util.c b/util.c
index 3dff4ee..6a5dcd8 100644
--- a/util.c
+++ b/util.c
@@ -19,7 +19,6 @@
 #include <jansson.h>
 #include <curl/curl.h>
 #include <time.h>
-#include <curses.h>
 #include <errno.h>
 #include <unistd.h>
 #include <sys/types.h>