• C

Source needed for ENCTYPE receiving program

I'm in desperate need of some C source for a CGI program that will receive a file via the ENCTYPE tag that Netscape supports and then write it into onto the disk. The source needs to be for Windows (I use the Micro$oft compiler).

Yes I know that this sort of thing is asking for security problems but I have a specific, Intranet application for it.

Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

mravellAuthor Commented:
Adjusted points to 150
#include <string.h>
here's some c-code that I use. I'll include the html that goes
with it so you can substitute variables.  It's not for
windows, but the algorithm should be portable. It's really thrown
together, but you'll get the idea....

#include <stdio.h>
#include <unistd.h>
#ifndef NO_STDLIB_H
#include <stdlib.h>
#include <fcntl.h>
char *getenv();

typedef struct {
    char *name;
    char *val;
} entry;

#define MAX_ENTRIES 10

main(int argc, char *argv[]) {
   entry entries[MAX_ENTRIES];
        register int x,m=0;
        char header[50], openfile[128], endline[128];
        int cl, readlen, ctr, filenum;
        char *breakline, *wline, *ptr;
        FILE *out;

        sprintf(header,"Content-type: text/html%c%c",10,10);
        write(STDOUT_FILENO, header, strlen(header));
        printf("<BODY BGCOLOR=#404040 TEXT=#FFFFFF>\n");
        if(strcmp(getenv("REQUEST_METHOD"),"POST")) {
            printf("This script should be referenced with a METHOD of POST.\n");

        cl = atoi(getenv("CONTENT_LENGTH"));
        total = malloc(cl);
        ctr = 0;
        while(cl > 0){
           read(STDIN_FILENO, &total[ctr++], 1);
        total[ctr] = 0;
        ptr = strchr(total, 13);
        breakline = total;
        *ptr++ = 0;
        total = ++ptr;
        sprintf(endline, "\n%s", breakline);
        do {
           ptr = strchr(total, 13);
           *ptr = 0;
           for (ctr = 0;ctr < 2;ctr++)
           total = ptr;
           ptr = strchr(total, 13);
           for (ctr = 0;ctr < 2;ctr++)
           total = ptr;
           ptr = strstr(wline,"name=");
           for (ctr = 0;ctr < 6;ctr++)
           entries[m].name = ptr;
           ptr = strchr(entries[m].name,'"');
           *ptr = 0;
           if (strcmp(entries[m].name, "fileitself") == 0) {
           ptr = strstr(entries[m].val, breakline);
           x = strlen(breakline) + 4;
           for (ctr = 0;ctr < x;ctr++)
           total = ptr;
        } while (strstr(total, "Content") != NULL);
   for (x = 0; x < m; x++) {
      if (strcmp(entries[x].name,"filenam") == 0)
         filenam = entries[x].val;
      else if (strcmp(entries[x].name,"userid") == 0)
         userid = entries[x].val;
      else if (strcmp(entries[x].name,"password") == 0)
         password = entries[x].val;
      else if (strcmp(entries[x].name,"fileitself") == 0)
         file = entries[x].val;
  if (strcmp(userid,"userid") != 0 || strcmp(password,"passwd") != 0) {
      printf("<H1>BAD USERID OR PASSWORD</H1>\n");
   if ((out = fopen(openfile, "w")) == NULL) {
      printf("file open error\n");
      printf("%s\n", openfile);
   while (strstr(ptr,breakline) != ptr) {
      fprintf(out, "%c", *ptr);
   printf("<H1>File uploaded</H1>\n");

########################Begin Html###########
<TITLE>Upload a file</TITLE>
<H3>upload a file to your directory</H3>
<FORM ENCTYPE="multipart/form-data" ACTION=/cgi-bin/upload METHOD=POST>
the name you want the file to be called on the server:
<INPUT TYPE=text NAME=filenam><BR>
your userid: <INPUT TYPE=text NAME=userid><BR>
your password: <INPUT TYPE=password NAME=password><BR>
file: <INPUT TYPE=file NAME=fileitself><BR>
<INPUT TYPE=submit value="go for it!">


Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
mravellAuthor Commented:
Thanks Ernst,

This has given me enough to get started. I am porting it to Micro$oft C for use on NT.

It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.