+/***********************************************************************
+ * FTP_GetNextLine (internal)
+ *
+ * Parse next line in directory string listing
+ *
+ * RETURNS
+ * Pointer to beginning of next line
+ * NULL on failure
+ *
+ */
+
+static LPSTR FTP_GetNextLine(INT nSocket, LPDWORD dwLen)
+{
+ struct timeval tv = {RESPONSE_TIMEOUT,0};
+ FD_SET set;
+ INT nRecv = 0;
+ LPSTR lpszBuffer = INTERNET_GetResponseBuffer();
+
+ TRACE("\n");
+
+ FD_ZERO(&set);
+ FD_SET(nSocket, &set);
+
+ while (nRecv < MAX_REPLY_LEN)
+ {
+ if (select(nSocket+1, &set, NULL, NULL, &tv) > 0)
+ {
+ if (sock_recv(nSocket, &lpszBuffer[nRecv], 1, 0) <= 0)
+ {
+ INTERNET_SetLastError(ERROR_FTP_TRANSFER_IN_PROGRESS);
+ return NULL;
+ }
+
+ if (lpszBuffer[nRecv] == '\n')
+ {
+ lpszBuffer[nRecv] = '\0';
+ *dwLen = nRecv - 1;
+ TRACE(":%d %s\n", nRecv, lpszBuffer);
+ return lpszBuffer;
+ }
+ if (lpszBuffer[nRecv] != '\r')
+ nRecv++;
+ }
+ else
+ {
+ INTERNET_SetLastError(ERROR_INTERNET_TIMEOUT);
+ return NULL;
+ }
+ }
+
+ return NULL;
+}