/* 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; }
/* 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; } }
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; }
/* 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); }