Пример #1
0
/* Generate the thread data we need for this group.  We must call
** thread_close() before calling this again.
*/
void
thread_open()
{
    if (!msgid_hash)
	msgid_hash = hashcreate(201, msgid_cmp); /*TODO: pick a better size */
    if (ThreadedGroup) {
	/* Parse input and use msgid_hash for quick article lookups. */
	/* If cached but not threaded articles exist, set up to thread them. */
	if (first_subject) {
	    first_cached = firstart;
	    last_cached = firstart - 1;
	    parsed_art = 0;
	}
    }

    if (sel_mode == SM_ARTICLE)
	set_selector(sel_mode, sel_artsort);
    else
	set_selector(sel_threadmode, sel_threadsort);

#ifdef USE_MT
    if (try_mt && !first_subject)
	if (!mt_data())
	    return;
#endif
#ifdef USE_OV
    if (try_ov && first_cached > last_cached)
	if (thread_always)
	    (void) ov_data(absfirst, lastart, FALSE);
	else if (firstart > lastart) {
	    /* If no unread articles, see if ov. exists as quick as possible */
	    (void) ov_data(absfirst, absfirst, FALSE);
	    first_cached = last_cached+1;
	} else
	    (void) ov_data(firstart, lastart, FALSE);
#endif
#ifdef USE_NNTP
    if (!ov_opened)
	setmissingbits();
#endif

    if (last_cached > lastart) {
	toread[ng] += (ART_UNREAD)(last_cached-lastart);
	/* ensure getngsize() knows the new maximum */
	ngmax[ng] = lastart = last_cached;
    }
    thread_grow();	/* thread any new articles not yet in the database */
    added_articles = 0;
    sel_page_sp = 0;
    sel_page_app = 0;
}
Пример #2
0
//--------------------------------------------------------------------------
static void load_subspaces(linput_t *li, header &h, long fpos, int n)
{
  if ( !n ) return;
  char buf[MAXSTR];
  for ( int i=0; i < n; i++ )
  {
    subspace_dictionary_record sr;
    qlseek(li, fpos + i*sizeof(sr));
    lread(li, &sr, sizeof(sr));
    sr.swap();

    if ( !sr.is_loadable() || !sr.subspace_length ) continue;
    if ( sr.fixup_request_quantity ) complain_fixup();
    ea_t start = sr.subspace_start;
    ea_t end = start + sr.initialization_length;
    file2base(li, sr.file_loc_init_value, start, end, FILEREG_PATCHABLE);
    end = start + sr.subspace_length;
    char *name = get_space_name(li, h, sr.name.n_strx, buf, sizeof(buf));
    set_selector(i, 0);
    const char *sclass = strstr(name, "CODE") ? CLASS_CODE : CLASS_DATA;
    add_segm(i, start, end, name, sclass);

    if ( i == first_text_subspace_idx )
      first_text_subspace_fpos = sr.file_loc_init_value;
//    sr.alignment,
  }
}
Пример #3
0
//-----------------------------------------------------------------------
static void show_extdefs(linput_t *li, uint32 offset, uint32 length)
{
  if ( offset == 0 || length == 0 ) return;
  qlseek(li, offset);

  inf.specsegs = 1;
  int segsize = 4 * h.num_externals;
  sel_t sel = h.num_segs+1;
  set_selector(sel, 0);
  xea = freechunk(inf.maxEA, segsize, -15);
  add_segm(sel, xea, xea+segsize, "XTRN", "XTRN");
  set_segm_addressing(getseg(xea), true);

  int n = 0;
  for ( int i=0; i < length; n++ )
  {
    extdef p;
    const int size = offsetof(extdef, allocate_len);
    lread(li, &p, size);
    p.allocate_len.len_4 = 0;
    if ( p.allocate )
    {
      ask_for_feedback("extdef.allocate\n");
      lread(li, &p.allocate_len.len_4, sizeof(p.allocate_len.len_4));
    }
    int nlen = read_pstring(li, p.sym_name, sizeof(p.sym_name));
    i += size + 1 + nlen;

    ea_t a = xea + 4*n;
    set_name(a, p.sym_name);
    if ( p.allocate )
      put_long(a, p.allocate_len.len_4);
  }
}
Пример #4
0
//-----------------------------------------------------------------------
static void show_segdefs(linput_t *li, uint32 offset, uint32 length)
{
  if ( offset == 0 || length == 0 ) return;
  qlseek(li, offset);
  int n = 0;
  for ( int i=0; i < length; )
  {
    segdef s;
    const int size = offsetof(segdef, combine_name);
    lread(li, &s, size);
    int nlen = read_pstring(li, s.combine_name, sizeof(s.combine_name));
    i += size + 1 + nlen;
    n++;

    const char *sname = s.combine_name;
    const char *sclas = sname;
    if ( strnicmp(sname, "CODE", 4) == 0 ) sclas = "CODE";
    if ( strnicmp(sname, "DATA", 4) == 0 ) sclas = "DATA";
    if ( strnicmp(sname, "CONST", 5) == 0 ) sclas = "CONST";
    if ( stricmp(sname, "STACK") == 0 ) sclas = "STACK";
    if ( strchr(sname, ':') != NULL ) continue;

    int segsize = s.slimit + 1;
    if ( strcmp(sname, "DATA") == 0 ) dsel = n;
    set_selector(n, 0);
    ea_t ea = freechunk(inf.maxEA, segsize, -(1<<s.align));
    add_segm(n, ea, ea+segsize, sname, sclas);
    set_segm_addressing(getseg(ea), true);
    if ( strcmp(sclas, "STACK") == 0 )
      doByte(ea, segsize);
  }
}
Пример #5
0
//--------------------------------------------------------------------------
// Create a section.
static void create_section(ushort sel, ea_t startEA, ea_t endEA,
                                   const char *name, const char *classname)
{
  set_selector(sel, 0);
  if( !add_segm(sel, startEA, endEA, name, classname) )
    loader_failure();
  segment_t *s = getseg(startEA);
  set_arm_segm_flags(startEA, 2 << 10); // alignment
  s->update();
}
Пример #6
0
void
build_cache()
{
    if (cached_ng == ng && cached_absfirst == absfirst
     && time((time_t*)NULL) < cached_time + 6*60*60L) {
	grow_cache(lastart);
	rc_to_bits();
	if (sel_mode == SM_ARTICLE)
	    set_selector(sel_mode, sel_artsort);
	else
	    set_selector(sel_threadmode, sel_threadsort);
	thread_grow();
	return;
    }

    close_cache();

    cached_ng = ng;
    cached_absfirst = absfirst;
    cached_time = time((time_t*)NULL);
    cached_cnt = lastart-absfirst+2 + 5;
    article_list = (ARTICLE*)
	safemalloc((MEM_SIZE)(cached_cnt * sizeof (ARTICLE)));
    bzero((char*)article_list, cached_cnt * sizeof (ARTICLE));
    subj_hash = hashcreate(201, subject_cmp);	/*TODO: pick a better size */

    rc_to_bits();			/* sets firstart */
    first_cached = thread_always? absfirst : firstart;
    last_cached = first_cached-1;
    cached_all_in_range = FALSE;
#ifdef PENDING
    subj_to_get = xref_to_get = firstart;
#endif
#ifndef USE_NNTP
    setmissingbits();
#endif

    /* Cache as much data in advance as possible, possibly threading
    ** articles as we go. */
    thread_open();
}
Пример #7
0
//----------------------------------------------------------------------
static void process_loader(char *ptr, pef_section_t *sec, int nsec) {
  int i;
  pef_loader_t &pl = *(pef_loader_t *)ptr;
  pef_library_t *pil = (pef_library_t *)(&pl + 1);
  swap_pef_loader(pl);
  uint32 *impsym = (uint32 *)(pil + pl.importLibraryCount);
  pef_reloc_header_t *prh =
                (pef_reloc_header_t *)(impsym + pl.totalImportedSymbolCount);
  uint16 *relptr = (uint16 *)(ptr + pl.relocInstrOffset);
  uint32 *hash = (uint32 *)(ptr + pl.exportHashOffset);
  uint32 hashsize = (1 << pl.exportHashTablePower);
  uint32 *keytable = hash + hashsize;
  pef_export_t *pe = (pef_export_t *)(keytable + pl.exportedSymbolCount);
#if !__MF__
  for ( i=0; i < pl.importLibraryCount; i++ )
    swap_pef_library(pil[i]);
  for ( i=0; i < pl.relocSectionCount; i++ )
    swap_pef_reloc_header(prh[i]);
  for ( i=0; i < pl.exportedSymbolCount; i++ )
    swap_pef_export(pe[i]);
#endif
  char *stable = ptr + pl.loaderStringsOffset;

  if ( pl.totalImportedSymbolCount != 0 ) {
    uint32 size = pl.totalImportedSymbolCount*4;
    ea_t undef = freechunk(inf.maxEA, size, -0xF);
    ea_t end = undef + size;
    set_selector(nsec+1, 0);
    if(!add_segm(nsec+1, undef, end, "IMPORT", "XTRN")) loader_failure();

    for ( i=0; i < pl.importLibraryCount; i++ ) {
      ea_t ea = undef + 4*pil[i].firstImportedSymbol;
      add_long_cmt(ea, 1, "Imports from library %s", stable+pil[i].nameOffset);
      if ( pil[i].options & PEF_LIB_WEAK )
        add_long_cmt(ea, 1, "Library is weak");
    }

    inf.specsegs = 1;
    for ( i=0; i < pl.totalImportedSymbolCount; i++ ) {
      uint32 sym = mflong(impsym[i]);
      uchar sclass = uchar(sym >> 24);
      ea_t ea = undef+4*i;
      set_name(ea, get_impsym_name(stable,impsym,i));
      if ( (sclass & kPEFWeak) != 0 ) make_name_weak(ea);
      doDwrd(ea,4);
      put_long(ea, 0);
      impsym[i] = (uint32)ea;
    }
  }
Пример #8
0
void idaapi load_file(linput_t *fp, ushort neflag, const char * /*fileformatname*/)
{
  // Hello here I am
  msg("---------------------------------------\n");
  msg("Nintendo REL Loader Plugin 0.1\n");
  msg("---------------------------------------\n");

  // we need PowerPC support to do anything with rels
  if (ph.id != PLFM_PPC)
    set_processor_type("PPC", SETPROC_ALL | SETPROC_FATAL);

  set_compiler_id(COMP_GNU);

  rel_track track(fp);
  inf.beginEA = START;

  // map selector 1 to 0
  set_selector(1, 0);



  track.apply_patches();
}
Пример #9
0
uint8_t scan_line(uint8_t selector) {
	set_selector(selector);
	_delay_us(100);
	return(read_keys());
}
Пример #10
0
char *wd_filemask(const char *mask)
{
	int button;
	int i;
	XDINFO info;
	boolean stop = FALSE, redraw, dc, ok;
	FTYPE *f;
	SNAME name, newmask;			/* HR 240203 */
	char *result;
	SLIDER sl;

	sl.type = 1;
	sl.up_arrow = FTUP;
	sl.down_arrow = FTDOWN;
	sl.slider = FTSLIDER;
	sl.sparent = FTSPAR;
	sl.lines = NLINES;
	sl.n = cnt_types();
	sl.line = 0;
	sl.set_selector = set_selector;
	sl.first = FTYPE1;
	sl.findsel = find_selected;

	/* DjV 004 290103 ---vvv--- */
	if ( mask == NULL )
	{
		setmask[FILETYPE].ob_state |= DISABLED;
		*setmask[FILETYPE].ob_spec.tedinfo->te_ptext = 0;
	}		
	else
	{
	/* DjV 004 290103 ---^^^--- */
		cv_fntoform(setmask + FILETYPE, mask);			/* HR 240103 */
		setmask[FILETYPE].ob_state &= ~DISABLED;	/* DjV 004 290103 */
	}												/* DjV 004 290103 */

	/* DjV 004 020103 Put file attributes buttons into right state */
	set_opt( setmask, options.attribs, FA_HIDDEN, MSKHID );
	set_opt( setmask, options.attribs, FA_SYSTEM, MSKSYS );
	set_opt( setmask, options.attribs, FA_SUBDIR, MSKDIR );
	set_opt( setmask, options.attribs, FA_PARDIR, MSKPAR );

	sl_init(setmask, &sl);

	xd_open(setmask, &info);

	while (stop == FALSE)
	{
		redraw = FALSE;

		button = sl_form_do(setmask, FILETYPE, &sl, &info);
		dc = (button & 0x8000) ? TRUE : FALSE;
		button &= 0x7FFF;

		if ((button < FTYPE1) || (button > FTYPE4))
		{
			switch (button)
			{
			case FTADD:
				name[0] = 0;

				if (filetype_dialog(name) == TRUE)
				{
					add(name);
					sl.n = cnt_types();
					redraw = TRUE;
					sl_set_slider(setmask, &sl, &info);
				}
				break;
			case FTDELETE:
				i = find_selected() + sl.line;
				if ((f = get_item(i)) != NULL)
				{
					rem(f);
					sl.n = cnt_types();
					redraw = TRUE;
					sl_set_slider(setmask, &sl, &info);
				}
				break;
			default:
				ok = (button == FTOK) ? TRUE : FALSE;
				stop = TRUE;
				break;
			}
			xd_change(&info, button, NORMAL, (stop == FALSE) ? 1 : 0);
		}
		else if ( button >= MSKHID && button <= MSKPAR )
		{
			/* DjV 004 020103 do nothing until exit */	
		}		
		else
		{
			strcpy(filetype, setmask[button].ob_spec.tedinfo->te_ptext);
			xd_draw(&info, FILETYPE, 1);
			if (dc == TRUE)
			{
				ok = TRUE;
				stop = TRUE;
			}
		}

		if (redraw == TRUE)
			set_selector(&sl, TRUE, &info);
	}

	xd_close(&info);

	if (ok == TRUE)
	{
		/* DjV 004 030103 ---vvv--- */
		get_opt( setmask, &options.attribs, FA_HIDDEN, MSKHID );
		get_opt( setmask, &options.attribs, FA_SYSTEM, MSKSYS );
		get_opt( setmask, &options.attribs, FA_SUBDIR, MSKDIR ); /* DjV 004 280103 wrongly was MSKHID */ 
		get_opt( setmask, &options.attribs, FA_PARDIR, MSKPAR );
		/* DjV 004 020103 ---^^^--- */

		if ( mask == NULL )		/* DjV 004 290103 */
			return NULL;		/* DjV 004 290103 */
		else					/* DjV 004 290103 */
		{						/* DjV 004 290103 */
			cv_formtofn(newmask, filetype);
			if ((result = malloc(strlen(newmask) + 1)) != NULL)
				strcpy(result, newmask);
			else
				xform_error(ENSMEM);
			return result;
		}						/* DjV 004 290103 */
	}
	else
		return NULL;
}
int check_mixer_ioctls(int fd_mixer)
{
	int nb_err, err = 0;
	int ret, val;

	ret = ioctl(fd_mixer, SOUND_MIXER_READ_DEVMASK, &val);
	if (ret != 0) {
		DPRINTF
		    ("Returned Value Error with IOCTL SOUND_MIXER_READ_DEVMASK %d\n",
		     ret);
		err++;
	}
#ifdef CONFIG_MX21ADS
	if (val != (SOUND_MASK_VOLUME | SOUND_MASK_LINE | SOUND_MASK_MIC)) {
#else
	if (val != (SOUND_MASK_VOLUME | SOUND_MASK_PCM | SOUND_MASK_SPEAKER |
		    SOUND_MASK_PHONEOUT | SOUND_MASK_LINE |
		    SOUND_MASK_PHONEIN | SOUND_MASK_MIC)) {
#endif
		DPRINTF("Error with IOCTL SOUND_MIXER_READ_DEVMASK %x\n", val);
		err++;
	}

	ret = ioctl(fd_mixer, SOUND_MIXER_READ_RECMASK, &val);
	if (ret != 0) {
		DPRINTF
		    ("Returned Value Error with IOCTL SOUND_MIXER_READ_RECMASK\n");
		err++;
	}
#ifdef CONFIG_MX21ADS
	if (val != (SOUND_MASK_LINE | SOUND_MASK_MIC)) {
#else
	if (val != (SOUND_MASK_LINE | SOUND_MASK_PHONEIN | SOUND_MASK_MIC)) {
#endif
		DPRINTF("Error with IOCTL SOUND_MIXER_READ_RECMASK %x\n", val);
		err++;
	}

	ret = ioctl(fd_mixer, SOUND_MIXER_READ_OUTMASK, &val);
	if (ret != 0) {
		DPRINTF
		    ("Returned Value Error with IOCTL SOUND_MIXER_READ_OUTMASK\n");
		err++;
	}
#ifdef CONFIG_MX21ADS
	if (val != SOUND_MASK_VOLUME) {
#else
	if (val != (SOUND_MASK_VOLUME | SOUND_MASK_PCM | SOUND_MASK_SPEAKER
		    | SOUND_MASK_PHONEOUT)) {
#endif
		DPRINTF("Error with IOCTL SOUND_MIXER_READ_OUTMASK\n");
		err++;
	}

	ret = ioctl(fd_mixer, SOUND_MIXER_READ_STEREODEVS, &val);
	if (ret != 0) {
		DPRINTF
		    ("Returned Value Error with IOCTL SOUND_MIXER_READ_STEREODEVS\n");
		err++;
	}
#ifdef CONFIG_MX21ADS
	if (val != (SOUND_MASK_VOLUME | SOUND_MASK_LINE)) {
#else
	if (val != (SOUND_MASK_VOLUME | SOUND_MASK_PHONEIN | SOUND_MASK_PCM)) {
#endif
		DPRINTF("Error with IOCTL SOUND_MIXER_READ_STEREODEVS\n");
		err++;
	}

	ret = ioctl(fd_mixer, SOUND_MIXER_READ_CAPS, &val);
	if (ret != 0) {
		DPRINTF
		    ("Returned Value Error with IOCTL SOUND_MIXER_READ_CAPS\n");
		err++;
	}

	if (val != SOUND_CAP_EXCL_INPUT) {
		DPRINTF("Error with IOCTL SOUND_MIXER_READ_CAPS\n");
		err++;
	}

	ret = ioctl(fd_mixer, SOUND_MIXER_READ_RECSRC, &val);
	if (ret != 0) {
		DPRINTF
		    ("Returned Value Error with IOCTL SOUND_MIXER_READ_RECSRC\n");
		err++;
	}
#ifdef CONFIG_MX21ADS
	if ((val != SOUND_MASK_LINE) && (val != SOUND_MASK_MIC)) {
#else
	if ((val != SOUND_MASK_LINE) && (val != SOUND_MASK_PHONEIN) &&
	    (val != SOUND_MASK_MIC)) {
#endif
		DPRINTF("Error with IOCTL SOUND_MIXER_READ_RECSRC\n");
		err++;
	}

	/** Input source selection and volume control */
#ifndef CONFIG_MX21ADS
	nb_err = set_input_device(fd_mixer, SOUND_MASK_PHONEIN);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_RECSRC (SOUND_MASK_PHONEIN)\n");
		err += nb_err;
	}
#endif

	nb_err = set_input_device(fd_mixer, SOUND_MASK_LINE);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_RECSRC (SOUND_MASK_LINE)\n");
		err += nb_err;
	}

	nb_err = set_input_device(fd_mixer, SOUND_MASK_MIC);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_RECSRC (SOUND_MASK_MIC)\n");
		err += nb_err;
	}
#ifndef CONFIG_MX21ADS
	nb_err = set_input_device(fd_mixer, SOUND_MASK_PHONEIN);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_RECSRC (SOUND_MASK_PHONEIN)\n");
		err += nb_err;
	}
#endif

#ifndef CONFIG_MX21ADS
	nb_err = set_input_device(fd_mixer, SOUND_MASK_PHONEIN);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_RECSRC (SOUND_MASK_PHONEIN)\n");
		err += nb_err;
	}
#endif

	/** Output source selection and volume control */
	nb_err = set_output_device(fd_mixer, SOUND_MASK_VOLUME);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_OUTSRC (SOUND_MASK_VOLUME) \n");
		err += nb_err;
	}
#ifndef CONFIG_MX21ADS
	nb_err = set_output_device(fd_mixer, SOUND_MASK_PCM);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_OUTSRC (SOUND_MASK_PCM)\n");
		err += nb_err;
	}
#endif

#ifndef CONFIG_MX21ADS
	nb_err = set_output_device(fd_mixer, SOUND_MASK_SPEAKER);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_OUTSRC (SOUND_MASK_SPEAKER)\n");
		err += nb_err;
	}
#endif

#ifndef CONFIG_MX21ADS
	nb_err = set_output_device(fd_mixer, SOUND_MASK_PHONEOUT);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_OUTSRC (SOUND_MASK_PHONEOUT)\n");
		err += nb_err;
	}
#endif

	nb_err = set_output_device(fd_mixer, SOUND_MASK_VOLUME);
	if (nb_err) {
		DPRINTF
		    ("Error with IOCTL SOUND_MIXER_WRITE_OUTSRC (SOUND_MASK_VOLUME)\n");
		err += nb_err;
	}

	return err;
}

/*! Supposes that StDac is selected. Selects all output lines */
int setup_sound_driver(int fd_audio)
{
	int err = 0;

	err += set_selector(fd_audio, SOUND_MASK_VOLUME | SOUND_MASK_PCM |
			    SOUND_MASK_SPEAKER | SOUND_MASK_PHONEOUT);

	return err;
}

int main(int ac, char *av[])
{
	int fd_audio, fd_mixer;
	int err = 0;

	DPRINTF("Hi... \n");

	if (ac == 1) {
		DPRINTF
		    ("This program checks that IOCTLs are correctly implemented \n");
		DPRINTF(" --> main <no_arg>\n\n");
	}

	if ((fd_audio = open("/dev/sound/dsp1", O_WRONLY)) < 0) {
		DPRINTF("Error opening /dev/dsp\n");
		return 0;
	}
	if ((fd_mixer = open("/dev/sound/mixer", O_RDWR)) < 0) {
		DPRINTF("Error opening /dev/mixer\n");
		return 0;
	}

	if (setup_sound_driver(fd_audio)) {
		return 1;
	}

/*************************************** MIXER IOCTLs ****************************************/
	err += check_mixer_ioctls(fd_mixer);

/*************************************** AUDIO IOCTLs ****************************************/
	err += check_audio_ioctls(fd_audio);

/*************************************** END ****************************************/
	close(fd_audio);
	close(fd_mixer);

	if (!err) {
		printf("All tests passed with success\n");
	} else {
		printf("Encountered %d errors\n", err);
	}

	return 0;
}
Пример #12
0
static void iret() {
	set_selector(&cs, RPL_USER, SEG_USER_CODE);
	set_selector(&ss, RPL_USER, SEG_USER_DATA);
}
Пример #13
0
void do_irq() {
	set_selector(&ss, RPL_KERNEL, SEG_KERNEL_DATA);
	set_selector(&cs, RPL_KERNEL, SEG_KERNEL_CODE);
	/* now the system is in kernel mode */
}