I'm trying to put in the objsave save patch by Hess, from the ftp site. It
compiles just fine but I get a segmentation fault when I log on. Anyone
familiar with this patch?
I am using patch 11 circle it may be that the patch was written for an
earlier version.
Here is a gdb backtrace.
gdb trace:
#0 0x30818 in perform_put (ch=0x2f8c10, obj=0x2fbca8, cont=0x0)
at act.item.c:34
#1 0x7ca94 in read_obj_pos (ch=0x2f8c10) at objsave.c:928
#2 0x70084 in nanny (d=0x2f7f40, arg=0xeffff750 "1") at interpreter.c:1573
#3 0x19d9c in game_loop (mother_desc=3) at comm.c:595
#4 0x18f60 in init_game (port=6666) at comm.c:242
#5 0x18eac in main (argc=3, argv=0xeffffdec) at comm.c:212
The error occurs when the function perform_put is called
from read_obj_pos (a new function for the patch now in objsave.c).
CRASH LOCATION IS AT ARROW
void perform_put(struct char_data * ch, struct obj_data * obj,
struct obj_data * cont)
{
extern int read_obj;
if (GET_OBJ_WEIGHT(cont) + GET_OBJ_WEIGHT(obj) > GET_OBJ_VAL(cont, 0)) <-
act("$p won't fit in $P.", FALSE, ch, obj, cont, TO_CHAR);
else {
obj_from_char(obj);
Here is the code that called the above function:
PERFORM_PUT CALLED AT ARROW
void read_obj_pos(struct char_data *ch)
{
char fn[40];
FILE *obj_file;
struct objpos_data op;
struct obj_data *obj,*obj2,*obj3;
int container,found;
int perform_wear(struct char_data *ch,struct obj_data *obj, int where);
void perform_put(struct char_data *ch,struct obj_data *obj, struct
obj_data *cont);
read_obj = TRUE;
if(!get_filename(GET_NAME(ch), fn, OBJPOS_FILE)){
sprintf(buf2, "Cannot get file for PLAYER %s in read_obj_pos()",
GET_NAME(ch));
log(buf2);
send_to_char("There is a problem loading your ITEMS IN PLACE.\r\n"
"Please contact a god and report this.\r\n", ch);
read_obj = FALSE;
return;
}
if(!(obj_file = fopen(fn, "rb"))){
read_obj = FALSE;
return;
}
fread((char *)&op, 1, sizeof(struct objpos_data), obj_file);
obj = ch->carrying;
/* Handle Equipment */
while((!(feof(obj_file)) && (op.position > INVENTORY)) &&
(!op.in_object)){
perform_wear( ch, obj, op.position );
obj = obj->next;
fread((char *)&op, 1, sizeof(struct objpos_data), obj_file);
while(!(feof(obj_file))){
if( op.in_object) {
if( op.position > INVENTORY )
---> perform_put( ch, obj, ch->equipment[op.position]); <-- here
else{
container = 0;
found = FALSE;
for( obj2 = ch->carrying; obj2 && !found; obj2 =
obj2->next_content)
if( GET_OBJ_TYPE(obj2) == ITEM_CONTAINER ){
container++;
if(container == op.container)
found = TRUE;
obj3 = obj2;
}
perform_put( ch, obj, obj3);
}
while(!(feof(obj_file))){
if( op.in_object) {
if( op.position > INVENTORY )
perform_put( ch, obj, ch->equipment[op.position]); <--line 928
+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://cspo.queensu.ca/~fletcher/Circle/list_faq.html |
+-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST