+#if USE_SSL
+gint ssl_gets(SSL *ssl, gchar *buf, gint len)
+{
+ gchar *buf2 = buf;
+ gboolean newline = FALSE;
+ gint n, count = 0;
+
+ if (--len < 1)
+ return -1;
+ while(len > 0 && !newline) {
+ *buf2 = '\0';
+ if((n = SSL_read(ssl, buf2, 1)) < 0)
+ return -1;
+ if(*buf2 == '\n')
+ newline = TRUE;
+ buf2 += n;
+ count += n;
+ }
+
+ *buf2 = '\0';
+ return n;
+}
+#endif
+
+gint sock_gets(SockInfo *sock, gchar *buf, gint len)
+{
+ g_return_val_if_fail(sock != NULL, -1);
+
+#if USE_SSL
+ if(sock->ssl) {
+ return ssl_gets(sock->ssl, buf, len);
+ }
+#endif
+ return fd_gets(sock->sock, buf, len);
+}
+
+gchar *fd_getline(gint fd)
+{
+ gchar buf[BUFFSIZE];
+ gchar *str = NULL;
+ gint len;
+ gulong size = 1;
+
+ while ((len = fd_gets(fd, buf, sizeof(buf))) > 0) {
+ size += len;
+ if (!str)
+ str = g_strdup(buf);
+ else {
+ str = g_realloc(str, size);
+ strcat(str, buf);
+ }
+ if (buf[len - 1] == '\n')
+ break;
+ }
+
+ return str;
+}
+
+#if USE_SSL
+gchar *ssl_getline(SSL *ssl)
+{
+ gchar buf[BUFFSIZE];
+ gchar *str = NULL;
+ gint len;
+ gulong size = 1;
+
+ while ((len = ssl_gets(ssl, buf, sizeof(buf))) > 0) {
+ size += len;
+ if (!str)
+ str = g_strdup(buf);
+ else {
+ str = g_realloc(str, size);
+ strcat(str, buf);
+ }
+ if (buf[len - 1] == '\n')
+ break;
+ }
+
+ return str;
+}
+#endif
+
+gchar *sock_getline(SockInfo *sock)
+{
+ g_return_val_if_fail(sock != NULL, NULL);
+
+#if USE_SSL
+ if(sock->ssl) {
+ return ssl_getline(sock->ssl);
+ }
+#endif
+ return fd_getline(sock->sock);
+}
+