+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);
+}
+