File pure-ftpd-1.0.22-oes-bugfix-534424.patch of Package pure-ftpd.import4353

--- src/ftpd.c	2010-09-24 12:29:10.000000000 +0530
+++ src/ftpd.c	2010-09-27 11:13:54.000000000 +0530
@@ -55,7 +55,8 @@ const char* SERV_LIST_FILE = "/var/opt/n
 #define MAX_PATH_SIZE 1000
 #define MAX_IP_SIZE 20
 #define MAX_NO_OF_SERVERS 300
-
+#define SITE_MSG "NCP Servers in the NDS Tree"
+#define CHK_MOD_TIME 3600
 
 char serverInfo[MAX_NO_OF_SERVERS][120]; 
 const char MOUNT_PATH[] = "/var/opt/novell/nclmnt";
@@ -63,6 +64,7 @@ const int MOUNT_PATH_SIZE = 22;
 	
 char userFDN[512];
 static const char *getlocalhostname();
+void extractEdir_IP_Port(char *);
 	  
 
 #ifndef HAVE_SYS_FSUID_H
@@ -5358,9 +5360,8 @@ int main(int argc, char *argv[])
 		}	
 				  
 		case '3': {
-	   		edir_ldap_port = atoi(optarg);
-			if(edir_ldap_port <= 0 )
-				edir_ldap_port = 389;
+			/* Extract E-directory IP address & Port number */
+			extractEdir_IP_Port(optarg);
 	   		break;
 		}			
 		case '2': {
@@ -6162,6 +6163,9 @@ int edir_login(const char* user,const ch
 		
 		char* data[9];
 		char* context;
+		char tree[256] ={0};
+		char server[256] ={0};
+
 		context = index(userFDN,'.');
 		if(context != NULL)
 			context++;
@@ -6173,8 +6177,11 @@ int edir_login(const char* user,const ch
 			exit(0);
 		}	
 		
-		data[0] ="-t 127.0.0.1";
-		data[1] ="-s 127.0.0.1";
+		snprintf(tree,sizeof(tree),"-t %s",edir_ip_address);
+		snprintf(server,sizeof(server),"-s %s",edir_ip_address);
+
+		data[0] =tree;
+		data[1] =server;
 		data[2] ="-u" ; data[3] = (char*)user;
 		data[4] ="-c" ; data[5] = (char*)context;
 		data[6] ="-p" ; data[7] = (char*)passwd;
@@ -6252,18 +6259,18 @@ int edir_login(const char* user,const ch
 
 int mount_remote_server(const char* where,char* nss_loc,char* remote_server)
 {
-	char tmp[MAX_PATH_SIZE+1000],path[MAX_PATH_SIZE];
+	char tmp[2*MAX_PATH_SIZE] = {0},path[MAX_PATH_SIZE] = {0};
 	char* str1,*server;
 	int err,i;
 	struct hostent *he;
 	struct in_addr ipv4addr;
 	//mnt_loc         - mounted path name by novell client (server name)
 	//ncl_req_name    - Request used in novell client (IP - preferably) 
-	char mnt_loc[MAX_SERVER_SIZE],ncl_req_name[MAX_SERVER_SIZE],ip[MAX_IP_SIZE];
+	char mnt_loc[MAX_SERVER_SIZE] ={0},ncl_req_name[MAX_SERVER_SIZE] = {0},ip[MAX_IP_SIZE] = {0};
 	struct in_addr addr;	
 	char*  context = NULL;
 	
-	if((where != NULL ) &&(strncmp(where,"//",2 ) ==0))
+	if((where != NULL ) && (strncmp(where,"//",2 ) ==0) && (strlen(where) > 2) )
 	{
 
 		if( no_of_server <= 0) 
@@ -6276,6 +6283,11 @@ int mount_remote_server(const char* wher
 		str1 = (char*) where+2;
 		server = strtok(str1,"/");
 
+		if ( NULL == server)
+		{
+			return -1;
+		}
+
 		/*
 		   Get the server name/ip address of remote server
 		   Remote server name in ftp request can be either server name / DNS name / IP
@@ -6413,19 +6425,89 @@ int get_remote_server_path(char* path)
 	return 0;
 }	
 
-// response for site slist command
+/**
+ * Description: This function is used to extract E-directory IP address
+ * and Port number.
+ *
+ * Input: Charcter string which have IP address & port number.
+ *
+ * Output: None.
+ */
+void extractEdir_IP_Port(char *optarg)
+{
+	char *ip_address;
+        char *port;
+
+	/* extract ip address */
+        ip_address=strtok(optarg,":");
+
+	/* extract port and validate the port */
+        if ( (NULL != ip_address) && (NULL != (port= strtok(NULL,":"))))
+        {
+        	edir_ip_address = strdup(ip_address);
+                edir_ldap_port = atoi(port);
+                
+		if((edir_ldap_port <= 0) || (edir_ldap_port > 65535))
+                	edir_ldap_port = 389;
+        }
+        else
+        {
+		/* Assign default IP address & port number */
+                edir_ip_address = "127.0.0.1";
+                edir_ldap_port = 389;
+        }
+
+	return;
+}
+
+/**
+ * Description: This function is used to get file modified
+ * time in seconds.
+ *
+ * Input: fileName - file from which modified time to be calculated.
+ *
+ * Output: integer which holds the modified time in seconds
+ */
+static int getModTime(char *fileName)
+{
+        struct stat fileStat = {0};
+        struct timeval curTime = {0};
+
+        // get the file status from the file.
+        if (stat(fileName,&fileStat) < 0)
+        {
+                return -1;
+        }
+
+	// get the current time.
+        gettimeofday(&curTime,NULL);
+
+        return (curTime.tv_sec - fileStat.st_mtime);
+}
+
+/** 
+ * Description: This function is used to response for site slist command.
+ *
+ * Input: None
+ *
+ * Output: integer which return the status
+ *
+ */
 int do_list_servers()
 {
 	FILE* file;
 	char buffer[2*MAX_SERVER_FDN_SIZE];
 	int serverLen;
-	char server[200],*ip;
+	char server[200],countMsg[128]={0},*ip;
+	int nodeCount= 0;
 	
-	if( ( no_of_server <= 0) && (get_server_list_from_file() < 0))
+	if( (( no_of_server <= 0) && (get_server_list_from_file() < 0)) || (getModTime(SERV_LIST_FILE) >= CHK_MOD_TIME))
 		 get_server_list_from_edir();
 	
-	file = fopen (SERV_LIST_FILE,"r"); 
+	// Code added for Bug Fix: "534424 - FTP-RSN: Site slist doesn't list server count as in netware"
+	addreply_noformat(200, SITE_MSG);
 	
+	file = fopen (SERV_LIST_FILE,"r"); 
     if(file != NULL)
 	{	
 		while (!feof (file))
@@ -6442,12 +6524,19 @@ int do_list_servers()
 				serverLen = MAX_SERVER_FDN_SIZE;	
 			
 			snprintf(server,serverLen+1,"%s",buffer);
-			addreply_noformat(0, server);
+			
+			// Code added for Bug Fix: "534424 - FTP-RSN: Site slist doesn't list server count as in netware"
+			addreply_noformat(200, server);
+			nodeCount++;
 		}	
 		
 		fclose(file);
 	}  
 
+        // Code added for Bug Fix: "534424 - FTP-RSN: Site slist doesn't list server count as in netware"
+	sprintf(countMsg," %d \"NCP Server\"(s)",nodeCount);
+	addreply_noformat(200, countMsg);
+
 	return 0;
 	
 }
@@ -6455,7 +6544,7 @@ int do_list_servers()
 				  
 int ldap_connect(const char* username,const char*passwd)
 {	
-    	ldapHandle = ldap_init("127.0.0.1",edir_ldap_port);
+    	ldapHandle = ldap_init(edir_ip_address,edir_ldap_port);
     	if (ldapHandle == NULL)
     	{
 			return -1;
--- src/globals.h	2010-09-24 12:29:10.000000000 +0530
+++ src/globals.h	2010-09-24 12:20:33.000000000 +0530
@@ -30,6 +30,7 @@ GLOBAL0(signed char no_ipv4);           
 GLOBAL0(signed char remote_server);                    /* OES remote server supported or not*/
 GLOBAL0(signed char disallow_list_oes_server);         /* list remote OES server supported or not*/
 GLOBAL(unsigned int edir_ldap_port,389);                 /* edirectory ldap port*/
+GLOBAL0(char *edir_ip_address);                 /* edirectory ip address */
 GLOBAL0(char *default_home_dir);                /* default home dir */
 GLOBAL(const size_t cmdsize, MAXPATHLEN + 16U);
 GLOBAL0(char cmd[MAXPATHLEN + 32U]);        /* command line - about 30 chars for command */