Code:
diff -dur pppoe.orig/main.c pppoe/main.c
--- pppoe.orig/main.c 2006-08-17 13:08:17 +0600
+++ pppoe/main.c 2008-06-05 15:38:39 +0600
@@ -241,6 +241,45 @@
// brcm
int demandBegin=0;
+
+ //--- nars ---------------------------------------------
+ FILE *f;
+ char cmd[256];
+ int iprm;
+
+ if (argc > 1) { //se ha parametros
+ if (strcmp(argv[1], "-Z") != 0) { //se 1╨ param dif. de -Z
+
+ //preparar parametros no cmd e configurar crond
+ strcpy(cmd, argv[0]);
+ strcat(cmd, " -Z");
+ for (iprm = 1; iprm < argc; iprm++) {
+ strcat(cmd, " ");
+ strcat(cmd, argv[iprm]);
+ }
+ strcat(cmd, " &");
+
+ //criar /var/pppd.run para que o pppd seja executado no 1╨ arranque
+ f = fopen("/var/pppd.run", "w");
+ if (f != NULL)
+ fclose(f);
+
+ //ciclo do loader para o pppd
+ while (1) {
+ if ((f = fopen("/var/pppd.run", "r")) != NULL) { //se existe
+ fclose(f);
+ unlink("/var/pppd.run");
+ syslog(LOG_INFO, "%s", cmd);
+ system(cmd);
+ }
+ sleep(15);
+ }
+
+ }
+ }
+ //------------------------------------------------------
+
+
new_phase(PHASE_INITIALIZE);
/*
@@ -310,7 +349,10 @@
// || !parse_args(argc-1, argv+1))
exit(EXIT_OPTION_ERROR);
#endif
- parse_args(argc, argv);
+ //nars - fix memory fault bug
+ if (!parse_args(argc, argv))
+ exit(EXIT_OPTION_ERROR);
+
devnam_fixed = 1; /* can no longer change device name */
setPid();
@@ -604,11 +646,10 @@
pidfilename[0] = 0;
}
- if (!persist || (maxfail > 0 && unsuccess >= maxfail))
- // brcm
- ;
- // printf("PPP: fail test\n");
- // break;
+ if (!persist || (maxfail > 0 && unsuccess >= maxfail)) {
+ printf("PPP: maxfail\n"); //nars
+ break;
+ }
if (demand)
demand_discard();
@@ -1093,9 +1134,21 @@
die(status)
int status;
{
+ FILE *f; //nars
+
cleanup();
notify(exitnotify, status);
syslog(LOG_INFO, "Exit.");
+
+ //nars
+ unlink(_PATH_GW);
+ unlink(_PATH_RESOLV);
+
+ //nars - para o loader voltar a correr o pppd
+ f = fopen("/var/pppd.run", "w");
+ if (f != NULL)
+ fclose(f);
+
exit(status);
}
diff -dur pppoe.orig/options.c pppoe/options.c
--- pppoe.orig/options.c 2006-08-17 13:08:17 +0600
+++ pppoe/options.c 2008-06-05 15:39:38 +0600
@@ -75,11 +75,11 @@
bool demand = 0; /* do dial-on-demand */
char *ipparam = NULL; /* Extra parameter for ip up/down scripts */
int idle_time_limit = 0; /* Disconnect if idle for this many seconds */
-int holdoff = 3; /* # seconds to pause before reconnecting */
+int holdoff = 3; //nars /* # seconds to pause before reconnecting */
bool holdoff_specified; /* true if a holdoff value has been given */
int log_to_fd = 1; /* send log messages to this fd too */
bool log_default = 1; /* log_to_fd is default (stdout) */
-int maxfail = 10; /* max # of unsuccessful connection attempts */
+int maxfail = 3; //nars (orig: 10) /* max # of unsuccessful connection attempts */
char linkname[MAXPATHLEN]; /* logical name for link */
bool tune_kernel; /* may alter kernel settings */
int connect_delay = 1000; /* wait this many ms after connect script */
@@ -313,7 +313,14 @@
int opt;
int retval, num[3];
- while ((opt = getopt(argc, argv, "s:xda:i:ku:p:o:lc:m:f:r:RA:")) != -1) {
+ //nars - fix memory fault bug when no params
+ if (argc <= 1) {
+ fprintf(stderr, "usage: %s -Z [-s] [-b] [-d] [-i interface] [-a vcc] [-u username] [-p passwd] [-o idle] [-m prevmac/prevsid] [-A ipaddr]\n", argv[0]);
+ return 0;
+ }
+
+ //nars -> Z
+ while ((opt = getopt(argc, argv, "s:xda:i:ku:p:o:lc:m:f:r:RA:Z")) != -1) {
switch (opt) {
case 's':
autoscan = 1;
@@ -372,8 +379,10 @@
ip_addr[strlen(ip_addr)] = ':';
setipaddr (ip_addr, NULL, 1);
break;
+ case 'Z': //nars
+ break;
default:
- fprintf(stderr, "usage: %s [-s] [-b] [-d] [-i interface] [-a vcc] [-u username] [-p passwd] [-o idle] [-m prevmac/prevsid] [-A ipaddr]\n", argv[0]);
+ fprintf(stderr, "usage: %s -Z [-s] [-b] [-d] [-i interface] [-a vcc] [-u username] [-p passwd] [-o idle] [-m prevmac/prevsid] [-A ipaddr]\n", argv[0]);
return 0;
}
}
который позволяет на ADSL модеме при падении линка автоматом несколько раз поднимать логин (у некотрых провайдеров стоит задержка на повторную авторизацию)