/* Copyright (c) 1998 Alexander Yukhimets. All rights reserved. */ #include #include #include #include #include #include"utils.h" #include"fileinfo.h" char* get_fileinfo_string(fileinfo* fi){ char *buf; if(!fi)return NULL; if(fi->link){ buf=WXmalloc(strlen(fi->name)+strlen(fi->link)+100); sprintf(buf,"%10.10s %3d %8.8s %8.8s %10ld %3.3s %2d %5.5s %s -> %s\n", fi->perms, fi->inode, fi->user, fi->group, fi->size, fi->month, fi->day, fi->time_year, fi->name, fi->link); } else { buf=WXmalloc(strlen(fi->name)+100); sprintf(buf,"%10.10s %3d %8.8s %8.8s %10ld %3.3s %2d %5.5s %s\n", fi->perms, fi->inode, fi->user, fi->group, fi->size, fi->month, fi->day, fi->time_year, fi->name); } return buf; } fileinfo* create_dummy_dir(char* name,fileinfo* next){ fileinfo* fi; fi=(fileinfo*)WXmalloc(sizeof(fileinfo)); strcpy(fi->perms,"d?????????"); fi->inode=0; fi->user=WXnewstring("unknown"); fi->group=WXnewstring("unknown"); fi->month[0]='\0'; fi->day=0; fi->time_year[0]='\0'; fi->date[0]='\0'; fi->size=0; fi->name=WXnewstring(name); fi->link=NULL; fi->next=next; return fi; } fileinfo* copy_fileinfo(fileinfo* orig){ fileinfo *fi; fi=(fileinfo*)WXmalloc(sizeof(fileinfo)); strncpy(fi->perms,orig->perms,11); fi->inode=orig->inode; fi->user=WXnewstring(orig->user); fi->group=WXnewstring(orig->group); fi->size=orig->size; strncpy(fi->month,orig->month,4); fi->day=orig->day; strncpy(fi->time_year,orig->time_year,6); fi->name=WXnewstring(orig->name); fi->link=WXnewstring(orig->link); strncpy(fi->date,orig->date,9); strncpy(fi->size_str,orig->size_str,20); strncpy(fi->time,orig->time,6); fi->next=NULL; return fi; } void destroy_fileinfo(fileinfo * fi){ if(fi==NULL)return; free(fi->user); free(fi->group); free(fi->name); free(fi->link); destroy_fileinfo(fi->next); free(fi); return; } void* error_out(fileinfo* fi){ destroy_fileinfo(fi); return NULL; } char* eatwhite(char* s,char* end){ while(s12)return -1; else return d-1; } fileinfo* create_nt_fileinfo(char* head){ char* end; char *tail; int len,i; fileinfo* fi; if((fi=malloc(sizeof(fileinfo)))==NULL){ perror("create_fileinfo"); exit(1); } fi->inode=0; fi->user=WXnewstring("unknown"); fi->group=WXnewstring("unknown"); fi->link=NULL; fi->name=NULL; fi->next=NULL; fi->time_year[0]='\0'; end=head+strlen(head); tail=head; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len<8)return error_out(fi); if(isdigit(head[0]) && isdigit(head[1]) && head[2]=='-'){ if((i=nt_month_index(head))<0) return error_out(fi); strcpy(fi->month,nt_month[i]); strncpy(&fi->date[4],head,2); } else return error_out(fi); head+=3; if(isdigit(head[0]) && isdigit(head[1]) && head[2]=='-'){ fi->day=atoi(head); strncpy(&fi->date[6],head,2); } else return error_out(fi); head+=3; if(isdigit(head[0]) && isdigit(head[1])){ len-=8; if(len==0){ strncpy(&fi->date[2],head,2); if(atoi(head)<50){/*2050 incompliance*/ strncpy(fi->date,"20",2); } else { strncpy(fi->date,"19",2); } } else if(len==2){ strncpy(fi->date,head,4); } else return error_out(fi); } else return error_out(fi); fi->date[8]='\0'; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len!=7 || head[2]!=':' || (head[6]!='m' && head[6]!='M')) return error_out(fi); if(head[5]=='p' || head[5]=='P'){ sprintf(fi->time,"%2d",atoi(head)+12); } else if(head[5]=='a' || head[5]=='A'){ strncpy(fi->time,head,2); } else return error_out(fi); head+=2; strncpy(&fi->time[2],head,3); fi->time[5]='\0'; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len==5 && (strncmp(head,"",5)==0 || strncmp(head,"",5)==0)){ strcpy(fi->perms,"d?????????"); fi->size=0; } else { for(i=0;iperms,"-?????????"); fi->size=atoi(head); } head=eatwhite(tail,end); if(*(end-1)=='\n'){ end--; if(*(end-1)=='\r')end--; } if((len=end-head)<=0) return error_out(fi); if((fi->name=malloc(len+1))==NULL){ perror("create_fileinfo"); exit(1); } strncpy(fi->name,head,len);fi->name[len]='\0'; return fi; } fileinfo* create_fileinfo(char* head){ char* end; char *tail,*newhead,*newtail; int len; fileinfo* fi; if((fi=malloc(sizeof(fileinfo)))==NULL){ perror("create_fileinfo"); exit(1); } fi->user=NULL; fi->group=NULL; fi->name=NULL; fi->link=NULL; fi->next=NULL; fi->date[0]='\0'; fi->time[0]='\0'; end=head+strlen(head); tail=head; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len!=10) return error_out(fi); strncpy(fi->perms,head,10);fi->perms[10]='\0'; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len==0) return error_out(fi); newhead=head; newtail=tail; newhead=eatwhite(newtail,end); newtail=getnext(newhead,end); len=newtail-newhead; if(len==0)error_out(fi); newhead=eatwhite(newtail,end); newtail=getnext(newhead,end); len=newtail-newhead; if(len==0)error_out(fi); newhead=eatwhite(newtail,end); newtail=getnext(newhead,end); len=newtail-newhead; if(len==0)error_out(fi); if(isdigit(newhead[0])){ fi->inode=atoi(head); head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; } else { fi->inode=0; } if(len==0) return error_out(fi); if((fi->user=malloc(len+1))==NULL){ perror("create_fileinfo"); exit(1); } strncpy(fi->user,head,len);fi->user[len]='\0'; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len==0) return error_out(fi); if((fi->group=malloc(len+1))==NULL){ perror("create_fileinfo"); exit(1); } strncpy(fi->group,head,len);fi->group[len]='\0'; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len==0) return error_out(fi); if(head[len-1] == ','){ fi->size=0; head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; } else { fi->size=atoi(head); } head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len<1) return error_out(fi); if(isdigit(*head)){ int i=nt_month_index(head); if(i<0) return error_out(fi); strcpy(fi->month,nt_month[i]); } else { if(len!=3) return error_out(fi); strncpy(fi->month,head,3);fi->month[3]='\0'; } head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len==0) return error_out(fi); fi->day=atoi(head); head=eatwhite(tail,end); tail=getnext(head,end); len=tail-head; if(len==0 || len>5) return error_out(fi); strncpy(fi->time_year,head,len);fi->time_year[len]='\0'; head=tail+1; if(len<=4 && isspace(*head))head++; if(*(end-1)=='\n'){ end--; if(*(end-1)=='\r')end--; } if((len=end-head)<=0) return error_out(fi); if(fi->perms[0]!='l'){ if((fi->name=malloc(len+1))==NULL){ perror("create_fileinfo"); exit(1); } strncpy(fi->name,head,len);fi->name[len]='\0'; } else { if(fi->size==0){ char* sym_off=strstr(head," -> "); if(sym_off !=NULL){ fi->size=end-sym_off-4; } } if(fi->size<=0 || (len-fi->size-4)<=0 || strncmp(end-fi->size-4," -> ",4)!=0) return error_out(fi); if((fi->link=malloc(fi->size+1))==NULL){ perror("create_fileinfo"); exit(1); } strncpy(fi->link,end-fi->size,fi->size);fi->link[fi->size]='\0'; if((fi->name=malloc(len-fi->size-3))==NULL){ perror("create_fileinfo"); exit(1); } strncpy(fi->name,head,len-fi->size-4);fi->name[len-fi->size-4]='\0'; } return fi; }