static int find_exec(const char *filepath, char **argv, char *newpath, int newpath_size, char ***new_argv) { char *newname = NULL; if (!filepath) { newpath[0] = '\0'; return 0; } check_for_fork(); if (ldcsid < 0 || !use_ldcs || exec_filter(filepath) != REDIRECT) { strncpy(newpath, filepath, newpath_size); newpath[newpath_size-1] = '\0'; return 0; } sync_cwd(); debug_printf2("Exec operation requesting file: %s\n", filepath); send_file_query(ldcsid, (char *) filepath, &newname); debug_printf("Exec file request returned %s -> %s\n", filepath, newname ? newname : "NULL"); return prep_exec(filepath, argv, newname, newpath, newpath_size, new_argv); }
static int process_packets(struct emwin_server *emserver){ int status; int skip = 0; struct emwin_packet ep; int server_fd = emserver->fd; if(server_type_wx14_msg_device(emserver)) status = get_emwin_packet_wx14_msg(server_fd, &ep); else if(server_type_wx14_raw_device(emserver)) status = get_emwin_packet_wx14_raw(server_fd, &ep); else if(server_type_serial_device(emserver)) status = get_emwin_packet_serial(server_fd, &ep); else status = get_emwin_packet_bb(server_fd, &ep); update_emwin_server_stats(status); if(write_emwin_server_stats(g.emwinstatusfile) != 0) log_err2("Error writing status file", g.emwinstatusfile); if(server_type_wx14_msg_device(emserver)){ if(status == -1) log_err2("Error reading packet from WX14 msg device:", emserver->ip); else if(status != 0) log_errx("Error [%d] reading packet from WX14 msg device:", status, emserver->ip); else { if(wx14_signalstatus_write(g.wx14_signal_statusfile, &g.wx14msg) != 0) log_err2("Error writing wx14 file", g.wx14_signal_statusfile); if(wx14_signalstatus_log(g.wx14_signal_logfile, &g.wx14msg) != 0) log_err2("Error writing wx14 file", g.wx14_signal_logfile); } } else { /* * This applies to both the wx14 raw device and a serial device * * server_type_wx14_raw_device(emserver) * server_type_serial_device(emserver) */ if(status == -1) log_err2("Error reading packet from", emserver->ip); else if(status == -2) log_errx("Timedout trying to get packet from %s.", emserver->ip); else if(status == -3) log_info("Connection closed by %s.", emserver->ip); else if(status == 1) log_errx("Short read from %s.", emserver->ip); else if(status == 2) log_errx("Error in header format or unrecognized packet type."); else if(status == 3) log_errx("Checksum error."); else if(status == 4) log_errx("Check file name error: %s", ep.header.filename); else if(status != 0) log_errx("Cannot process packet: unknown error from get_emwin_packet()"); } if(status != 0) return(status); /* * Sends the packet to the queues for retransmission to the clients. */ if(g.f_server_enabled == 1) (void)server_send_client_queues(&ep); if(ep.bbtype == BB_PACKET_TYPE_SRVLIST){ status = save_server_list(&ep); if(status != 0) log_err("Error saving the server list."); else log_info("Received the server list."); return(0); } /* * Handle and save the data packet. */ if(ep.header.blockno == 1){ /* * Only the first block needs to be checked because, if the file * is rejected, it is not inserted in the queue and subsequent blocks * will be discarded. * "filename" is the product name and the extension; e.g., * cfwsjupr.txt */ skip = exec_filter(ep.header.filename); if(skip == 1){ log_verbose(1, "Prefilter is rejecting %s.", ep.header.filename); return(0); } } log_verbose(1, "Received: %s (%d of %d)", ep.header.filename, ep.header.blockno, ep.header.numblocks); status = save_emwin_packet(&ep); if(status == -1) log_err2("Error saving", ep.header.filename); else log_verbose(1, "Saved: %s (%d of %d)", ep.header.filename, ep.header.blockno, ep.header.numblocks); if(status == 0) ++g.packet_count; return(status); }
int main(int argc, char *argv[]) { cups_option_t *p_cups_opt = NULL; int num_opt = 0; ParamList *p_ps_param = NULL; BufList *p_ps_data = NULL; char *p_data_buf; int ifd = 0; int fds[2]; struct sigaction sigact; char *cmd_buf = NULL; char product[256]; #ifdef DEBUG_SLEEP sleep(30); #endif setbuf(stderr, NULL); fprintf(stderr, "DEBUG: pstocanonbj start.\n"); memset(&sigact, 0, sizeof(sigact)); sigact.sa_handler = sigterm_handler; if( sigaction(SIGTERM, &sigact, NULL) ) { fputs("ERROR: pstocanonbj can't register signal hander.\n", stderr); return 1; } if( argc < 6 || argc > 7 ) { fputs("ERROR: pstocanonbj illegal parameter number.\n", stderr); return 1; } if( argv[5] != NULL ) { num_opt = cupsParseOptions(argv[5], 0, &p_cups_opt); if( num_opt < 0 ) { fputs("ERROR: illegal option.\n", stderr); return 1; } } if( argc == 7 ) { if( (ifd = open(argv[6], O_RDONLY)) == -1 ) { fputs("ERROR: can't open file.\n", stderr); return 1; } } #ifdef DEBUG_IN_PS g_in_log_fd = open("/tmp/debug_in_log.ps", O_WRONLY); #endif p_ps_param = get_ps_params(ifd, &p_ps_data); if( (cmd_buf = make_cmd_param(p_cups_opt, num_opt, p_ps_param, product, 256)) == NULL ) { fputs("ERROR: can't make parameter.\n", stderr); goto error_return; } if( g_signal_received ) goto error_return; if( (p_data_buf = (char*)malloc(DATA_BUF_SIZE)) != NULL ) { #ifdef DEBUG_PS int log_fd = open("/tmp/debug_data_log.ps", O_WRONLY); #endif // Execute extended filter. g_filter_pid = exec_filter(cmd_buf, 1, fds); // Write retained PS header and data. buflist_write(p_ps_data, fds[1]); #ifdef DEBUG_PS buflist_write(p_ps_data, log_fd); #endif // Write remaining PS data. while( !g_signal_received ) { int read_bytes = read(ifd, p_data_buf, DATA_BUF_SIZE); if( read_bytes > 0 ) { int write_bytes; char *p_data = p_data_buf; #ifdef DEBUG_PS write(log_fd, p_data_buf, read_bytes); #endif #ifdef DEBUG_IN_PS if( g_in_log_fd > 0 ) write(g_in_log_fd, p_data_buf, read_bytes); #endif do { write_bytes = write(fds[1], p_data, read_bytes); if( write_bytes < 0 ) { if( errno == EINTR ) continue; fprintf(stderr, "ERROR: pstocanonbj write error,%d.\n", errno); goto error_exit; } read_bytes -= write_bytes; p_data += write_bytes; } while( !g_signal_received && read_bytes > 0 ); } else if( read_bytes < 0 ) { if( errno == EINTR ) continue; fprintf(stderr, "ERROR: pstocanonbj read error,%d.\n", errno); goto error_exit; } else break; } free(p_data_buf); #ifdef DEBUG_PS if( log_fd != -1 ) close(log_fd); #endif } #ifdef DEBUG_IN_PS if( g_in_log_fd > 0 ) close(g_in_log_fd); #endif free(cmd_buf); if( p_ps_param != NULL ) param_list_free(p_ps_param); if( p_ps_data != NULL ) buflist_destroy(p_ps_data); if( ifd != 0 ) close(ifd); close(fds[1]); if( g_filter_pid != -1 ) waitpid(g_filter_pid, NULL, 0); return 0; error_exit: if( p_data_buf != NULL ) free(p_data_buf); error_return: free(cmd_buf); if( p_ps_param != NULL ) param_list_free(p_ps_param); if( p_ps_data != NULL ) buflist_destroy(p_ps_data); if( ifd != 0 ) close(ifd); return 1; }
static int /* O - 0 on success, 1 on error */ exec_filters(cups_array_t *filters, /* I - Array of filters to run */ char **argv) /* I - Filter options */ { int i; /* Looping var */ char program[1024]; /* Program to run */ char *filter, /* Current filter */ *next; /* Next filter */ int current, /* Current filter */ filterfds[2][2], /* Pipes for filters */ pid, /* Process ID of filter */ status, /* Exit status */ retval; /* Return value */ cups_array_t *pids; /* Executed filters array */ filter_pid_t *pid_entry, /* Entry in executed filters array */ key; /* Search key for filters */ const char *cups_serverbin; /* CUPS_SERVERBIN environment variable */ /* * Remove NULL ("-") filters... */ for (filter = (char *)cupsArrayFirst(filters); filter; filter = (char *)cupsArrayNext(filters)) if (!strcmp(filter, "-")) cupsArrayRemove(filters, filter); for (i = 0; argv[i]; i ++) fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); /* * Execute all of the filters... */ pids = cupsArrayNew((cups_array_func_t)compare_pids, NULL); current = 0; filterfds[0][0] = 0; filterfds[0][1] = -1; filterfds[1][0] = -1; filterfds[1][1] = -1; for (filter = (char *)cupsArrayFirst(filters); filter; filter = next, current = 1 - current) { next = (char *)cupsArrayNext(filters); if (filter[0] == '/') strncpy(program, filter, sizeof(program)); else { if ((cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) cups_serverbin = CUPS_SERVERBIN; snprintf(program, sizeof(program), "%s/filter/%s", cups_serverbin, filter); } if (filterfds[!current][1] > 1) { close(filterfds[1 - current][0]); close(filterfds[1 - current][1]); filterfds[1 - current][0] = -1; filterfds[1 - current][0] = -1; } if (next) open_pipe(filterfds[1 - current]); else filterfds[1 - current][1] = 1; pid = exec_filter(program, argv, filterfds[current][0], filterfds[1 - current][1]); if (pid > 0) { fprintf(stderr, "INFO: %s (PID %d) started.\n", filter, pid); pid_entry = malloc(sizeof(filter_pid_t)); pid_entry->pid = pid; pid_entry->name = filter; cupsArrayAdd(pids, pid_entry); } else break; argv[6] = NULL; } /* * Close remaining pipes... */ if (filterfds[0][1] > 1) { close(filterfds[0][0]); close(filterfds[0][1]); } if (filterfds[1][1] > 1) { close(filterfds[1][0]); close(filterfds[1][1]); } /* * Wait for the children to exit... */ retval = 0; while (cupsArrayCount(pids) > 0) { if ((pid = wait(&status)) < 0) { if (errno == EINTR && job_canceled) { fprintf(stderr, "DEBUG: Job canceled, killing filters ...\n"); for (pid_entry = (filter_pid_t *)cupsArrayFirst(pids); pid_entry; pid_entry = (filter_pid_t *)cupsArrayNext(pids)) kill(pid_entry->pid, SIGTERM); job_canceled = 0; } else continue; } key.pid = pid; if ((pid_entry = (filter_pid_t *)cupsArrayFind(pids, &key)) != NULL) { cupsArrayRemove(pids, pid_entry); if (status) { if (WIFEXITED(status)) fprintf(stderr, "ERROR: %s (PID %d) stopped with status %d\n", pid_entry->name, pid, WEXITSTATUS(status)); else fprintf(stderr, "ERROR: %s (PID %d) crashed on signal %d\n", pid_entry->name, pid, WTERMSIG(status)); retval = 1; } else fprintf(stderr, "INFO: %s (PID %d) exited with no errors.\n", pid_entry->name, pid); free(pid_entry); } } cupsArrayDelete(pids); return (retval); }
static int /* O - 0 on success, 1 on error */ exec_filters(mime_type_t *srctype, /* I - Source type */ cups_array_t *filters, /* I - Array of filters to run */ const char *infile, /* I - File to filter */ const char *outfile, /* I - File to create */ const char *ppdfile, /* I - PPD file, if any */ const char *printer, /* I - Printer name */ const char *user, /* I - Username */ const char *title, /* I - Job title */ int num_options, /* I - Number of filter options */ cups_option_t *options) /* I - Filter options */ { int i; /* Looping var */ const char *argv[8], /* Command-line arguments */ *envp[17], /* Environment variables */ *temp; /* Temporary string */ char *optstr, /* Filter options */ content_type[1024], /* CONTENT_TYPE */ cups_datadir[1024], /* CUPS_DATADIR */ cups_fontpath[1024], /* CUPS_FONTPATH */ cups_serverbin[1024], /* CUPS_SERVERBIN */ cups_serverroot[1024], /* CUPS_SERVERROOT */ final_content_type[1024] = "", /* FINAL_CONTENT_TYPE */ lang[1024], /* LANG */ path[1024], /* PATH */ ppd[1024], /* PPD */ printer_info[255], /* PRINTER_INFO env variable */ printer_location[255], /* PRINTER_LOCATION env variable */ printer_name[255], /* PRINTER env variable */ rip_max_cache[1024], /* RIP_MAX_CACHE */ userenv[1024], /* USER */ program[1024]; /* Program to run */ mime_filter_t *filter, /* Current filter */ *next; /* Next filter */ int current, /* Current filter */ filterfds[2][2], /* Pipes for filters */ pid, /* Process ID of filter */ status, /* Exit status */ retval; /* Return value */ cups_array_t *pids; /* Executed filters array */ mime_filter_t key; /* Search key for filters */ cups_lang_t *language; /* Current language */ cups_dest_t *dest; /* Destination information */ /* * Figure out the final content type... */ for (filter = (mime_filter_t *)cupsArrayLast(filters); filter && filter->dst; filter = (mime_filter_t *)cupsArrayPrev(filters)) if (strcmp(filter->dst->super, "printer")) break; if (filter && filter->dst) { const char *ptr; /* Pointer in type name */ if ((ptr = strchr(filter->dst->type, '/')) != NULL) snprintf(final_content_type, sizeof(final_content_type), "FINAL_CONTENT_TYPE=%s", ptr + 1); else snprintf(final_content_type, sizeof(final_content_type), "FINAL_CONTENT_TYPE=%s/%s", filter->dst->super, filter->dst->type); } /* * Remove NULL ("-") filters... */ for (filter = (mime_filter_t *)cupsArrayFirst(filters); filter; filter = (mime_filter_t *)cupsArrayNext(filters)) if (!strcmp(filter->filter, "-")) cupsArrayRemove(filters, filter); /* * Setup the filter environment and command-line... */ optstr = escape_options(num_options, options); snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s", srctype->super, srctype->type); snprintf(cups_datadir, sizeof(cups_datadir), "CUPS_DATADIR=%s", DataDir); snprintf(cups_fontpath, sizeof(cups_fontpath), "CUPS_FONTPATH=%s", FontPath); snprintf(cups_serverbin, sizeof(cups_serverbin), "CUPS_SERVERBIN=%s", ServerBin); snprintf(cups_serverroot, sizeof(cups_serverroot), "CUPS_SERVERROOT=%s", ServerRoot); language = cupsLangDefault(); snprintf(lang, sizeof(lang), "LANG=%s.UTF8", language->language); snprintf(path, sizeof(path), "PATH=%s", Path); if (ppdfile) snprintf(ppd, sizeof(ppd), "PPD=%s", ppdfile); else if ((temp = getenv("PPD")) != NULL) snprintf(ppd, sizeof(ppd), "PPD=%s", temp); else #ifdef __APPLE__ if (!access("/System/Library/Frameworks/ApplicationServices.framework/" "Versions/A/Frameworks/PrintCore.framework/Versions/A/" "Resources/English.lproj/Generic.ppd", 0)) strlcpy(ppd, "PPD=/System/Library/Frameworks/ApplicationServices.framework/" "Versions/A/Frameworks/PrintCore.framework/Versions/A/" "Resources/English.lproj/Generic.ppd", sizeof(ppd)); else strlcpy(ppd, "PPD=/System/Library/Frameworks/ApplicationServices.framework/" "Versions/A/Frameworks/PrintCore.framework/Versions/A/" "Resources/Generic.ppd", sizeof(ppd)); #else snprintf(ppd, sizeof(ppd), "PPD=%s/model/laserjet.ppd", DataDir); #endif /* __APPLE__ */ snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache); snprintf(userenv, sizeof(userenv), "USER=%s", user); if (printer && (dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, NULL)) != NULL) { if ((temp = cupsGetOption("printer-info", dest->num_options, dest->options)) != NULL) snprintf(printer_info, sizeof(printer_info), "PRINTER_INFO=%s", temp); else snprintf(printer_info, sizeof(printer_info), "PRINTER_INFO=%s", printer); if ((temp = cupsGetOption("printer-location", dest->num_options, dest->options)) != NULL) snprintf(printer_location, sizeof(printer_location), "PRINTER_LOCATION=%s", temp); else strlcpy(printer_location, "PRINTER_LOCATION=Unknown", sizeof(printer_location)); } else { snprintf(printer_info, sizeof(printer_info), "PRINTER_INFO=%s", printer ? printer : "Unknown"); strlcpy(printer_location, "PRINTER_LOCATION=Unknown", sizeof(printer_location)); } snprintf(printer_name, sizeof(printer_name), "PRINTER=%s", printer ? printer : "Unknown"); argv[0] = (char *)printer; argv[1] = "1"; argv[2] = user; argv[3] = title; argv[4] = cupsGetOption("copies", num_options, options); argv[5] = optstr; argv[6] = infile; argv[7] = NULL; if (!argv[4]) argv[4] = "1"; envp[0] = "<CFProcessPath>"; envp[1] = content_type; envp[2] = cups_datadir; envp[3] = cups_fontpath; envp[4] = cups_serverbin; envp[5] = cups_serverroot; envp[6] = lang; envp[7] = path; envp[8] = ppd; envp[9] = printer_info; envp[10] = printer_location; envp[11] = printer_name; envp[12] = rip_max_cache; envp[13] = userenv; envp[14] = "CHARSET=utf-8"; if (final_content_type[0]) { envp[15] = final_content_type; envp[16] = NULL; } else envp[15] = NULL; for (i = 0; argv[i]; i ++) fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); for (i = 0; envp[i]; i ++) fprintf(stderr, "DEBUG: envp[%d]=\"%s\"\n", i, envp[i]); /* * Execute all of the filters... */ pids = cupsArrayNew((cups_array_func_t)compare_pids, NULL); current = 0; filterfds[0][0] = -1; filterfds[0][1] = -1; filterfds[1][0] = -1; filterfds[1][1] = -1; if (!infile) filterfds[0][0] = 0; for (filter = (mime_filter_t *)cupsArrayFirst(filters); filter; filter = next, current = 1 - current) { next = (mime_filter_t *)cupsArrayNext(filters); if (filter->filter[0] == '/') strlcpy(program, filter->filter, sizeof(program)); else snprintf(program, sizeof(program), "%s/filter/%s", ServerBin, filter->filter); if (filterfds[!current][1] > 1) { close(filterfds[1 - current][0]); close(filterfds[1 - current][1]); filterfds[1 - current][0] = -1; filterfds[1 - current][0] = -1; } if (next) open_pipe(filterfds[1 - current]); else if (outfile) { filterfds[1 - current][1] = open(outfile, O_CREAT | O_TRUNC | O_WRONLY, 0666); if (filterfds[1 - current][1] < 0) fprintf(stderr, "ERROR: Unable to create \"%s\" - %s\n", outfile, strerror(errno)); } else filterfds[1 - current][1] = 1; pid = exec_filter(program, (char **)argv, (char **)envp, filterfds[current][0], filterfds[1 - current][1]); if (pid > 0) { fprintf(stderr, "INFO: %s (PID %d) started.\n", filter->filter, pid); filter->cost = pid; cupsArrayAdd(pids, filter); } else break; argv[6] = NULL; } /* * Close remaining pipes... */ if (filterfds[0][1] > 1) { close(filterfds[0][0]); close(filterfds[0][1]); } if (filterfds[1][1] > 1) { close(filterfds[1][0]); close(filterfds[1][1]); } /* * Wait for the children to exit... */ retval = 0; while (cupsArrayCount(pids) > 0) { if ((pid = wait(&status)) < 0) continue; key.cost = pid; if ((filter = (mime_filter_t *)cupsArrayFind(pids, &key)) != NULL) { cupsArrayRemove(pids, filter); if (status) { if (WIFEXITED(status)) fprintf(stderr, "ERROR: %s (PID %d) stopped with status %d\n", filter->filter, pid, WEXITSTATUS(status)); else fprintf(stderr, "ERROR: %s (PID %d) crashed on signal %d\n", filter->filter, pid, WTERMSIG(status)); retval = 1; } else fprintf(stderr, "INFO: %s (PID %d) exited with no errors.\n", filter->filter, pid); } } cupsArrayDelete(pids); return (retval); }
int main (int argc, char *argv[]) { int use_stdin = 0; FILE *newsfile; FILE *newsfile_copy; char *bodyfile_name = NULL; FILE *bodyfile_r; FILE *bodyfile_w; char *mergefile_name = NULL; FILE *mergefile; #if defined(MAINLOOP) volatile int w = 1; while (w); #endif parse_commandline (argc, argv); if (printversion) { printf ("%s (" PACKAGE ") " VERSION "\n", Name); return 0; } if (!strcmp (newsfile_name, "-")) { use_stdin = 1; newsfile_name = nb_tmpnam (); newsfile_copy = open_write (newsfile_name); newsfile = stdin; mergefile = stdout; } else { newsfile_copy = NULL; newsfile = open_read (newsfile_name); mergefile_name = nb_tmpnam (); mergefile = open_write (mergefile_name); } if (filter) { expand_argv (new_argv, "-"); exec_filter (new_argv, &bodyfile_w, &bodyfile_r); writebody (newsfile, newsfile_copy, bodyfile_w, remove_header, remove_quote, remove_sig, keep); newsfile = open_read (newsfile_name); readbody (newsfile, bodyfile_r, mergefile, remove_header, remove_quote, remove_sig, keep); check_child (); } else { bodyfile_name = nb_tmpnam (); bodyfile_w = open_write (bodyfile_name); expand_argv (new_argv, bodyfile_name); writebody (newsfile, newsfile_copy, bodyfile_w, remove_header, remove_quote, remove_sig, keep); exec_program (new_argv); check_child (); newsfile = open_read (newsfile_name); bodyfile_r = open_read (bodyfile_name); readbody (newsfile, bodyfile_r, mergefile, remove_header, remove_quote, remove_sig, keep); } if (use_stdin) nb_unlink (newsfile_name); else nb_rename (mergefile_name, newsfile_name); if (!filter) nb_unlink (bodyfile_name); return 0; }
int main(int argc, char *argv[]) { cups_option_t *p_cups_opt = NULL; ParamList *p_list = NULL; ParamList *p_list2 = NULL; char *p_data_buf = NULL; char *cmd_buf = NULL; int cmd_buf_size = 0; struct sigaction sigact; int num_opt = 0,out_num = 0; int ifd = 0; int fds[2]; int result = -1; #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; #endif #ifdef HAVE_SIGSET sigset(SIGPIPE, SIG_IGN); #elif defined(HAVE_SIGACTION) memset(&action, 0, sizeof(action)); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); #else signal(SIGPIPE, SIG_IGN); #endif /* HAVE_SIGSET */ /* register signal */ memset(&sigact, 0, sizeof(sigact)); sigact.sa_handler = sigterm_handler; if( sigaction(SIGTERM, &sigact, NULL) ) { fputs("DEBUG:[rastertocanonij] pstocanonij can't register signal hander.\n", stderr); goto onErr1; } if( argc < 6 || argc > 7 ) { fputs("DEBUG:[rastertocanonij] pstocanonij illegal parameter number.\n", stderr); goto onErr1; } if( argv[5] != NULL ) { num_opt = cupsParseOptions(argv[5], 0, &p_cups_opt); if( num_opt < 0 ) { fputs("DEBUG:[rastertocanonij] illegal option.\n", stderr); goto onErr1; } } if( g_signal_received ) goto onErr1; /* Allocate buffer to communicate */ if( (p_data_buf = (char*)malloc(DATA_BUF_SIZE)) == NULL ) goto onErr1; /* Parse Option, and get option list for tocanonij filter */ if ( GetPrinterSettings( p_cups_opt, num_opt, &p_list, &out_num ) != 0 ){ fprintf( stderr, "DEBUG:Error in GetPrinterSettings\n" ); goto onErr2; } /* Parse PPD, and get option list for tocnpwg filter */ if ( GetPrinterableAreaOptionFromPPD( ref_value_from_list(p_list, "--papersize"), &p_list2, &out_num ) != 0 ){ fprintf( stderr, "DEBUG:Error in GetPrinterableAreaOptionFromPPD\n" ); goto onErr3; } DEBUG_PRINT( "DEBUG:[rastertocanonij] rastertocanonij main <0>\n" ); /* Get BufSize */ if ( (cmd_buf_size = GetOptionBufSize( p_list )) < 0 ){ fprintf( stderr, "DEBUG:[rastertocanonij] GetOptionBufSize in Error\n" ); goto onErr4; } /* Allocate Command Buffer */ cmd_buf_size = CMD_BUF_SIZE; if ( (cmd_buf = (char *)malloc( cmd_buf_size )) == NULL ) goto onErr4; DEBUG_PRINT( "DEBUG:[rastertocanonij] rastertocanonij main <1>\n" ); /* Make execute command */ if ( MakeExecCommand( cmd_buf, cmd_buf_size, p_list, p_list2 ) != 0 ){ fprintf( stderr, "DEBUG:[rastertocanonij] MakeExecCommand in Error\n" ); goto onErr5; } DEBUG_PRINT( "DEBUG:[rastertocanonij] rastertocanonij main <2>\n" ); /* set cmd_buf here .....*/ DEBUG_PRINT2( "DEBUG:[rastertocanonij] cmd_buf : %s\n", cmd_buf ); if ( (g_filter_pid = exec_filter(cmd_buf, 1, fds)) == -1 ){ fprintf( stderr, "DEBUG:[rastertocanonij] exec_filter in Error\n" ); goto onErr5; } DEBUG_PRINT( "DEBUG:[rastertocanonij] rastertocanonij main <3>\n" ); /* WriteData */ while( !g_signal_received ) { int read_bytes = read(ifd, p_data_buf, DATA_BUF_SIZE); if ( read_bytes > 0 ) { int write_bytes; char *p_data = p_data_buf; do { write_bytes = write(fds[1], p_data, read_bytes); if( write_bytes < 0 ) { if( errno == EINTR ) continue; fprintf(stderr, "DEBUG:[rastertocanonij] pstocanonij write error,%d.\n", errno); goto onErr6; } read_bytes -= write_bytes; p_data += write_bytes; } while( !g_signal_received && read_bytes > 0 ); } else if( read_bytes < 0 ) { if( errno == EINTR ) continue; fprintf(stderr, "DEBUG:[rastertocanonij] pstocanonij read error,%d.\n", errno); goto onErr6; } else { DEBUG_PRINT( "DEBUG:[rastertocanonij] rastertocanonij main <break>\n" ); break; } } DEBUG_PRINT( "DEBUG:[rastertocanonij] rastertocanonij main <4>\n" ); result = 0; onErr6: close( fds[1] ); /* wait process */ if ( g_filter_pid != -1 ){ waitpid( g_filter_pid, NULL, 0 ); } onErr5: if( cmd_buf != NULL ){ free( cmd_buf ); } onErr4: param_list_free( p_list2 ); onErr3: param_list_free( p_list ); onErr2: if( p_data_buf != NULL ){ free( p_data_buf ); } onErr1: return result; }