int main(int argc, char* argv[]) { int fd_old = 0; int fd_new = 0; struct stat statbuff_old; struct stat statbuff_new; char *file_addr_old; char *file_addr_new; long filesize_old = 0; long filesize_new = 0; long size = 0; long offset = 0; int res =0; if (argv[1] == NULL || argv[2] == NULL) { printf("Usage: ./getobj file_old file_new:"); res = -1; goto finish_ret; } fd_old = open(argv[1],O_RDWR); fd_new = open(argv[2],O_RDWR); if(stat(argv[1], &statbuff_old) < 0 || stat(argv[2], &statbuff_new) < 0) { printf("get file stat failed"); res = -1; goto finish_ret; }else{ filesize_old = statbuff_old.st_size; filesize_new = statbuff_new.st_size; } file_addr_old = (char* )malloc(filesize_old); file_addr_new = (char* )malloc(filesize_new); //printf("filesize_old : %d\nfilesize_new : %d\n",filesize_old,filesize_new); //printf("fileaddr_old : %x\nfileaddr_new : %x\n",file_addr_old,file_addr_new); memset(file_addr_old, 0x00, filesize_old); memset(file_addr_new, 0x00, filesize_new); size = read(fd_old, file_addr_old, filesize_old); if(size < filesize_old) { printf("get file content failed\n"); res = -1; goto finish_ret; } close(fd_old);fd_old = 0; offset = findElfHeader(file_addr_old, size); if(offset == -1) { printf("get file offset failed\n"); res = -1; goto finish_ret; } dumpstring(file_addr_old+ offset, 64); finish_ret: return 0; }
int putprinter(char *name, PRINTER *prbufp) { register char * path; register char * stty; register char * speed; int fdin, fdout; int fld; char buf[BUFSIZ]; struct stat statbuf1, statbuf2; badprinter = 0; if (!name || !*name) { errno = EINVAL; return (-1); } if (STREQU(NAME_ALL, name)) { errno = EINVAL; return (-1); } /* * First go through the structure and see if we have * anything strange. */ if (!okprinter(name, prbufp, 1)) { errno = EINVAL; return (-1); } if (!Lp_A_Printers || !Lp_A_Interfaces) { getadminpaths (LPUSER); if (!Lp_A_Printers || !Lp_A_Interfaces) return (0); } /* * Create the parent directory for this printer * if it doesn't yet exist. */ if (!(path = getprinterfile(name, (char *)0))) return (-1); if (Stat(path, &statbuf1) == 0) { if (!S_ISDIR(statbuf1.st_mode)) { Free (path); errno = ENOTDIR; return (-1); } } else if (errno != ENOENT || mkdir_lpdir(path, MODE_DIR) == -1) { Free (path); return (-1); } Free (path); /* * Create the copy of the interface program, unless * that would be silly or not desired. * Conversely, make sure the interface program doesn't * exist for a remote printer. */ if (prbufp->remote) { if (!(path = makepath(Lp_A_Interfaces, name, (char *)0))) return (-1); (void)rmfile (path); Free (path); } if (prbufp->interface && (ignprinter & BAD_INTERFACE) == 0) { if (Stat(prbufp->interface, &statbuf1) == -1) return (-1); if (!(path = makepath(Lp_A_Interfaces, name, (char *)0))) return (-1); if ( Stat(path, &statbuf2) == -1 || statbuf1.st_dev != statbuf2.st_dev || statbuf1.st_ino != statbuf2.st_ino ) { register int n; if ((fdin = open_locked(prbufp->interface, "r", 0)) < 0) { Free (path); return (-1); } if ((fdout = open_locked(path, "w", MODE_EXEC)) < 0) { Free (path); close(fdin); return (-1); } while ((n = read(fdin, buf, BUFSIZ)) > 0) write (fdout, buf, n); close(fdout); close(fdin); } Free (path); } #ifdef LP_USE_PAPI_ATTR /* * Handle PPD (Postscript Printer Definition) file for printer * if this printer has been configured with one */ if ((prbufp->ppd != NULL) && (ppdopt)) { if (addPrintersPPD(name, prbufp) != 0) { /* failed to added the printers PPD file */ return (-1); } } #endif /* * If this printer is dialed up, remove any baud rates * from the stty option list and move the last one to * the ".speed" member if the ".speed" member isn't already * set. Conversely, if this printer is directly connected, * move any value from the ".speed" member to the stty list. */ stty = (prbufp->stty? Strdup(prbufp->stty) : 0); if (prbufp->speed) speed = Strdup(prbufp->speed); else speed = 0; if (prbufp->dial_info && stty) { register char *newstty, *p, *q; register int len; if (!(q = newstty = Malloc(strlen(stty) + 1))) { Free (stty); errno = ENOMEM; return (-1); } newstty[0] = 0; /* start with empty copy */ for ( p = strtok(stty, " "); p; p = strtok((char *)0, " ") ) { len = strlen(p); if (strspn(p, "0123456789") == len) { /* * If "prbufp->speed" isn't set, then * use the speed we just found. Don't * check "speed", because if more than * one speed was given in the list, we * want the last one. */ if (!prbufp->speed) { if (speed) Free (speed); speed = Strdup(p); } } else { /* * Not a speed, so copy it to the * new stty string. */ if (q != newstty) *q++ = ' '; strcpy (q, p); q += len; } } Free (stty); stty = newstty; } else if (!prbufp->dial_info && speed) { register char *newstty; newstty = Malloc(strlen(stty) + 1 + strlen(speed) + 1); if (!newstty) { if (stty) Free (stty); errno = ENOMEM; return (-1); } if (stty) { strcpy (newstty, stty); strcat (newstty, " "); strcat (newstty, speed); Free (stty); } else strcpy (newstty, speed); Free (speed); speed = 0; stty = newstty; } /* * Open the configuration file and write out the printer * configuration. */ if (!(path = getprinterfile(name, CONFIGFILE))) { if (stty) Free (stty); if (speed) Free (speed); return (-1); } if ((fdout = open_locked(path, "w", MODE_READ)) < 0) { Free (path); if (stty) Free (stty); if (speed) Free (speed); return (-1); } Free (path); errno = 0; for (fld = 0; fld < PR_MAX; fld++) { if (prbufp->remote && !prtrheadings[fld].okremote) continue; switch (fld) { #define HEAD prtrheadings[fld].v case PR_BAN: { char *ptr = NAME_ON; switch (prbufp->banner) { case BAN_ALWAYS: ptr = NAME_ON; break; case BAN_NEVER: ptr = NAME_OFF; break; case BAN_OPTIONAL: ptr = NAME_OPTIONAL; break; } (void)fdprintf(fdout, "%s %s\n", HEAD, ptr); } break; case PR_CPI: print_sdn(fdout, HEAD, prbufp->cpi); break; case PR_CS: if (!emptylist(prbufp->char_sets)) print_l(fdout, HEAD, prbufp->char_sets); break; case PR_ITYPES: /* * Put out the header even if the list is empty, * to distinguish no input types from the default. */ print_l(fdout, HEAD, prbufp->input_types); break; case PR_DEV: print_str(fdout, HEAD, prbufp->device); break; case PR_DIAL: print_str(fdout, HEAD, prbufp->dial_info); break; case PR_RECOV: print_str(fdout, HEAD, prbufp->fault_rec); break; case PR_INTFC: print_str(fdout, HEAD, prbufp->interface); break; case PR_LPI: print_sdn(fdout, HEAD, prbufp->lpi); break; case PR_LEN: print_sdn(fdout, HEAD, prbufp->plen); break; case PR_LOGIN: if (prbufp->login & LOG_IN) (void)fdprintf(fdout, "%s\n", HEAD); break; case PR_PTYPE: { char **printer_types; /* * For backward compatibility for those who * use only "->printer_type", we have to play * some games here. */ if (prbufp->printer_type && !prbufp->printer_types) printer_types = getlist( prbufp->printer_type, LP_WS, LP_SEP ); else printer_types = prbufp->printer_types; if (!printer_types || !*printer_types) print_str(fdout, HEAD, NAME_UNKNOWN); else print_l(fdout, HEAD, printer_types); if (printer_types != prbufp->printer_types) freelist (printer_types); break; } case PR_REMOTE: print_str(fdout, HEAD, prbufp->remote); break; case PR_SPEED: print_str(fdout, HEAD, speed); break; case PR_STTY: print_str(fdout, HEAD, stty); break; case PR_WIDTH: print_sdn(fdout, HEAD, prbufp->pwid); break; #if defined(CAN_DO_MODULES) case PR_MODULES: /* * Put out the header even if the list is empty, * to distinguish no modules from the default. */ print_l(fdout, HEAD, prbufp->modules); break; #endif case PR_OPTIONS: print_l(fdout, HEAD, prbufp->options); break; case PR_PPD: { print_str(fdout, HEAD, prbufp->ppd); break; } } } if (stty) Free (stty); if (speed) Free (speed); if (errno != 0) { close(fdout); return (-1); } close(fdout); /* * If we have a description of the printer, * write it out to a separate file. */ if (prbufp->description) { if (!(path = getprinterfile(name, COMMENTFILE))) return (-1); if (dumpstring(path, prbufp->description) == -1) { Free (path); return (-1); } Free (path); } /* * Now write out the alert condition. */ if ( prbufp->fault_alert.shcmd && putalert(Lp_A_Printers, name, &(prbufp->fault_alert)) == -1 ) return (-1); return (0); }
/* Read a MIDI event, returning a freshly allocated element that can be linked to the event list */ static MidiEventList *read_midi_event(struct md *d) { static uint8 laststatus, lastchan; static uint8 nrpn=0, rpn_msb[MAXCHAN], rpn_lsb[MAXCHAN]; /* one per channel */ uint8 me, type, a,b,c; int32 len, i; MidiEventList *newev; for (;;) { #ifdef tplus if ( (len=getvl(d)) < 0) return 0; d->at+= len; #else d->at+=getvl(d); #endif #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } me = (uint8)i; #else if (fread(&me,1,1,d->fp)!=1) { ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, sys_errlist[errno]); return 0; } #endif if(me==0xF0 || me == 0xF7) /* SysEx event */ { int32 sret; uint8 sysa=0, sysb=0, syschan=0; #ifdef tplus if ( (len=getvl(d)) < 0) return 0; #else len=getvl(d); #endif sret=sysex(len, &syschan, &sysa, &sysb, d); if (sret) { MIDIEVENT(d->at, sret, syschan, sysa, sysb); } } else if(me==0xFF) /* Meta event */ { #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } type = (uint8)i; #else fread(&type,1,1,d->fp); #endif #ifdef tplus if ( (len=getvl(d)) < 0) return 0; #else len=getvl(d); #endif if (type>0 && type<16) { static const char *label[]={ "text: ", "text: ", "Copyright: ", "track: ", "instrument: ", "lyric: ", "marker: ", "cue point: "}; dumpstring(len, label[(type>7) ? 0 : type], type, d); } else switch(type) { case 0x21: /* MIDI port number */ if(len == 1) { fread(&d->midi_port_number,1,1,d->fp); if(d->midi_port_number == EOF) { ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } d->midi_port_number &= 0x0f; if (d->midi_port_number) ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "(MIDI port number %d)", d->midi_port_number); d->midi_port_number &= 0x03; } else skip(d->fp, len); break; case 0x2F: /* End of Track */ return MAGIC_EOT; case 0x51: /* Tempo */ #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } a = (uint8)i; if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } b = (uint8)i; if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } c = (uint8)i; #else fread(&a,1,1,d->fp); fread(&b,1,1,d->fp); fread(&c,1,1,d->fp); #endif MIDIEVENT(d->at, ME_TEMPO, c, a, b); default: ctl->cmsg(CMSG_INFO, VERB_DEBUG, "(Meta event type 0x%02x, length %ld)", type, len); skip(d->fp, len); break; } } else { a=me; if (a & 0x80) /* status byte */ { lastchan = MERGE_CHANNEL_PORT(a & 0x0F); laststatus=(a>>4) & 0x07; #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } a = (uint8)i; #else fread(&a, 1,1, d->fp); #endif a &= 0x7F; } switch(laststatus) { case 0: /* Note off */ #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } b = (uint8)i; #else fread(&b, 1,1, d->fp); #endif b &= 0x7F; /*MIDIEVENT(d->at, ME_NOTEOFF, lastchan, a,b);*/ MIDIEVENT(d->at, ME_NOTEON, lastchan, a,0); case 1: /* Note on */ #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } b = (uint8)i; #else fread(&b, 1,1, d->fp); #endif b &= 0x7F; MIDIEVENT(d->at, ME_NOTEON, lastchan, a,b); if (d->curr_track == d->curr_title_track && d->track_info > 1) d->title[0] = '\0'; case 2: /* Key Pressure */ #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } b = (uint8)i; #else fread(&b, 1,1, d->fp); #endif b &= 0x7F; MIDIEVENT(d->at, ME_KEYPRESSURE, lastchan, a, b); case 3: /* Control change */ #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } b = (uint8)i; #else fread(&b, 1,1, d->fp); #endif b &= 0x7F; { int control=255; switch(a) { #ifdef tplus case 1: control=ME_MODULATION_WHEEL; break; case 5: control=ME_PORTAMENTO_TIME_MSB; break; case 37: control=ME_PORTAMENTO_TIME_LSB; break; case 65: control=ME_PORTAMENTO; break; #endif case 7: control=ME_MAINVOLUME; break; case 10: control=ME_PAN; break; case 11: control=ME_EXPRESSION; break; #ifdef tplus case 64: control=ME_SUSTAIN; b = (b >= 64); break; #else case 64: control=ME_SUSTAIN; break; #endif case 71: control=ME_HARMONICCONTENT; break; case 72: control=ME_RELEASETIME; break; case 73: control=ME_ATTACKTIME; break; case 74: control=ME_BRIGHTNESS; break; case 91: control=ME_REVERBERATION; break; case 93: control=ME_CHORUSDEPTH; break; #ifdef CHANNEL_EFFECT case 94: control=ME_CELESTE; break; ctl->cmsg(CMSG_INFO, VERB_NORMAL, "CELESTE"); case 95: control=ME_PHASER; break; ctl->cmsg(CMSG_INFO, VERB_NORMAL, "PHASER"); #endif case 120: control=ME_ALL_SOUNDS_OFF; break; case 121: control=ME_RESET_CONTROLLERS; break; case 123: control=ME_ALL_NOTES_OFF; break; /* These should be the SCC-1 tone bank switch commands. I don't know why there are two, or why the latter only allows switching to bank 0. Also, some MIDI files use 0 as some sort of continuous controller. This will cause lots of warnings about undefined tone banks. */ case 0: if (d->XG_System_On) control=ME_TONE_KIT; else control=ME_TONE_BANK; break; case 32: if (d->XG_System_On) control=ME_TONE_BANK; break; case 100: nrpn=0; rpn_msb[lastchan]=b; break; case 101: nrpn=0; rpn_lsb[lastchan]=b; break; case 98: nrpn=1; rpn_lsb[lastchan]=b; break; case 99: nrpn=1; rpn_msb[lastchan]=b; break; case 6: if (nrpn) { if (rpn_msb[lastchan]==1) switch (rpn_lsb[lastchan]) { #ifdef tplus case 0x08: control=ME_VIBRATO_RATE; break; case 0x09: control=ME_VIBRATO_DEPTH; break; case 0x0a: control=ME_VIBRATO_DELAY; break; #endif case 0x20: control=ME_BRIGHTNESS; break; case 0x21: control=ME_HARMONICCONTENT; break; /* case 0x63: envelope attack rate case 0x64: envelope decay rate case 0x66: envelope release rate */ } else switch (rpn_msb[lastchan]) { /* case 0x14: filter cutoff frequency case 0x15: filter resonance case 0x16: envelope attack rate case 0x17: envelope decay rate case 0x18: pitch coarse case 0x19: pitch fine */ case 0x1a: d->drumvolume[lastchan][0x7f & rpn_lsb[lastchan]] = b; break; case 0x1c: if (!b) b=(int) (127.0*rand()/(RAND_MAX)); d->drumpanpot[lastchan][0x7f & rpn_lsb[lastchan]] = b; break; case 0x1d: d->drumreverberation[lastchan][0x7f & rpn_lsb[lastchan]] = b; break; case 0x1e: d->drumchorusdepth[lastchan][0x7f & rpn_lsb[lastchan]] = b; break; /* case 0x1f: variation send level */ } ctl->cmsg(CMSG_INFO, VERB_DEBUG, "(Data entry (MSB) for NRPN %02x,%02x: %ld)", rpn_msb[lastchan], rpn_lsb[lastchan], b); break; } switch((rpn_msb[lastchan]<<8) | rpn_lsb[lastchan]) { case 0x0000: /* Pitch bend sensitivity */ control=ME_PITCH_SENS; break; #ifdef tplus case 0x0001: control=ME_FINE_TUNING; break; case 0x0002: control=ME_COARSE_TUNING; break; #endif case 0x7F7F: /* RPN reset */ /* reset pitch bend sensitivity to 2 */ MIDIEVENT(d->at, ME_PITCH_SENS, lastchan, 2, 0); default: ctl->cmsg(CMSG_INFO, VERB_DEBUG, "(Data entry (MSB) for RPN %02x,%02x: %ld)", rpn_msb[lastchan], rpn_lsb[lastchan], b); break; } break; default: ctl->cmsg(CMSG_INFO, VERB_DEBUG, "(Control %d: %d)", a, b); break; } if (control != 255) { MIDIEVENT(d->at, control, lastchan, b, 0); } } break; case 4: /* Program change */ a &= 0x7f; MIDIEVENT(d->at, ME_PROGRAM, lastchan, a, 0); #ifdef tplus case 5: /* Channel pressure */ MIDIEVENT(d->at, ME_CHANNEL_PRESSURE, lastchan, a, 0); #else case 5: /* Channel pressure - NOT IMPLEMENTED */ break; #endif case 6: /* Pitch wheel */ #ifdef tplus if((i = tf_getc(d)) == EOF) { if(errno) ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "\"%s\": read_midi_event: %s", d->midi_name, strerror(errno)); else ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "Warning: \"%s\": Short midi file.", d->midi_name); return 0; } b = (uint8)i; #else fread(&b, 1,1, d->fp); #endif b &= 0x7F; MIDIEVENT(d->at, ME_PITCHWHEEL, lastchan, a, b); case 7: break; default: ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "*** Can't happen: status 0x%02X, channel 0x%02X", laststatus, lastchan); break; } } }