예제 #1
0
파일: scan.c 프로젝트: irrdnet/irrd
/* JMH - The serial number file is important only for mirrors
 *       and for authoritative databases.  If its not there, starting
 *	 from zero is fine.  This function could happily be void,
 *	 except that we can use it as a existance test for the file
 *	 and that it contains a valid u_long
 */
int scan_irr_serial (irr_database_t *database) {
  char tmp[BUFSIZE], file[BUFSIZE];
  FILE *fp;
  uint32_t serial = 0;
  int ret_code = 0;

  strcpy (tmp, database->name);
  convert_toupper (tmp);

  sprintf (file, "%s/%s.CURRENTSERIAL", IRR.database_dir, tmp);
  fp = fopen (file, "r");

  if (fp != NULL) {
    memset (tmp, 0, sizeof (tmp));
    if (fgets (tmp, sizeof (tmp), fp) != NULL) {
      if (convert_to_32 (tmp, &serial) == 1) {
	database->serial_number = serial;
	ret_code = 1;
      }
      else
        database->serial_number = 0;
    }
    fclose (fp);
  }

  return ret_code;
}
예제 #2
0
파일: scan.c 프로젝트: irrdnet/irrd
/* pick_off_secondary_fields
 * store some information like as_origin, communities,
 * and secondary indicie keys
 * Need some error checking added --ljb XXX
 */
void pick_off_secondary_fields (char *buffer, int curr_f, 
				irr_object_t *irr_object) {
  char *cp = buffer;
  char *tmpptr;
 
  switch (curr_f) {
  case ORIGIN:
    /* if origin already found, ignore continuation lines */
    if (irr_object->origin_found)
      break;
    whitespace_newline_remove(cp);
    cp += 2;
    /* Check for dots for now, can remove as asplain is standardized */
    if ( (tmpptr = strchr(cp,'.')) != NULL) {
      *tmpptr = 0;
      irr_object->origin = atoi(cp)*65536 + atoi(tmpptr + 1);
      *tmpptr = '.';
      irr_object->origin_found = 1;
    } else {
      if (convert_to_32(cp, &irr_object->origin) != 1) {
        irr_object->origin = 0; /* bogus value, need better handling */
      } else
        irr_object->origin_found = 1;
    }
    break;
  case NIC_HDL:
    whitespace_newline_remove(cp);
    irr_object->nic_hdl = strdup (cp);
    break;
  case PREFIX:	/* for IPv6 site objects */
    if (irr_object->ll_prefix == NULL) /* create list if it does not exist */
      irr_object->ll_prefix = LL_Create (LL_DestroyFunction, free, 0);
    whitespace_newline_remove(cp);
    LL_Add (irr_object->ll_prefix, strdup(cp));
    break;
  case MNT_BY:
    add_field_items (cp, &irr_object->ll_mnt_by);
    break;
  case MEMBER_OF:
  /* ROUTE, ROUTE6 and AUT-NUM member-of: scanning */
    add_field_items (cp, &irr_object->ll_mbr_of);
    break;
  case MEMBERS:
  case MP_MEMBERS:
  /* AS-SET, ROUTE-SET members: scanning */
    add_field_items (cp, &irr_object->ll_mbrs);
    break;
  case MBRS_BY_REF:
  /* AS-SET, ROUTE-SET mbrs-by-ref: scanning */
    add_field_items (cp, &irr_object->ll_mbr_by_ref);
    break;
  default:
    break;
  } 
}
예제 #3
0
static inline int _snd_ioctl32_pcm_hw_params(unsigned int fd, unsigned int cmd, unsigned long arg, struct file *file, unsigned int native_ctl)
{
	struct sndrv_pcm_hw_params32 *data32;
	struct sndrv_pcm_hw_params *data;
	mm_segment_t oldseg;
	int err;

	data32 = kmalloc(sizeof(*data32), GFP_KERNEL);
	data = kmalloc(sizeof(*data), GFP_KERNEL);
	if (data32 == NULL || data == NULL) {
		err = -ENOMEM;
		goto __end;
	}
	if (copy_from_user(data32, (void __user *)arg, sizeof(*data32))) {
		err = -EFAULT;
		goto __end;
	}
	memset(data, 0, sizeof(*data));
	convert_from_32(pcm_hw_params, data, data32);
	oldseg = get_fs();
	set_fs(KERNEL_DS);
	err = file->f_op->ioctl(file->f_dentry->d_inode, file, native_ctl, (unsigned long)data);
	set_fs(oldseg);
	if (err < 0)
		goto __end;
	err = 0;
	convert_to_32(pcm_hw_params, data32, data);
	if (copy_to_user((void __user *)arg, data32, sizeof(*data32)))
		err = -EFAULT;
	else
		recalculate_boundary(file);
      __end:
      	if (data)
      		kfree(data);
      	if (data32)
      		kfree(data32);
	return err;
}
예제 #4
0
파일: scan.c 프로젝트: irrdnet/irrd
/* Check for an 'ADD' or 'DEL' at the begining of the
 * mirror or update.  Also calls read_blank_line_input ()
 * to check for exactly one blank line and then start
 * of object. Scans for protocol version 3 serial numbers
 * Version 3 may skip serials
 *
 * Return:
 *   START_F if no errors.
 *   DB_EOF otherwise.
 */
int pick_off_mirror_hdr (FILE *fp, char *buf, int buf_size,
                         enum STATES state, enum STATES *p_save_state,
			 u_long *mode, u_long *position,
			 u_long *offset, irr_database_t *db) {

  uint32_t serial_num;

  if (!strncasecmp ("ADD", buf, 3))  {
    *mode = IRR_UPDATE;
  }
  else if (!strncasecmp ("DEL", buf, 3))  {
    *mode = IRR_DELETE;
  }
  else
    state = DB_EOF; /* no "ADD" or "DEL" so abort scan */

  if (state != DB_EOF && db->mirror_protocol == 3) {
    if (convert_to_32(buf+4, &serial_num) != 1) {
      trace (ERROR, default_trace,"Serial num conversion error: %s\n", buf+4);
      state = DB_EOF;
    } else if (serial_num > db->serial_number) {
      db->serial_number = serial_num - 1; /* protocol 3 may skip serials */
    } else {
      trace (ERROR, default_trace,"Serial num error -- value unexpected, current value: %d\n", db->serial_number);
      state = DB_EOF;
    }
  }

  if (state != DB_EOF) {
    state = read_blank_line_input (fp, buf, buf_size, state, p_save_state, position, offset, db);
  } else {
    trace (ERROR, default_trace,"scan.c: pick_off_mirror_hdr(): abort scan\n");
    trace (ERROR, default_trace,"line (%s)\n", buf);
  }

  return (state);
}