Sistemai gli esempi delle pipe con i CGI, riscritto il testo
[gapil.git] / sources / BarCodePage.c
1 /* BarCodeOld.c
2  * 
3  * Copyright (C) 2002 Simone Piccardi
4  * 
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or (at
8  * your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /****************************************************************
20  *
21  * Program barcode 
22  * CGI for barcode generation
23  *
24  * Author: Simone Piccardi
25  * Jun. 2002
26  *
27  * Usage: cgi-bin for apache.
28  * Called by downloading something like:
29  * http://localhost/cgi-bin/barcode?string
30  * where string is the code to be converted
31  *
32  * $Id: BarCodePage.c,v 1.1 2002/06/30 13:26:17 piccardi Exp $ 
33  *
34  ****************************************************************/
35 /* 
36  * Include needed headers
37  */
38 #include <sys/types.h>   /* predefined types */
39 #include <sys/stat.h>    /* stat deinitiions */
40 #include <unistd.h>      /* include unix standard library */
41 /* */
42 #include <stdio.h>       /* include standard I/O library */
43 #include <stdlib.h>      /* include standard library */
44 #include <string.h>      /* include string library */
45 #include <wait.h>        /* include wait call */
46 #include <fcntl.h>
47 #include <assert.h>
48 #include <time.h>
49
50 #include"macros.h"
51 void WriteMess(char *mess);
52
53
54 /* Program begin */
55 int main(int argc, char *argv[], char *envp[])
56 {
57 /*
58  * Variables definition  
59  */
60     pid_t pid;
61     int retval;
62     int pipein[2];
63     int pipeout[2];
64     char content[]="Content-type: image/jpeg\n\n";
65     char size[]="-pA9";
66     /* 
67      * Begin
68      */
69     /* create two pipes to handle process communication */
70     if ( (retval = pipe(pipein)) ) {
71         WriteMess("input pipe creation error");
72         exit(0);        
73     }
74     if ( (retval = pipe(pipeout)) ) {
75         WriteMess("output pipe creation error");
76         exit(0);        
77     }    
78     /* fork child to run barcode program */
79     pid = fork();
80     if (pid == -1) {
81         WriteMess("child creation error");
82         exit(0);        
83     }
84     /* if child */
85     if (pid == 0) {
86         /*
87          * Child exec barcode program, that take input (string to encode)
88          * from pipein, remapped to stdin, and write the output (a PS
89          * image) to stdout, remapped to pipeout 
90          */
91         close(pipein[1]);                /* close output side of input pipe */
92         dup2(pipein[0], STDIN_FILENO);   /* remap stdin in pipe input */
93         close(pipeout[0]);
94         dup2(pipeout[1], STDOUT_FILENO); /* remap stdout in pipe output */
95         execlp("barcode", "barcode", size, NULL); //"-o", "-",  NULL);
96     } 
97     /*
98      * Parent write string to pipe input and close it, 
99      * then wait child execution and results form pipeout, 
100      * then fork to convert PS to JPEG using gs
101      */
102     close(pipein[0]);        /* close input side of input pipe */
103     write(pipein[1], argv[1], strlen(argv[1]));
104     close(pipein[1]);
105     waitpid(pid, NULL, 0);
106     /* Second fork use child to run ghostscript*/
107     pid = fork();
108     if (pid == -1) {
109         WriteMess("child creation error");
110         exit(0);
111     }
112     /* second child, convert PS to JPEG */
113     if (pid == 0) {
114         close(pipeout[1]);              /* close write end */
115         dup2(pipeout[0], STDIN_FILENO); /* remap read end to stdin */
116         /* send mime type */
117         write(STDOUT_FILENO, content, strlen(content));
118         execlp("gs", "gs", "-q", "-sDEVICE=jpeg", "-sOutputFile=-", "-", NULL);
119     }
120     /* still parent */
121     close(pipeout[1]); 
122     waitpid(pid, NULL, 0);
123     exit(0);
124 }
125 /*
126  * Routine to produce an HTML error message on output 
127  */
128 void WriteMess(char *mess)
129 {
130     printf("Content-type: text/html\n\n");
131     perror(mess);
132     printf("<br>\n");
133 }