]>
git.ipfire.org Git - thirdparty/cups.git/blob - cgi-bin/var.c
2 * "$Id: var.c 7460 2008-04-16 02:19:54Z mike $"
4 * CGI form variable and array functions for CUPS.
6 * Copyright 2007-2010 by Apple Inc.
7 * Copyright 1997-2005 by Easy Software Products.
9 * These coded instructions, statements, and computer programs are the
10 * property of Apple Inc. and are protected by Federal copyright
11 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
12 * which should have been included with this file. If this file is
13 * file is missing or damaged, see the license at "http://www.cups.org/".
17 * cgiCheckVariables() - Check for the presence of "required"
19 * cgiClearVariables() - Clear all form variables.
20 * cgiGetArray() - Get an element from a form array.
21 * cgiGetCookie() - Get a cookie value.
22 * cgiGetFile() - Get the file (if any) that was submitted in
24 * cgiGetSize() - Get the size of a form array value.
25 * cgiGetVariable() - Get a CGI variable from the database.
26 * cgiInitialize() - Initialize the CGI variable "database".
27 * cgiIsPOST() - Determine whether this page was POSTed.
28 * cgiSetArray() - Set array element N to the specified string.
29 * cgiSetCookie() - Set a cookie value.
30 * cgiSetSize() - Set the array size.
31 * cgiSetVariable() - Set a CGI variable in the database.
32 * cgi_add_variable() - Add a form variable.
33 * cgi_compare_variables() - Compare two variables.
34 * cgi_find_variable() - Find a variable.
35 * cgi_initialize_cookies() - Initialize cookies.
36 * cgi_initialize_get() - Initialize form variables using the GET
38 * cgi_initialize_multipart() - Initialize variables and file using the POST
40 * cgi_initialize_post() - Initialize variables using the POST method.
41 * cgi_initialize_string() - Initialize form variables from a string.
42 * cgi_passwd() - Catch authentication requests and notify the
44 * cgi_set_sid() - Set the CUPS session ID.
45 * cgi_sort_variables() - Sort all form variables for faster lookup.
46 * cgi_unlink_file() - Remove the uploaded form.
50 #include "cgi-private.h"
52 #include <cups/http.h>
60 #define CUPS_SID "org.cups.sid"
64 * Data structure to hold all the CGI form variables and arrays...
67 typedef struct /**** Form variable structure ****/
69 const char *name
; /* Name of variable */
70 int nvalues
, /* Number of values */
71 avalues
; /* Number of values allocated */
72 const char **values
; /* Value(s) of variable */
80 static int num_cookies
= 0;/* Number of cookies */
81 static cups_option_t
*cookies
= NULL
;/* Cookies */
82 static int form_count
= 0, /* Form variable count */
83 form_alloc
= 0; /* Number of variables allocated */
84 static _cgi_var_t
*form_vars
= NULL
;
86 static cgi_file_t
*form_file
= NULL
;
94 static void cgi_add_variable(const char *name
, int element
,
96 static int cgi_compare_variables(const _cgi_var_t
*v1
,
97 const _cgi_var_t
*v2
);
98 static _cgi_var_t
*cgi_find_variable(const char *name
);
99 static void cgi_initialize_cookies(void);
100 static int cgi_initialize_get(void);
101 static int cgi_initialize_multipart(const char *boundary
);
102 static int cgi_initialize_post(void);
103 static int cgi_initialize_string(const char *data
);
104 static const char *cgi_passwd(const char *prompt
);
105 static const char *cgi_set_sid(void);
106 static void cgi_sort_variables(void);
107 static void cgi_unlink_file(void);
111 * 'cgiCheckVariables()' - Check for the presence of "required" variables.
113 * Names may be separated by spaces and/or commas.
116 int /* O - 1 if all variables present, 0 otherwise */
117 cgiCheckVariables(const char *names
) /* I - Variables to look for */
119 char name
[255], /* Current variable name */
120 *s
; /* Pointer in string */
121 const char *val
; /* Value of variable */
122 int element
; /* Array element number */
128 while (*names
!= '\0')
130 while (*names
== ' ' || *names
== ',')
133 for (s
= name
; *names
!= '\0' && *names
!= ' ' && *names
!= ','; s
++, names
++)
140 if ((s
= strrchr(name
, '-')) != NULL
)
143 element
= atoi(s
+ 1) - 1;
144 val
= cgiGetArray(name
, element
);
147 val
= cgiGetVariable(name
);
153 return (0); /* Can't be blank, either! */
161 * 'cgiClearVariables()' - Clear all form variables.
165 cgiClearVariables(void)
167 int i
, j
; /* Looping vars */
168 _cgi_var_t
*v
; /* Current variable */
171 for (v
= form_vars
, i
= form_count
; i
> 0; v
++, i
--)
173 _cupsStrFree(v
->name
);
174 for (j
= 0; j
< v
->nvalues
; j
++)
176 _cupsStrFree(v
->values
[j
]);
186 * 'cgiGetArray()' - Get an element from a form array.
189 const char * /* O - Element value or NULL */
190 cgiGetArray(const char *name
, /* I - Name of array variable */
191 int element
) /* I - Element number (0 to N) */
193 _cgi_var_t
*var
; /* Pointer to variable */
196 if ((var
= cgi_find_variable(name
)) == NULL
)
199 if (element
< 0 || element
>= var
->nvalues
)
202 return (_cupsStrRetain(var
->values
[element
]));
207 * 'cgiGetCookie()' - Get a cookie value.
210 const char * /* O - Value or NULL */
211 cgiGetCookie(const char *name
) /* I - Name of cookie */
213 return (cupsGetOption(name
, num_cookies
, cookies
));
218 * 'cgiGetFile()' - Get the file (if any) that was submitted in the form.
221 const cgi_file_t
* /* O - Attached file or NULL */
229 * 'cgiGetSize()' - Get the size of a form array value.
232 int /* O - Number of elements */
233 cgiGetSize(const char *name
) /* I - Name of variable */
235 _cgi_var_t
*var
; /* Pointer to variable */
238 if ((var
= cgi_find_variable(name
)) == NULL
)
241 return (var
->nvalues
);
246 * 'cgiGetVariable()' - Get a CGI variable from the database.
248 * Returns NULL if the variable doesn't exist. If the variable is an
249 * array of values, returns the last element.
252 const char * /* O - Value of variable */
253 cgiGetVariable(const char *name
) /* I - Name of variable */
255 const _cgi_var_t
*var
; /* Returned variable */
258 var
= cgi_find_variable(name
);
262 DEBUG_printf(("cgiGetVariable(\"%s\") is returning NULL...\n", name
));
264 DEBUG_printf(("cgiGetVariable(\"%s\") is returning \"%s\"...\n", name
,
265 var
->values
[var
->nvalues
- 1]));
268 return ((var
== NULL
) ? NULL
: _cupsStrRetain(var
->values
[var
->nvalues
- 1]));
273 * 'cgiInitialize()' - Initialize the CGI variable "database".
276 int /* O - Non-zero if there was form data */
279 const char *method
, /* Form posting method */
280 *content_type
, /* Content-Type of post data */
281 *cups_sid_cookie
, /* SID cookie */
282 *cups_sid_form
; /* SID form variable */
286 * Setup a password callback for authentication...
289 cupsSetPasswordCB(cgi_passwd
);
292 * Set the locale so that times, etc. are formatted properly...
295 setlocale(LC_ALL
, "");
299 * Disable output buffering to find bugs...
302 setbuf(stdout
, NULL
);
309 cgi_initialize_cookies();
311 if ((cups_sid_cookie
= cgiGetCookie(CUPS_SID
)) == NULL
)
313 fputs("DEBUG: " CUPS_SID
" cookie not found, initializing!\n", stderr
);
314 cups_sid_cookie
= cgi_set_sid();
317 fprintf(stderr
, "DEBUG: " CUPS_SID
" cookie is \"%s\"\n", cups_sid_cookie
);
320 * Get the request method (GET or POST)...
323 method
= getenv("REQUEST_METHOD");
324 content_type
= getenv("CONTENT_TYPE");
329 * Grab form data from the corresponding location...
332 if (!strcasecmp(method
, "GET"))
333 return (cgi_initialize_get());
334 else if (!strcasecmp(method
, "POST") && content_type
)
336 const char *boundary
= strstr(content_type
, "boundary=");
341 if (content_type
&& !strncmp(content_type
, "multipart/form-data; ", 21))
343 if (!cgi_initialize_multipart(boundary
))
346 else if (!cgi_initialize_post())
349 if ((cups_sid_form
= cgiGetVariable(CUPS_SID
)) == NULL
||
350 strcmp(cups_sid_cookie
, cups_sid_form
))
353 fprintf(stderr
, "DEBUG: " CUPS_SID
" form variable is \"%s\"\n",
356 fputs("DEBUG: " CUPS_SID
" form variable is not present.\n", stderr
);
370 * 'cgiIsPOST()' - Determine whether this page was POSTed.
373 int /* O - 1 if POST, 0 if GET */
376 const char *method
; /* REQUEST_METHOD environment variable */
379 if ((method
= getenv("REQUEST_METHOD")) == NULL
)
382 return (!strcmp(method
, "POST"));
387 * 'cgiSetArray()' - Set array element N to the specified string.
389 * If the variable array is smaller than (element + 1), the intervening
390 * elements are set to NULL.
394 cgiSetArray(const char *name
, /* I - Name of variable */
395 int element
, /* I - Element number (0 to N) */
396 const char *value
) /* I - Value of variable */
398 int i
; /* Looping var */
399 _cgi_var_t
*var
; /* Returned variable */
402 if (name
== NULL
|| value
== NULL
|| element
< 0 || element
> 100000)
405 if ((var
= cgi_find_variable(name
)) == NULL
)
407 cgi_add_variable(name
, element
, value
);
408 cgi_sort_variables();
412 if (element
>= var
->avalues
)
414 const char **temp
; /* Temporary pointer */
416 temp
= (const char **)realloc((void *)(var
->values
),
417 sizeof(char *) * (element
+ 16));
421 var
->avalues
= element
+ 16;
425 if (element
>= var
->nvalues
)
427 for (i
= var
->nvalues
; i
< element
; i
++)
428 var
->values
[i
] = NULL
;
430 var
->nvalues
= element
+ 1;
432 else if (var
->values
[element
])
433 _cupsStrFree((char *)var
->values
[element
]);
435 var
->values
[element
] = _cupsStrAlloc(value
);
441 * 'cgiSetCookie()' - Set a cookie value.
445 cgiSetCookie(const char *name
, /* I - Name */
446 const char *value
, /* I - Value */
447 const char *path
, /* I - Path (typically "/") */
448 const char *domain
, /* I - Domain name */
449 time_t expires
, /* I - Expiration date (0 for session) */
450 int secure
) /* I - Require SSL */
452 num_cookies
= cupsAddOption(name
, value
, num_cookies
, &cookies
);
454 printf("Set-Cookie: %s=%s;", name
, value
);
456 printf("; path=%s", path
);
458 printf("; domain=%s", domain
);
461 char date
[256]; /* Date string */
463 printf("; expires=%s", httpGetDateString2(expires
, date
, sizeof(date
)));
473 * 'cgiSetSize()' - Set the array size.
477 cgiSetSize(const char *name
, /* I - Name of variable */
478 int size
) /* I - Number of elements (0 to N) */
480 int i
; /* Looping var */
481 _cgi_var_t
*var
; /* Returned variable */
484 if (name
== NULL
|| size
< 0 || size
> 100000)
487 if ((var
= cgi_find_variable(name
)) == NULL
)
490 if (size
>= var
->avalues
)
492 const char **temp
; /* Temporary pointer */
494 temp
= (const char **)realloc((void *)(var
->values
),
495 sizeof(char *) * (size
+ 16));
499 var
->avalues
= size
+ 16;
503 if (size
> var
->nvalues
)
505 for (i
= var
->nvalues
; i
< size
; i
++)
506 var
->values
[i
] = NULL
;
508 else if (size
< var
->nvalues
)
510 for (i
= size
; i
< var
->nvalues
; i
++)
512 _cupsStrFree((void *)(var
->values
[i
]));
520 * 'cgiSetVariable()' - Set a CGI variable in the database.
522 * If the variable is an array, this truncates the array to a single element.
526 cgiSetVariable(const char *name
, /* I - Name of variable */
527 const char *value
) /* I - Value of variable */
529 int i
; /* Looping var */
530 _cgi_var_t
*var
; /* Returned variable */
533 if (name
== NULL
|| value
== NULL
)
536 if ((var
= cgi_find_variable(name
)) == NULL
)
538 cgi_add_variable(name
, 0, value
);
539 cgi_sort_variables();
543 for (i
= 0; i
< var
->nvalues
; i
++)
545 _cupsStrFree((char *)var
->values
[i
]);
547 var
->values
[0] = _cupsStrAlloc(value
);
554 * 'cgi_add_variable()' - Add a form variable.
558 cgi_add_variable(const char *name
, /* I - Variable name */
559 int element
, /* I - Array element number */
560 const char *value
) /* I - Variable value */
562 _cgi_var_t
*var
; /* New variable */
565 if (name
== NULL
|| value
== NULL
|| element
< 0 || element
> 100000)
568 DEBUG_printf(("cgi_add_variable: Adding variable \'%s\' with value "
569 "\'%s\'...\n", name
, value
));
571 if (form_count
>= form_alloc
)
573 _cgi_var_t
*temp_vars
; /* Temporary form pointer */
577 temp_vars
= malloc(sizeof(_cgi_var_t
) * 16);
579 temp_vars
= realloc(form_vars
, (form_alloc
+ 16) * sizeof(_cgi_var_t
));
584 form_vars
= temp_vars
;
588 var
= form_vars
+ form_count
;
590 if ((var
->values
= calloc(element
+ 1, sizeof(char *))) == NULL
)
593 var
->name
= _cupsStrAlloc(name
);
594 var
->nvalues
= element
+ 1;
595 var
->avalues
= element
+ 1;
596 var
->values
[element
] = _cupsStrAlloc(value
);
603 * 'cgi_compare_variables()' - Compare two variables.
606 static int /* O - Result of comparison */
607 cgi_compare_variables(
608 const _cgi_var_t
*v1
, /* I - First variable */
609 const _cgi_var_t
*v2
) /* I - Second variable */
611 return (strcasecmp(v1
->name
, v2
->name
));
616 * 'cgi_find_variable()' - Find a variable.
619 static _cgi_var_t
* /* O - Variable pointer or NULL */
620 cgi_find_variable(const char *name
) /* I - Name of variable */
622 _cgi_var_t key
; /* Search key */
625 if (form_count
< 1 || name
== NULL
)
630 return ((_cgi_var_t
*)bsearch(&key
, form_vars
, form_count
, sizeof(_cgi_var_t
),
631 (int (*)(const void *, const void *))cgi_compare_variables
));
636 * 'cgi_initialize_cookies()' - Initialize cookies.
640 cgi_initialize_cookies(void)
642 const char *cookie
; /* HTTP_COOKIE environment variable */
643 char name
[128], /* Name string */
644 value
[512], /* Value string */
645 *ptr
; /* Pointer into name/value */
648 if ((cookie
= getenv("HTTP_COOKIE")) == NULL
)
654 * Skip leading whitespace...
657 while (isspace(*cookie
& 255))
666 for (ptr
= name
; *cookie
&& *cookie
!= '=';)
667 if (ptr
< (name
+ sizeof(name
) - 1))
684 for (cookie
++, ptr
= value
; *cookie
&& *cookie
!= '\"';)
685 if (ptr
< (value
+ sizeof(value
) - 1))
695 for (ptr
= value
; *cookie
&& *cookie
!= ';';)
696 if (ptr
< (value
+ sizeof(value
) - 1))
710 * Then add the cookie to an array as long as the name doesn't start with
715 num_cookies
= cupsAddOption(name
, value
, num_cookies
, &cookies
);
721 * 'cgi_initialize_get()' - Initialize form variables using the GET method.
724 static int /* O - 1 if form data read */
725 cgi_initialize_get(void)
727 char *data
; /* Pointer to form data string */
730 DEBUG_puts("cgi_initialize_get: Initializing variables using GET method...");
733 * Check to see if there is anything for us to read...
736 data
= getenv("QUERY_STRING");
737 if (data
== NULL
|| strlen(data
) == 0)
741 * Parse it out and return...
744 return (cgi_initialize_string(data
));
749 * 'cgi_initialize_multipart()' - Initialize variables and file using the POST
752 * TODO: Update to support files > 2GB.
755 static int /* O - 1 if form data was read */
756 cgi_initialize_multipart(
757 const char *boundary
) /* I - Boundary string */
759 char line
[10240], /* MIME header line */
760 name
[1024], /* Form variable name */
761 filename
[1024], /* Form filename */
762 mimetype
[1024], /* MIME media type */
763 bstring
[256], /* Boundary string to look for */
764 *ptr
, /* Pointer into name/filename */
765 *end
; /* End of buffer */
766 int ch
, /* Character from file */
767 fd
, /* Temporary file descriptor */
768 blen
; /* Length of boundary string */
771 DEBUG_printf(("cgi_initialize_multipart(boundary=\"%s\")\n", boundary
));
774 * Read multipart form data until we run out...
781 snprintf(bstring
, sizeof(bstring
), "\r\n--%s", boundary
);
782 blen
= strlen(bstring
);
784 while (fgets(line
, sizeof(line
), stdin
))
786 if (!strcmp(line
, "\r\n"))
789 * End of headers, grab value...
795 * Read an embedded file...
801 * Remove previous file...
808 * Allocate memory for the new file...
811 if ((form_file
= calloc(1, sizeof(cgi_file_t
))) == NULL
)
814 form_file
->name
= strdup(name
);
815 form_file
->filename
= strdup(filename
);
816 form_file
->mimetype
= strdup(mimetype
);
818 fd
= cupsTempFd(form_file
->tempfile
, sizeof(form_file
->tempfile
));
823 atexit(cgi_unlink_file
);
826 * Copy file data to the temp file...
831 while ((ch
= getchar()) != EOF
)
835 if ((ptr
- line
) >= blen
&& !memcmp(ptr
- blen
, bstring
, blen
))
841 if ((ptr
- line
- blen
) >= 8192)
844 * Write out the first 8k of the buffer...
847 write(fd
, line
, 8192);
848 memmove(line
, line
+ 8192, ptr
- line
- 8192);
854 * Write the rest of the data and close the temp file...
858 write(fd
, line
, ptr
- line
);
865 * Just get a form variable; the current code only handles
866 * form values up to 10k in size...
870 end
= line
+ sizeof(line
) - 1;
872 while ((ch
= getchar()) != EOF
)
877 if ((ptr
- line
) >= blen
&& !memcmp(ptr
- blen
, bstring
, blen
))
887 * Set the form variable...
890 if ((ptr
= strrchr(name
, '-')) != NULL
&& isdigit(ptr
[1] & 255))
893 * Set a specific index in the array...
898 cgiSetArray(name
, atoi(ptr
) - 1, line
);
900 else if (cgiGetVariable(name
))
903 * Add another element in the array...
906 cgiSetArray(name
, cgiGetSize(name
), line
);
911 * Just set the line...
914 cgiSetVariable(name
, line
);
919 * Read the rest of the current line...
922 fgets(line
, sizeof(line
), stdin
);
925 * Clear the state vars...
932 else if (!strncasecmp(line
, "Content-Disposition:", 20))
934 if ((ptr
= strstr(line
+ 20, " name=\"")) != NULL
)
936 strlcpy(name
, ptr
+ 7, sizeof(name
));
938 if ((ptr
= strchr(name
, '\"')) != NULL
)
942 if ((ptr
= strstr(line
+ 20, " filename=\"")) != NULL
)
944 strlcpy(filename
, ptr
+ 11, sizeof(filename
));
946 if ((ptr
= strchr(filename
, '\"')) != NULL
)
950 else if (!strncasecmp(line
, "Content-Type:", 13))
952 for (ptr
= line
+ 13; isspace(*ptr
& 255); ptr
++);
954 strlcpy(mimetype
, ptr
, sizeof(mimetype
));
956 for (ptr
= mimetype
+ strlen(mimetype
) - 1;
957 ptr
> mimetype
&& isspace(*ptr
& 255);
963 * Return 1 for "form data found"...
971 * 'cgi_initialize_post()' - Initialize variables using the POST method.
974 static int /* O - 1 if form data was read */
975 cgi_initialize_post(void)
977 char *content_length
, /* Length of input data (string) */
978 *data
; /* Pointer to form data string */
979 int length
, /* Length of input data */
980 nbytes
, /* Number of bytes read this read() */
981 tbytes
, /* Total number of bytes read */
982 status
; /* Return status */
985 DEBUG_puts("cgi_initialize_post: Initializing variables using POST method...");
988 * Check to see if there is anything for us to read...
991 content_length
= getenv("CONTENT_LENGTH");
992 if (content_length
== NULL
|| atoi(content_length
) <= 0)
996 * Get the length of the input stream and allocate a buffer for it...
999 length
= atoi(content_length
);
1000 data
= malloc(length
+ 1);
1006 * Read the data into the buffer...
1009 for (tbytes
= 0; tbytes
< length
; tbytes
+= nbytes
)
1010 if ((nbytes
= read(0, data
+ tbytes
, length
- tbytes
)) < 0)
1012 if (errno
!= EAGAIN
)
1020 else if (nbytes
== 0)
1023 * CUPS STR #3176: OpenBSD: Early end-of-file on POST data causes 100% CPU
1025 * This should never happen, but does on OpenBSD. If we see early end-of-
1026 * file, treat this as an error and process no data.
1033 data
[length
] = '\0';
1039 status
= cgi_initialize_string(data
);
1042 * Free the data and return...
1052 * 'cgi_initialize_string()' - Initialize form variables from a string.
1055 static int /* O - 1 if form data was processed */
1056 cgi_initialize_string(const char *data
) /* I - Form data string */
1058 int done
; /* True if we're done reading a form variable */
1059 char *s
, /* Pointer to current form string */
1060 ch
, /* Temporary character */
1061 name
[255], /* Name of form variable */
1062 value
[65536]; /* Variable value */
1073 * Loop until we've read all the form data...
1076 while (*data
!= '\0')
1079 * Get the variable name...
1082 for (s
= name
; *data
!= '\0'; data
++)
1085 else if (*data
>= ' ' && s
< (name
+ sizeof(name
) - 1))
1095 * Read the variable value...
1098 for (s
= value
, done
= 0; !done
&& *data
!= '\0'; data
++)
1101 case '&' : /* End of data... */
1105 case '+' : /* Escaped space character */
1106 if (s
< (value
+ sizeof(value
) - 1))
1110 case '%' : /* Escaped control character */
1112 * Read the hex code...
1115 if (s
< (value
+ sizeof(value
) - 1))
1133 default : /* Other characters come straight through */
1134 if (*data
>= ' ' && s
< (value
+ sizeof(value
) - 1))
1139 *s
= '\0'; /* nul terminate the string */
1142 * Remove trailing whitespace...
1148 while (s
>= value
&& isspace(*s
& 255))
1152 * Add the string to the variable "database"...
1155 if ((s
= strrchr(name
, '-')) != NULL
&& isdigit(s
[1] & 255))
1159 cgiSetArray(name
, atoi(s
) - 1, value
);
1161 else if (cgiGetVariable(name
) != NULL
)
1162 cgiSetArray(name
, cgiGetSize(name
), value
);
1164 cgiSetVariable(name
, value
);
1172 * 'cgi_passwd()' - Catch authentication requests and notify the server.
1174 * This function sends a Status header and exits, forcing authentication
1178 static const char * /* O - NULL (no return) */
1179 cgi_passwd(const char *prompt
) /* I - Prompt (not used) */
1183 fprintf(stderr
, "DEBUG: cgi_passwd(prompt=\"%s\") called!\n",
1184 prompt
? prompt
: "(null)");
1187 * Send a 401 (unauthorized) status to the server, so it can notify
1188 * the client that authentication is required.
1191 puts("Status: 401\n");
1195 * This code is never executed, but is present to satisfy the compiler.
1203 * 'cgi_set_sid()' - Set the CUPS session ID.
1206 static const char * /* O - New session ID */
1209 char buffer
[512], /* SID data */
1210 sid
[33]; /* SID string */
1211 _cups_md5_state_t md5
; /* MD5 state */
1212 unsigned char sum
[16]; /* MD5 sum */
1213 const char *remote_addr
, /* REMOTE_ADDR */
1214 *server_name
, /* SERVER_NAME */
1215 *server_port
; /* SERVER_PORT */
1218 if ((remote_addr
= getenv("REMOTE_ADDR")) == NULL
)
1219 remote_addr
= "REMOTE_ADDR";
1220 if ((server_name
= getenv("SERVER_NAME")) == NULL
)
1221 server_name
= "SERVER_NAME";
1222 if ((server_port
= getenv("SERVER_PORT")) == NULL
)
1223 server_port
= "SERVER_PORT";
1225 CUPS_SRAND(time(NULL
));
1226 snprintf(buffer
, sizeof(buffer
), "%s:%s:%s:%02X%02X%02X%02X%02X%02X%02X%02X",
1227 remote_addr
, server_name
, server_port
,
1228 (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255,
1229 (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255,
1230 (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255,
1231 (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255);
1233 _cupsMD5Append(&md5
, (unsigned char *)buffer
, (int)strlen(buffer
));
1234 _cupsMD5Finish(&md5
, sum
);
1236 cgiSetCookie(CUPS_SID
, httpMD5String(sum
, sid
), "/", server_name
, 0, 0);
1238 return (cupsGetOption(CUPS_SID
, num_cookies
, cookies
));
1243 * 'cgi_sort_variables()' - Sort all form variables for faster lookup.
1247 cgi_sort_variables(void)
1253 DEBUG_puts("cgi_sort_variables: Sorting variables...");
1259 qsort(form_vars
, form_count
, sizeof(_cgi_var_t
),
1260 (int (*)(const void *, const void *))cgi_compare_variables
);
1263 DEBUG_puts("cgi_sort_variables: Sorted variable list is:");
1264 for (i
= 0; i
< form_count
; i
++)
1265 DEBUG_printf(("cgi_sort_variables: %d: %s (%d) = \"%s\" ...\n", i
,
1266 form_vars
[i
].name
, form_vars
[i
].nvalues
,
1267 form_vars
[i
].values
[0]));
1273 * 'cgi_unlink_file()' - Remove the uploaded form.
1277 cgi_unlink_file(void)
1282 * Remove the temporary file...
1285 unlink(form_file
->tempfile
);
1288 * Free memory used...
1291 free(form_file
->name
);
1292 free(form_file
->filename
);
1293 free(form_file
->mimetype
);
1302 * End of "$Id: var.c 7460 2008-04-16 02:19:54Z mike $".