Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37401146
en ru br
ALT Linux repos
S:1.2.1-alt1
5.0: 1.1.35-alt1.1
4.1: 1.1.35-alt1
4.0: 1.1.31-alt1.1
3.0: 1.1.31-alt1

Group :: Communications
RPM: mgetty

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: mgetty-1.1.25-cid.patch
Download


diff --git a/mgetty/README.CID b/mgetty/README.CID
new file mode 100644
index 0000000..7472767
--- /dev/null
+++ b/mgetty/README.CID
@@ -0,0 +1,142 @@
+===============================================================================
+         Патч для mgetty v.1.1.25 для работы с временными промежутками
+            и поддержки АОН'а в USR Courier V.Evr с ID SDL >= 3.03
+===============================================================================
+
+                Поддержка временных промежутков для ответа на звонки
+
+Данный патч позволяет задавать время  для  ответа на звонки не только с помощью
+файла  /etc/nologin[.device],  но  и  непосредственно  в конфигурационном файле
+mgetty.  Это позволяет сделать работу mgetty практически не зависящей от работы
+cron'а, с помощью которого, как правило, создается и удаляется файл /etc/nolog-
+in[.device].
+
+После установки данного патча  в конфигурационном файле можно задавать параметр
+"answer-time <time>", где <time> - временные промежутки, в которые mgetty будет
+отвечать  на  звонки. Формат <time> позаимствован из документации  к  программе
+T-Mail by Endy Elkin.
+
+                   Краткое описание формата <time>
+
+Можно задавать часы, промежутки часов, часы с днями и промежутки с днями.
+
+Рассмотрим это подробней:
+
+"answer-time 23"
+    отвечать только в течении 23-го часа.
+
+"answer-time 23,0,1,2"
+    отвечать в 23, 0, 1 и 2 часа.
+
+"answer-time 23-2" или "answer-time 23:00-2:00"
+    отвечать в промежуток с 23 до 2 часов.
+
+"answer-time 1.23"
+    отвечать в 23 часа только в понедельник.
+
+"answer-time 7.23"
+    отвечать в 23 часа только в воскресенье.
+
+"answer-time 2.23-2.2" или "answer-time 2.23:00-2.2:00"
+    отвечать с 23 до 2 часов только во вторник.
+
+"answer-time 2.23-5.2" или "answer-time 2.23:00-5.2:00"
+    отвечать с 23 до 2 часов во вторник, среду, четверг и пятницу.
+
+Временные промежутки можно комбинировать в любом порядке, так,  например, чтобы
+задать  время  ответа с 23 до 7 часов в будни и круглосуточно в выходные, нужно
+указать:
+
+"answer-time 23-7,6.0-7.24" или "answer-time 1.23:00-5.7:00,6.0:00-7.24:00"
+
+Промежутки разделяются запятыми, количество их не ограничено (в  разумных  пре-
+делах ;).
+
+Реакция  на  наличие  файла  /etc/nologin[.device]  не  изменилась,  т.е.  если
+текущее время попадает на рабочий промежуток, но присутствует  файл /etc/nolog-
+in[.device] - mgetty  отвечать  на  звонок НЕ будет, файл /etc/nologin[.device]
+имеет более высокий приоритет.
+
+Если  параметр  answer-time  в  файле  конфигурации mgetty.config отсутствует -
+mgetty  работает  по старому алгоритму,  т.е. отвечает на звонки согласно нали-
+чию/отсутствию файла /etc/nologin[.device].
+
+             Поддержка временных промежутков в конфигурационном файле
+	     
+Если  перед параметром в конфигурационном файле указать скобки {}, а в них вре-
+менной  промежуток <time>, то этот параметр будет прочитан из конфигурационного
+файла  только если текущее время (т.е. время [и день] в которое читается конфи-
+гурационный файл) попадает в этот промежуток. Формат <time> описан выше.
+
+Первый пример:
+==========================
+{22:00-8:00}	rings 1
+{8:00-22:00}	rings 5
+==========================
+
+С 22 до 8 часов mgetty будет отвечать на звонки с первого звонка, а с 8 до 22
+только с пятого.
+
+Второй пример:
+==================================
+{1.22:00-5.8:00}	rings 1
+{6.00:00-7.24:00}	rings 2
+{1.8:00-5.22:00}	rings 5
+==================================
+
+По будням отвечать с 22 до 8 часов с первого звонка, по выходным круглосуточно
+со второго, все остальное время с пятого.
+
+Третий пример:
+==============================
+{8:00-22:00}	rings 5
+{8:00-22:00}	fax-only y
+{22:00-8:00}	rings 1
+{22:00-8:00}	data-only y
+==============================
+
+Днем работать только как факс, отвечая с пятого звонка, а ночью как модем отве-
+чая с первого.
+
+Хинты:
+    1. Не забывайте перезапускать mgetty при наступлении очередного промежутка
+       через killall или kill из cron'а. Для первого примера файл cron'а будет
+       выглядеть так:  (для систем с одним модемом)
+       ====================================
+       0 22	* * *	killall -q mgetty
+       0 8	* * *	killall -q mgetty
+       ====================================
+    2. /etc/nologin[.device] и answer-time имеет бОльший приоритет над rings.
+
+                           Поддержка ID SDL ver >= 3.03
+
+Для корректной поддержки ID SDL необходимо добавить  в  конфигурационный  файл
+пару строк:
+
+--------------------------------------------
+get-cnd-chat "" AT+S62=3+S64=1+S65=0+SR1 OK
+deny-chat "" ATH0 OK
+--------------------------------------------
+
+Смысл заключается в том, чтобы после получения RING поднять  трубку, определить
+номер  и  перейти  в командный режим. Затем mgetty произведет поиск полученного
+номера по  файлу  dialin.config и если номер занесен в "черный список" пошлет в
+модем  строку  из deny-chat (в данном случае: положит трубку и перейдет в режим
+ожидания). Параметр deny-chat вводится этим патчем.
+
+Соответственно, полученное значение caller-id будет занесено в переменную окру-
+жения CALLER_ID (см. документацию к mgetty).
+
+Хинты:
+    1. В файл dialin.config нужно вносить не только сам номер, но и категорию
+       абонента (точнее все, что определяется по АОН'у). Например, номер опре-
+       делившийся как 2356545:2 нужно заносить как 2356545:2, а не 2356545.
+
+===============================================================================
+Взять этот патч и патченную mgetty можно на http://scorpus.cjb.net
+                                        или http://www.my.creations.da.ru
+или по запросу через FidoNet или E-Mail (примерно 15кб в UUE).
+
+                         Автор патча Алексей Гречанинов (Alexey U Gretchaninov)
+                                      2:5010/81, scorpus@iname.com, ICQ 3272821
+===============================================================================
\ No newline at end of file
diff --git a/mgetty/conf_mg.c b/mgetty/conf_mg.c
index a166c8a..ea96cfe 100644
--- a/mgetty/conf_mg.c
+++ b/mgetty/conf_mg.c
@@ -101,7 +101,9 @@ struct conf_data_mgetty c = {
 	{ "msn-list", {(p_int) NULL}, CT_CHAT, C_EMPTY },
 	{ "get-cnd-chat", {0}, CT_CHAT, C_EMPTY },
 	{ "cid-program", {(p_int) NULL}, CT_STRING, C_EMPTY },
+	{ "deny-chat", {0}, CT_CHAT, C_EMPTY },
 	{ "cnd-program", {(p_int) NULL}, CT_STRING, C_EMPTY },
+	{ "answer-time", {(p_int) NULL}, CT_STRING, C_EMPTY },
 	{ "answer-chat", {0}, CT_CHAT, C_EMPTY },
 	{ "answer-chat-timeout", {80}, CT_INT, C_PRESET },
 	{ "autobauding", {FALSE}, CT_BOOL, C_PRESET },
diff --git a/mgetty/conf_mg.h b/mgetty/conf_mg.h
index 0d1665d..8a9093a 100644
--- a/mgetty/conf_mg.h
+++ b/mgetty/conf_mg.h
@@ -49,7 +49,9 @@ extern struct conf_data_mgetty {
 	msn_list,				/* ISDN MSNs (dist.ring) */
 	getcnd_chat,				/* get caller ID (for ELINK)*/
 	cid_program,				/* notify about caller ID */
+	deny_chat,				/* hangup modem chat */
 	cnd_program,				/* accept caller? */
+	answer_time,				/* Answer time */
 	answer_chat,				/* ATA...CONNECT...""...\n */
 	answer_chat_timeout,			/* longer as S7! */
 	autobauding,
diff --git a/mgetty/config.c b/mgetty/config.c
index 9dd4f2c..e34af2e 100644
--- a/mgetty/config.c
+++ b/mgetty/config.c
@@ -12,6 +12,7 @@
 #include "syslibs.h"
 #include <ctype.h>
 #include <string.h>
+#include <time.h>
 #ifndef ENOENT
 #include <errno.h>
 #endif
@@ -19,6 +20,8 @@
 #include "mgetty.h"
 #include "config.h"
 
+int is_time_now(char *);
+
 /* read a line from FILE * fp, terminated by "\n"
  * the line can be of any length (buffer will dynamically grow)
  * - trailing "\n" is chopped off
@@ -358,6 +361,13 @@ int ignore = 0;		/* ignore keywords in non-matching section */
     {
 	norm_line( &line, &key );
 	if ( key[0] == 0 ) continue;		/* empty line */
+	
+	if( key[0] == '{')
+	    {
+	    if( strchr(key, '}') ) *strchr( key, '}' ) = 0;
+	    if( !is_time_now( key + 1 ) ) continue;
+	    norm_line( &line, &key );
+	    }
 
 	lprintf( L_NOISE, "conf lib: read: '%s %s'", key, line );
 
@@ -478,3 +488,213 @@ char * _makepath _P2( (file, path), char * file, char * path )
     sprintf( p, "%s/%s", path, file );
     return p;
 }
+
+int is_time_now(char *timeRanges)
+{
+int firstDay, secondDay, firstHour, firstMinute, secondHour, secondMinute,
+    firstMark, secondMark, currentMark, Day, Hour, Min;
+char *p, *s, *f, *rs, *r;
+time_t Time;
+struct tm *localTime;
+
+if(!strlen(timeRanges))
+    {
+    lprintf( L_ERROR, "empty timerange(s) string!");
+    return 0;
+    }
+    
+if(!(rs = strdup(timeRanges))) return 0;
+
+lprintf( L_NOISE, "work timerange(s): \"%s\"", rs);
+
+for(r = strtok(rs, ","); r; r = strtok(NULL, ","))
+    {
+    if(!strcasecmp(r, "CM")) { free(rs); return 1;}
+    if(!strlen(r)) continue;
+
+    firstDay = -1;
+    secondDay = -1;
+    firstHour = -1;
+    firstMinute = -1;
+    secondHour = -1;
+    secondMinute = -1;
+
+    lprintf( L_NOISE, "timerange: \"%s\"", r);
+
+    if((p = strchr(r, '-')))
+	{
+        if((s = strchr(r, '.')))
+	    {
+	    firstDay = atoi(s - 1);
+	    firstHour = atoi(s + 1);
+	    if((f = strchr(s + 1, ':')) && f < p) firstMinute = atoi(f + 1);
+	
+	    if((s = strchr(p + 1, '.')))
+		{
+		secondDay = atoi(s - 1);
+		secondHour = atoi(s + 1);
+		if((f = strchr(s + 1, ':'))) secondMinute = atoi(f + 1);
+		}
+	    else
+		{
+		lprintf( L_ERROR, "can't parse timerange: \"%s\"", r);
+		free(rs);
+		return 0;
+		}
+	    }
+	else
+	    {
+	    firstHour = atoi(r);
+	    if((f = strchr(r, ':')) && f < p) firstMinute = atoi(f + 1);
+	    secondHour = atoi(p + 1);
+	    if((f = strchr(p + 1, ':'))) secondMinute = atoi(f + 1);
+	    }
+	}
+    else
+	{
+	if((s = strchr(r, '.')))
+	    {
+	    firstDay = atoi(s - 1);
+	    firstHour = atoi(s + 1);
+	    if((p = strchr(s + 1,':'))) firstMinute = atoi(p + 1);
+	    }
+	else
+	    {
+	    firstHour = atoi(r);
+	    if((p = strchr(r,':'))) firstMinute = atoi(p + 1);
+	    }
+	}
+    
+    if( firstDay < -1 || firstDay > 7 || firstDay == 0 || firstHour < -1 ||
+	firstHour > 23 || firstMinute< -1 || firstMinute > 59 || secondDay < -1
+	|| secondDay > 7  || secondDay == 0 || secondHour < -1 ||
+	secondHour > 24 || secondMinute < -1 || secondMinute > 59 ||
+	firstHour == -1 || (secondDay != -1 && secondHour == -1))
+	{
+	lprintf( L_ERROR, "can't parse timerange: \"%s\"", r);
+	free(rs);
+	return 0;
+	}
+
+    lprintf( L_NOISE, "parsed timerange: %i.%i:%i - %i.%i:%i", firstDay,
+		    firstHour, firstMinute, secondDay, secondHour, secondMinute);
+
+    Time = time(NULL);
+    localTime = localtime(&Time);
+
+    Day = localTime->tm_wday;
+    if(!Day) Day = 7;
+    Hour = localTime->tm_hour;
+    Min = localTime->tm_min;
+    
+    lprintf( L_NOISE, "current time: day %u, hour %u, min %u", Day, Hour, Min);
+
+    firstMark = firstHour * 60;
+    if(firstMinute != -1) firstMark += firstMinute;
+
+    secondMark = secondHour * 60;
+    if(secondMinute != -1) secondMark += secondMinute;
+
+    currentMark = Hour * 60 + Min;
+    
+    lprintf( L_NOISE, "firstmark: %i, secondmark: %i, currentmark: %i",
+				    firstMark, secondMark, currentMark);
+	
+    if(secondDay != -1)
+        {
+	if(firstDay < secondDay)
+	    {
+	    if(Day >= firstDay && Day <= secondDay)
+		{
+		if(firstMark < secondMark)
+		    {
+		    if(currentMark >= firstMark && currentMark < secondMark)
+			{ free(rs); return 1; }
+		    }
+		else
+		    {
+		    if(currentMark >= firstMark || currentMark < secondMark)
+			{ free(rs); return 1; }
+		    }
+		}
+	    }
+	else 
+	    {
+	    if(firstDay == secondDay)
+		{
+		if(Day == firstDay)
+		    {
+		    if(firstMark < secondMark)
+			{
+			if(currentMark >= firstMark && currentMark < secondMark)
+			    { free(rs); return 1;}
+			}
+		    else
+			{
+			if(currentMark >= firstMark || currentMark < secondMark)
+			    { free(rs); return 1;}
+			}
+		    }
+		}
+	    else
+		{
+		if(Day >= firstDay || Day <= secondDay)
+		    {
+		    if(firstMark < secondMark)
+			{
+			if(currentMark >= firstMark && currentMark < secondMark)
+			    { free(rs); return 1;}
+			}
+		    else
+			{
+			if(currentMark >= firstMark || currentMark < secondMark)
+			    { free(rs); return 1;}
+			}
+		    }
+		}
+	    }
+	}
+    else if(secondHour != -1)
+	    {
+	    if(firstMark < secondMark)
+		{
+	        if(currentMark >= firstMark && currentMark < secondMark)
+		    { free(rs); return 1;}
+		}
+	    else
+		{
+		if(currentMark >= firstMark || currentMark < secondMark)
+		    { free(rs); return 1;}
+		}
+	    }
+	else if(firstDay != -1)
+		{
+		if(firstMinute != -1)
+		    {
+		    if(Day == firstDay && Hour == firstHour && Min == firstMinute)
+			{ free(rs); return 1;}
+		    }
+		else
+		    {
+		    if(Day == firstDay && Hour == firstHour)
+			{ free(rs); return 1;}
+		    }
+		}
+	    else
+		{
+		if(firstMinute != -1)
+		    {
+		    if(Hour == firstHour && Min == firstMinute)
+			{ free(rs); return 1;}
+		    }
+		else
+		    {
+		    if(Hour == firstHour)
+			{ free(rs); return 1;}
+		    }
+		}
+    }
+
+free(rs);
+return 0;
+}
diff --git a/mgetty/mgetty.c b/mgetty/mgetty.c
index 7d03c01..9368f5a 100644
--- a/mgetty/mgetty.c
+++ b/mgetty/mgetty.c
@@ -72,6 +72,7 @@
 #include "voice/include/voice.h"
 #include "voice/include/paths.h"
 #endif
+int is_time_now(char *);
 
 /* how much time may pass between two RINGs until mgetty goes into */
 /* "waiting" state again */
@@ -676,6 +677,14 @@ int main _P2((argc, argv), int argc, char ** argv)
 		break;
 	    }
 #endif
+
+	    if(c_string(answer_time) && !is_time_now(c_string(answer_time)))
+	    {
+		lprintf( L_MESG, "out of answer time - do not accept call!");
+		mgetty_state = St_nologin;
+		break;
+	    }
+
 	    mgetty_state = St_wait_for_RINGs;
 	    break;
 
@@ -720,8 +729,24 @@ int main _P2((argc, argv), int argc, char ** argv)
 				  &what_action, &dist_ring ) == SUCCESS )
 	    {
 		rings++;
-		if ( access( buf, F_OK ) != 0 ||	/* removed? */
-		     virtual_ring == TRUE )		/* SIGUSR1? */
+		if ( access( buf, F_OK ) != 0 ) /* removed? */
+		{
+		if( c_string( answer_time ))
+		    {
+		    if( is_time_now( c_string(answer_time)))
+			{
+			mgetty_state = St_wait_for_RINGs;	/* -> accept */
+			break;
+			}
+		    }
+		else
+		    {
+		    mgetty_state = St_wait_for_RINGs;	/* -> accept */
+		    break;
+		    }
+		}
+		
+		if ( virtual_ring == TRUE )		/* SIGUSR1? */
 		{
 		    mgetty_state = St_wait_for_RINGs;	/* -> accept */
 		    break;
@@ -905,6 +930,9 @@ Ring_got_action:
 	         ( c_isset(cnd_program) &&
 		   cnd_call( c_string(cnd_program), Device, dist_ring ) == 1))
 	    {
+		if ( c_isset(deny_chat) )
+		    do_chat( STDIN, c_chat(deny_chat), NULL, NULL, 10, TRUE );
+
 		lprintf( L_AUDIT, "denied caller dev=%s, pid=%d, caller='%s'",
 			 Device, getpid(), CallerId);
 		clean_line( STDIN, 80 ); /* wait for ringing to stop */
@@ -912,6 +940,9 @@ Ring_got_action:
 		mgetty_state = St_go_to_jail;
 		break;
 	    }
+	    
+	    if(strcmp(CallerId, "none"))
+		lprintf( L_MESG, "caller-id: '%s'", CallerId);
 
 	    /* from here, there's no way back. Either the call will succeed
 	       and mgetty will exec() something else, or it will fail and
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin