Initial revision: Server-side CGI for remote copy
authoryibiao <>
Fri, 25 Nov 2005 14:24:12 +0000 (14:24 +0000)
committeryibiao <>
Fri, 25 Nov 2005 14:24:12 +0000 (14:24 +0000)
org.gridsite.core/src/gridsite-copy.c [new file with mode: 0644]

diff --git a/org.gridsite.core/src/gridsite-copy.c b/org.gridsite.core/src/gridsite-copy.c
new file mode 100644 (file)
index 0000000..d59231f
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+   Copyright (c) 2005, Yibiao Li, University of Manchester
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or
+   without modification, are permitted provided that the following
+   conditions are met:
+
+     o Redistributions of source code must retain the above
+       copyright notice, this list of conditions and the following
+       disclaimer. 
+     o Redistributions in binary form must reproduce the above
+       copyright notice, this list of conditions and the following
+       disclaimer in the documentation and/or other materials
+       provided with the distribution. 
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+*/
+
+///////////////////////////////////////////////////////////////////
+//
+// compile: gcc -lcurl gridsite-copy.c -o gridsite-copy.cgi
+// usage: cp gridsite-copy.cgi to the cgi-bin directory
+//        and map the COPY method to gridsite-copy.cgi
+//        by adding a line in httpd.conf:
+//        script COPY /cgi-bin/gridsite-copy.cgi
+//
+///////////////////////////////////////////////////////////////////
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+#include <stdlib.h>
+#include <curl/curl.h>
+#include <sys/types.h>
+#include <sys/times.h>
+
+extern char **environ;
+
+size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  int written = fwrite(ptr, size, nmemb, (FILE *)stream);
+  return written;
+}
+
+int main( int argn, char **argv )
+{
+       char *getenv();
+
+       CURL *curl;
+       CURLcode res;
+       struct tms s_time, e_time;
+       FILE *fout;
+
+       char *requestURI;
+       int grstPerm, srcsecure;
+       char passcode[100];
+       char destination[500], destDir[400], destName[100];
+       char *ptr, *ptr1;
+
+       times(&s_time);
+       passcode[0]='\0';
+       char *capath="/etc/grid-security/certificates";
+
+               printf("Content-type: text/html\n\n");
+               printf("<html><head><title>HTTP COPY</title></head>\n");
+               printf("<body><h1>HTTP FILE COPY</h1>\n");
+
+       curl = curl_easy_init();
+       printf("Server: Initialized!\n");
+       if(curl) {
+         //get the request URI
+         requestURI = curl_getenv("REQUEST_URI");
+         if( strncmp( requestURI, "https://", 8 )==0 )srcsecure=1;
+         else srcsecure=0;
+         printf("The request URL is %s\n", requestURI);
+
+         //get the destination directory and file name
+         strcpy(destination, getenv("HTTP_DESTINATION"));
+         ptr=destination;
+         ptr1 = strrchr(ptr, '/');
+         ptr1+=1;
+         strcpy( destName, ptr1 );
+         *ptr1 = '\0';
+         strcpy( destDir, ptr );
+
+         // get the one time passcode from cookie string.
+         // the segmenty of code is tested on 19th sep. 2005
+         if( (ptr=curl_getenv("HTTP_COOKIE")) != NULL)
+           {
+             ptr += 17;
+             strcpy( passcode, ptr );
+           }
+
+         //get permision attributes
+         grstPerm = atoi(curl_getenv("GRST_DESTINATION_PERM"));
+
+                 if( grstPerm & 8 )  // write right
+           {
+             curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);
+
+             if( srcsecure == 1 )
+               {
+                 curl_easy_setopt(curl, CURLOPT_COOKIE, passcode );
+                 curl_easy_setopt(curl, CURLOPT_CAPATH, capath );
+               }
+
+             curl_easy_setopt(curl, CURLOPT_URL, requestURI );
+
+             strcpy( destination, getenv("GRST_DESTINATION_TRANSLATED"));
+             fout = fopen( destination, "w" );
+             if( fout == NULL ){
+               printf("cannot open file to write,");
+               printf(" maybe you have no right to write in the directory.\n");
+               exit(-1);
+             }
+             curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
+             curl_easy_setopt(curl, CURLOPT_WRITEDATA, fout );
+             res = curl_easy_perform(curl);
+             if( res!=0 )
+               {
+                 printf("Server: There are some things wrong with OPT parameters.%d \n", res);
+               }
+             else printf("Server: The file has been successfully copied.\n");
+             fclose(fout);
+           }
+         else
+           {
+             printf("You have no permission to write in the destination directory.\n");
+           }
+
+         curl_easy_cleanup(curl);
+       }
+       else{
+         printf("Server: cannot initialize CURL!\n");
+       }
+
+       curl_global_cleanup();
+
+       times(&e_time);
+       printf("Server: copying time %ld seconds\n", e_time.tms_utime-s_time.tms_utime);
+               printf("</body></html>\n");
+       return 0;
+}