Patched successfully, but when i tried to compile the extension on Linux 
box with gcc4, it stopped with such error message:

init.c: In function 'Init_curl':
init.c:408: error: 'CURL_TIMECOND_NONE' undeclared (first use in this 
function)
init.c:409: error: 'CURL_TIMECOND_IFMODSINCE' undeclared (first use in 
this function)
init.c:410: error: 'CURL_TIMECOND_IFUNMODSINCE' undeclared (first use in 
this function)
init.c:411: error: 'CURL_TIMECOND_LASTMOD' undeclared (first use in this 
function)
init.c:413: error: 'CURL_HTTP_VERSION_NONE' undeclared (first use in 
this function)
init.c:414: error: 'CURL_HTTP_VERSION_1_0' undeclared (first use in this 
function)
init.c:415: error: 'CURL_HTTP_VERSION_1_1' undeclared (first use in this 
function)
init.c:417: error: 'CURL_SSLVERSION_DEFAULT' undeclared (first use in 
this function)
init.c:418: error: 'CURL_SSLVERSION_TLSv1' undeclared (first use in this 
function)
init.c:419: error: 'CURL_SSLVERSION_SSLv2' undeclared (first use in this 
function)
init.c:420: error: 'CURL_SSLVERSION_SSLv3' undeclared (first use in this 
function)
make: *** [init.o] Error 1


Ross Bamford wrote:

>On Thu, 2006-03-16 at 01:36 +0900, Yaroslav Tarasenko wrote:
>  
>
>>Hello.
>>
>>Can you please advice me any CURL-alike library for ruby? I've found two 
>>projects named rCurl or alike but neither extension has been compiled on 
>>my FreeBSD box. Therefore looking for an alternative.
>>    
>>
>
>A while ago I had need of this, and made some changes to rbCurl [1] to
>get it to compile against modern Ruby and GCC versions. I've not
>extensively tested it (ended up not using it in fact) but it seemed to
>work fairly well I think. The attached patch should work against the
>0.0.2 prealpha version of rbCurl at [2].
>
>[1]: http://www.d1.dion.ne.jp/~matuyuki/ruby.html
>[2]: http://www.d1.dion.ne.jp/~matuyuki/rbCurl-0.0.2a0.tgz
>  
>
>------------------------------------------------------------------------
>
>diff -u rbCurl-0.0.2/auto_funcs.inc rbCurl-0.0.2.local/auto_funcs.inc
>--- rbCurl-0.0.2/auto_funcs.inc	2002-05-15 18:07:22.000000000 +0100
>+++ rbCurl-0.0.2.local/auto_funcs.inc	2006-03-15 17:14:03.000000000 +0000
>@@ -8,7 +8,8 @@
>     rb_iv_set(self, "@url", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -41,7 +42,8 @@
>     rb_iv_set(self, "@proxy", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -63,7 +65,8 @@
>     rb_iv_set(self, "@userpwd", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -85,7 +88,8 @@
>     rb_iv_set(self, "@proxyuserpwd", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -107,7 +111,8 @@
>     rb_iv_set(self, "@range", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -140,7 +145,8 @@
>     rb_iv_set(self, "@postfields", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len);   /* able to free */
>       memcpy(dst, src, len);
>       curl_easy_setopt(s->curl, CURLOPT_POSTFIELDSIZE, len);
>@@ -162,7 +168,8 @@
>     rb_iv_set(self, "@referer", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -184,7 +191,8 @@
>     rb_iv_set(self, "@ftpport", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -206,7 +214,8 @@
>     rb_iv_set(self, "@useragent", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -261,7 +270,8 @@
>     rb_iv_set(self, "@cookie", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -305,7 +315,8 @@
>     rb_iv_set(self, "@sslcert", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -327,7 +338,8 @@
>     rb_iv_set(self, "@sslcertpasswd", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -347,8 +359,8 @@
>     rb_iv_set(self, "@crlf", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_CRLF, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_CRLF, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_CRLF, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_CRLF, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -386,7 +398,8 @@
>     rb_iv_set(self, "@cookiefile", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -441,7 +454,8 @@
>     rb_iv_set(self, "@customrequest", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -483,8 +497,8 @@
>     rb_iv_set(self, "@verbose", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_VERBOSE, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_VERBOSE, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_VERBOSE, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_VERBOSE, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -498,8 +512,8 @@
>     rb_iv_set(self, "@header", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_HEADER, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_HEADER, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_HEADER, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_HEADER, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -513,8 +527,8 @@
>     rb_iv_set(self, "@nobody", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_NOBODY, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_NOBODY, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_NOBODY, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_NOBODY, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -528,8 +542,8 @@
>     rb_iv_set(self, "@failonerror", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FAILONERROR, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FAILONERROR, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FAILONERROR, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FAILONERROR, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -543,8 +557,8 @@
>     rb_iv_set(self, "@upload", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_UPLOAD, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_UPLOAD, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_UPLOAD, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_UPLOAD, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -558,8 +572,8 @@
>     rb_iv_set(self, "@ftplistonly", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FTPLISTONLY, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FTPLISTONLY, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FTPLISTONLY, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FTPLISTONLY, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -573,8 +587,8 @@
>     rb_iv_set(self, "@ftpappend", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FTPAPPEND, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FTPAPPEND, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FTPAPPEND, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FTPAPPEND, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -588,8 +602,8 @@
>     rb_iv_set(self, "@netrc", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_NETRC, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_NETRC, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_NETRC, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_NETRC, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -603,8 +617,8 @@
>     rb_iv_set(self, "@followlocation", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FOLLOWLOCATION, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FOLLOWLOCATION, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FOLLOWLOCATION, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FOLLOWLOCATION, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -618,8 +632,8 @@
>     rb_iv_set(self, "@transfertext", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_TRANSFERTEXT, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_TRANSFERTEXT, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_TRANSFERTEXT, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_TRANSFERTEXT, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -633,8 +647,8 @@
>     rb_iv_set(self, "@put", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_PUT, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_PUT, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_PUT, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_PUT, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -659,8 +673,8 @@
>     rb_iv_set(self, "@httpproxytunnel", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_HTTPPROXYTUNNEL, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_HTTPPROXYTUNNEL, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_HTTPPROXYTUNNEL, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_HTTPPROXYTUNNEL, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -676,7 +690,8 @@
>     rb_iv_set(self, "@interface", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -698,7 +713,8 @@
>     rb_iv_set(self, "@krb4level", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -718,8 +734,8 @@
>     rb_iv_set(self, "@ssl_verifypeer", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_SSL_VERIFYPEER, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_SSL_VERIFYPEER, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_SSL_VERIFYPEER, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_SSL_VERIFYPEER, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -735,7 +751,8 @@
>     rb_iv_set(self, "@cainfo", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -766,8 +783,8 @@
>     rb_iv_set(self, "@filetime", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FILETIME, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FILETIME, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FILETIME, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FILETIME, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -814,8 +831,8 @@
>     rb_iv_set(self, "@forbid_reuse", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FORBID_REUSE, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FORBID_REUSE, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FORBID_REUSE, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FORBID_REUSE, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -831,7 +848,8 @@
>     rb_iv_set(self, "@random_file", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -853,7 +871,8 @@
>     rb_iv_set(self, "@egdsocket", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -884,8 +903,8 @@
>     rb_iv_set(self, "@httpget", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_HTTPGET, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_HTTPGET, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_HTTPGET, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_HTTPGET, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>@@ -912,7 +931,8 @@
>     rb_iv_set(self, "@cookiejar", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -934,7 +954,8 @@
>     rb_iv_set(self, "@ssl_cipher_list", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -965,8 +986,8 @@
>     rb_iv_set(self, "@ftp_use_epsv", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FTP_USE_EPSV, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FTP_USE_EPSV, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, CURLOPT_FTP_USE_EPSV, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, CURLOPT_FTP_USE_EPSV, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>diff -u rbCurl-0.0.2/extconf.rb rbCurl-0.0.2.local/extconf.rb
>--- rbCurl-0.0.2/extconf.rb	2002-05-15 18:07:22.000000000 +0100
>+++ rbCurl-0.0.2.local/extconf.rb	2006-03-15 17:14:03.000000000 +0000
>@@ -2,7 +2,7 @@
> 
> require 'mkmf'
> 
>-$LDFLAGS = '-lcurl'
>+have_library('curl', 'curl_easy_init')
> #$CFLAGS = '-g'
> 
>-create_makefile("curl")
>+create_makefile('curl')
>diff -u rbCurl-0.0.2/init.c rbCurl-0.0.2.local/init.c
>--- rbCurl-0.0.2/init.c	2002-05-15 18:07:22.000000000 +0100
>+++ rbCurl-0.0.2.local/init.c	2006-03-15 17:14:03.000000000 +0000
>@@ -3,6 +3,16 @@
> #include <curl/types.h>
> #include <curl/easy.h>
> 
>+/* Emulate Ruby 1.8 string handling on < 1.8 */
>+#if !defined(StringValue)
>+#  define StringValue(x) do {                                 \
>+      if (TYPE(x) != T_STRING) x = rb_str_to_str(x);          \
>+   } while (0)
>+#endif
>+#if !defined(StringValuePtr)
>+#  define StringValuePtr(x) ((STR2CSTR(x)))
>+#endif
>+
> typedef struct _rbCurl  rbCurl;
> typedef struct _pFILE   pFILE;
> 
>@@ -55,7 +65,7 @@
>     Data_Get_Struct(self, rbCurl, s);
>     rb_iv_set(self, "@httppost", v);
> 
>-    if (s->list_httppost) { curl_formfree(s->list_httppost); }
>+    if (s->list_httppost) { curl_formfree((struct curl_httppost*)s->list_httppost); }
>     for (i = 0; i < RARRAY(v)->len; i++) {
>         curl_formparse(rb_str2cstr(RARRAY(v)->ptr[i], 0), &s->list_httppost, &last);
>     }
>@@ -84,11 +94,11 @@
>     if (v != Qnil) {
> 	curl_easy_setopt(s->curl, CURLOPT_PROGRESSFUNCTION, progress_func);
> 	curl_easy_setopt(s->curl, CURLOPT_PROGRESSDATA, v);
>-	curl_easy_setopt(s->curl, CURLOPT_NOPROGRESS, FALSE);
>+	curl_easy_setopt(s->curl, CURLOPT_NOPROGRESS, 0);
>     } else {
> 	curl_easy_setopt(s->curl, CURLOPT_PROGRESSFUNCTION, NULL);
> 	curl_easy_setopt(s->curl, CURLOPT_PROGRESSDATA, NULL);
>-	curl_easy_setopt(s->curl, CURLOPT_NOPROGRESS, TRUE);
>+	curl_easy_setopt(s->curl, CURLOPT_NOPROGRESS, 1);
>     }
> 
>     return Qnil;
>@@ -100,10 +110,13 @@
> passwd_func(VALUE proc, char *prompt, char *buffer, int buflen)
> {
>     VALUE passwd;
>+    VALUE pass_s;
>     char  *str;
>     int   len;
>     passwd = rb_funcall(proc, rb_intern("call"), 1, rb_str_new2(prompt));
>-    str = rb_str2cstr(passwd, &len);
>+    pass_s = StringValue(passwd);
>+    len = RSTRING(pass_s)->len;
>+    str = RSTRING(pass_s)->ptr;
>     if (len >= buflen) { return -1; }
>     memcpy(buffer, str, len);
>     buffer[len] = '\0';
>@@ -142,7 +155,7 @@
>     curl_slist_free_all(s->list_httpheader);
>     curl_slist_free_all(s->list_quote);
>     curl_slist_free_all(s->list_postquote);
>-    if (s->list_httppost)   { curl_formfree(s->list_httppost); }
>+    if (s->list_httppost)   { curl_formfree((struct curl_httppost*)s->list_httppost); }
> 
>     curl_easy_cleanup(s->curl);
>     free(s);
>@@ -173,6 +186,7 @@
>     return len;
> }
> 
>+static VALUE perform(VALUE self);
> 
> static VALUE
> new(VALUE klass)
>@@ -199,6 +213,15 @@
>     s->list_quote = NULL;
>     s->list_postquote = NULL;
>     s->list_httppost = NULL;
>+    
>+    if (rb_block_given_p()) {
>+      rb_yield(obj);
>+      
>+      /* if a block is given, assume user wants to perform
>+       * right away.
>+       */
>+      perform(obj);
>+    }
> 
>     /*curl_easy_setopt(s->curl, CURLOPT_MUTE, TRUE);*/
>     return obj;
>@@ -262,19 +285,21 @@
> 	curl_easy_setopt(s->curl, CURLOPT_FILE, &(s->body_str));
> 	curl_easy_setopt(s->curl, CURLOPT_WRITEFUNCTION, write_func);
> 	curl_easy_setopt(s->curl, CURLOPT_WRITEHEADER, &(s->header_str));
>-	curl_easy_setopt(s->curl, CURLOPT_HEADER, FALSE);
>+	curl_easy_setopt(s->curl, CURLOPT_HEADER, 0);
>     }
> 
>     /* No file for input */
>     if (!file_infile) {
> 	/* use Ruby String  */
>-	fin.pt = rb_str2cstr(s->input_str, &len);
>+	fin.pt = StringValuePtr(s->input_str);
>+  len = RSTRING(s->input_str)->len;
>+  
> 	if (len) {  /* input exist */
> 	    fin.len = len;
> 	    curl_easy_setopt(s->curl, CURLOPT_INFILE, &fin);
> 	    curl_easy_setopt(s->curl, CURLOPT_READFUNCTION, read_func);
> 	    curl_easy_setopt(s->curl, CURLOPT_INFILESIZE, len);
>-	    curl_easy_setopt(s->curl, CURLOPT_UPLOAD, TRUE);
>+	    curl_easy_setopt(s->curl, CURLOPT_UPLOAD, 0);
> 	}
>     }
> 
>@@ -380,10 +405,10 @@
> #include "auto_defs.inc"
> /***************************************************************/
> 
>-   rb_define_const(cCurl, "TIMECOND_NONE", INT2FIX(TIMECOND_NONE));
>-   rb_define_const(cCurl, "TIMECOND_IFMODSINCE", INT2FIX(TIMECOND_IFMODSINCE));
>-   rb_define_const(cCurl, "TIMECOND_IFUNMODSINCE", INT2FIX(TIMECOND_IFUNMODSINCE));
>-   rb_define_const(cCurl, "TIMECOND_LASTMOD", INT2FIX(TIMECOND_LASTMOD));
>+   rb_define_const(cCurl, "TIMECOND_NONE", INT2FIX(CURL_TIMECOND_NONE));
>+   rb_define_const(cCurl, "TIMECOND_IFMODSINCE", INT2FIX(CURL_TIMECOND_IFMODSINCE));
>+   rb_define_const(cCurl, "TIMECOND_IFUNMODSINCE", INT2FIX(CURL_TIMECOND_IFUNMODSINCE));
>+   rb_define_const(cCurl, "TIMECOND_LASTMOD", INT2FIX(CURL_TIMECOND_LASTMOD));
> 
>    rb_define_const(cCurl, "HTTP_VERSION_NONE", INT2FIX(CURL_HTTP_VERSION_NONE));
>    rb_define_const(cCurl, "HTTP_VERSION_1_0", INT2FIX(CURL_HTTP_VERSION_1_0));
>diff -u rbCurl-0.0.2/template.rb rbCurl-0.0.2.local/template.rb
>--- rbCurl-0.0.2/template.rb	2002-05-15 18:07:22.000000000 +0100
>+++ rbCurl-0.0.2.local/template.rb	2006-03-15 17:14:03.000000000 +0000
>@@ -11,7 +11,8 @@
>     rb_iv_set(self, "@<NAME>", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len+1);   /* able to free */
>       memcpy(dst, src, len);
>       dst[len] = '\0';
>@@ -36,7 +37,8 @@
>     rb_iv_set(self, "@<NAME>", v);
> 
>     if (v != Qnil) {
>-      src = rb_str2cstr(v, &len);   /* copy string */
>+      src = StringValuePtr(v);   /* copy string */
>+      len = RSTRING(v)->len;      
>       dst = ALLOC_N(char, len);   /* able to free */
>       memcpy(dst, src, len);
>       curl_easy_setopt(s->curl, CURLOPT_POSTFIELDSIZE, len);
>@@ -73,8 +75,8 @@
>     rb_iv_set(self, "@<NAME>", v);
> 
>     switch (v) {
>-    case Qtrue:  { curl_easy_setopt(s->curl, <ID>, TRUE); break; }
>-    case Qfalse: { curl_easy_setopt(s->curl, <ID>, FALSE); break; }
>+    case Qtrue:  { curl_easy_setopt(s->curl, <ID>, 1); break; }
>+    case Qfalse: { curl_easy_setopt(s->curl, <ID>, 0); break; }
>     default:	 { rb_raise(rb_eArgError, "must be true or false"); }
>     }
>     return Qnil;
>  
>

-- 
Best,
  Yaroslav Tarasenko aka Taras Tswiah
  UNIX systems administrator