⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prefer~1.cpp

📁 一百个病毒的源代码 包括熊猫烧香等 极其具有研究价值
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*	preferences.cpp*/#define _GNU_SOURCE#include <errno.h>#include <stdio.h>#include <syslog.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include "mail_process.h"#include "preferences.h"#include "main.h"#include "config.h"#include "addr.h"#include "custom_string.h"#include "session.h"pref_t user_pref;enum pref_status { ps_pending, ps_done, ps_error, ps_nl, ps_addr, ps_sig };int fill_user_pref_struct(FILE*);pref_status parse_pref_line(char*, pref_status);int find_addr_book_start(FILE*);long int find_next_email_order(FILE*, char*, char*);int find_email_position(FILE*, char*, char*, long int*, long int*);int get_reply_to(void);////////////////////////////////////////////////////////////////////This will create and fill the user_preferences struct//   returns 0 on success//   returns -1 on failureint get_user_pref(void){   FILE* user_pref_file=NULL;   int status=0;   if(user_ses.loginname == NULL)      return(-1);   init_user_pref();   setuid(euid);   user_pref_file=open_user_pref_file("r",&status);   setuid(ruid);   if(user_pref_file == NULL)   {      if(status == 0)      {         user_pref_file=open_user_pref_file("w+",&status);         if(user_pref_file == NULL)            syslog(LOG_MAIL | LOG_ERR,"user preference file creation "                   "failed (%s)",strerror(errno));      }   }   if(user_pref_file != NULL)   {      fill_user_pref_struct(user_pref_file);      fclose(user_pref_file);   }   if(user_pref.reply_to.email == NULL)      get_reply_to();   return(0);}////////////////////////////////////////////////////////////////////This will open the users preference file//   returns file stream if open successful//   returns null if failFILE* open_user_pref_file(char* open_mode, int* err){   char* user_pref_filename=NULL;   FILE* user_pref_file=NULL;   size_t file_name_length=0;   mode_t old_mask=0;   if(user_ses.loginname == NULL || open_mode == NULL)      return(NULL);   if(err != NULL)      *err=0;   file_name_length=sizeof(PREFDIR "/")+			strlen(user_ses.loginname);   if( (user_pref_filename=(char*) malloc(file_name_length)) == NULL)   {      syslog(LOG_MAIL | LOG_ERR,"Out of memory (%s)",strerror(errno));      if(err != NULL)         *err=-1;      return(NULL);   }   strcpy(user_pref_filename,PREFDIR "/" );   strcat(user_pref_filename,user_ses.loginname);   old_mask=umask(0177);   setuid(euid);   user_pref_file=fopen(user_pref_filename,open_mode);   setuid(ruid);   if(user_pref_file == NULL)   {      if(err != NULL)      {         if(errno == ENOENT)            *err=0;         else            *err=-1;      }       umask(old_mask);      syslog(LOG_MAIL | LOG_ERR,"could not open %s pref file (%s)",				user_ses.loginname,strerror(errno));      free(user_pref_filename);      return(NULL);   }   umask(old_mask);   free(user_pref_filename);   return(user_pref_file);}////////////////////////////////////////////////////////////////////This will fill a user_preference structureint fill_user_pref_struct(FILE* user_pref_file){   char* file_buff=NULL;   size_t file_buff_size=0;   ssize_t b_read=0;   pref_status status=ps_pending;   if(user_pref_file == NULL)      return(-1);   do   {      b_read=getline(&file_buff, &file_buff_size, user_pref_file);      if(b_read > 0 && file_buff != NULL)         status=parse_pref_line(file_buff, status);      else         status=ps_done;   }   while(status != ps_error && status != ps_done);   if(file_buff != NULL)      free(file_buff);   return(0);}//////////////////////////////////////////////////////////////////pref_status parse_pref_line(char* buff, pref_status status){   char* temp_ptr=NULL;   char* temp_ptr2=NULL;   size_t temp_size=0;   int x=0;   if(buff == NULL)      return(ps_error);   if(*buff == '\n')      return(ps_nl);   if(status == ps_addr && *buff == '\t')   {      if( (inc_addr(&(user_pref.addr))) != 0)         return(ps_error);      for(x=0; user_pref.addr[x].name || user_pref.addr[x].email; x++);      fill_addr(&(user_pref.addr[x]),buff);      return(ps_addr);   }   if(status == ps_sig && *buff == '\t')   {      temp_size=0;      temp_size=strlen(buff+1)+1;      if(user_pref.signature != NULL)         temp_size+=strlen(user_pref.signature);      if( (temp_ptr2=(char*)realloc(user_pref.signature,temp_size)) == NULL)      {         syslog(LOG_MAIL | LOG_ERR,"Out of memory (%s)",strerror(errno));         return(ps_error);      }      if(user_pref.signature == NULL)         *temp_ptr2='\0';      user_pref.signature=temp_ptr2;      strcat(user_pref.signature,buff+1);      return(ps_pending);   }   if(strncmp(buff,"signature",sizeof("signature")-1) == 0)      return(ps_sig);   if(strncmp(buff,"address_book(main)",sizeof("address_book(main)")-1) == 0)      return(ps_addr);   if(strncmp(buff,"reply_to",sizeof("reply_to")-1) == 0)   {      if(user_pref.reply_to.name != NULL || user_pref.reply_to.email != NULL)         return(ps_pending);      temp_ptr=strchr(buff,'=');      if(temp_ptr == NULL)         return(ps_error);      temp_ptr++;      fill_addr( &(user_pref.reply_to), temp_ptr);      return(ps_pending);   }   if(strncmp(buff,"default_sort",sizeof("default_sort")-1) == 0)   {      temp_ptr=strchr(buff,'=');      if(temp_ptr == NULL)      {         syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s"			" (invalid default_sort)",user_ses.loginname);         return(ps_pending);      }      if(user_pref.sort_by != ms_none)      {         syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s"			" (duplicate default_sort)",user_ses.loginname);         return(ps_pending);      }      if(strncmp(temp_ptr,"date_a",sizeof("date_a")-1) == 0)         user_pref.sort_by=ms_date_a;      else if(strncmp(temp_ptr,"date_d",sizeof("date_d")-1) == 0)         user_pref.sort_by=ms_date_d;      else if(strncmp(temp_ptr,"sender_a",sizeof("sender_a")-1) == 0)         user_pref.sort_by=ms_sender_a;      else if(strncmp(temp_ptr,"sender_d",sizeof("sender_d")-1) == 0)         user_pref.sort_by=ms_sender_d;      else if(strncmp(temp_ptr,"size_a",sizeof("size_a")-1) == 0)         user_pref.sort_by=ms_size_a;      else if(strncmp(temp_ptr,"size_d",sizeof("size_d")-1) == 0)         user_pref.sort_by=ms_size_d;      else if(strncmp(temp_ptr,"subject_a",sizeof("subj_a")-1) == 0)         user_pref.sort_by=ms_subj_a;      else if(strncmp(temp_ptr,"subj_d",sizeof("subject_d")-1) == 0)         user_pref.sort_by=ms_subj_d;      else         syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s"			" (invalid default_sort)",user_ses.loginname);      return(ps_pending);   }   if(strncmp(buff,"cookie",sizeof("cookie")-1 ) == 0)   {      temp_ptr=strchr(buff,'=');      if(temp_ptr!=NULL)         temp_ptr2=strchr(temp_ptr,';');      if(temp_ptr == NULL || temp_ptr2 == NULL)      {         syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s"			" (invalid cookie defination)",user_ses.loginname);         return(ps_pending);      }            *temp_ptr2='\0';      temp_ptr2++;      user_pref.cookie_expire=strtol(temp_ptr,NULL,10);      temp_ptr=strchr(temp_ptr2,'\n');      if(temp_ptr != NULL)         *temp_ptr='\0';      user_pref.cookie_crypt=strdup(temp_ptr2);      return(ps_pending);   }   return(ps_pending);}//////////////////////////////////////////////////////////////////int init_user_pref(void){   user_pref.addr=NULL;   user_pref.reply_to.name=NULL;   user_pref.reply_to.email=NULL;   user_pref.sort_by=ms_date_a;   user_pref.signature=NULL;   user_pref.cookie_expire=0;   user_pref.cookie_crypt=NULL;   return(0);}//////////////////////////////////////////////////////////////////int destroy_user_pref(void){   if(user_pref.addr != NULL)      destroy_addr_arr(&(user_pref.addr));   if(user_pref.reply_to.name != NULL)   {      free(user_pref.reply_to.name);      user_pref.reply_to.name=NULL;   }   if(user_pref.reply_to.email != NULL)   {      free(user_pref.reply_to.email);      user_pref.reply_to.email=NULL;   }   if(user_pref.signature != NULL)   {      free(user_pref.signature);      user_pref.signature=NULL;   }   if(user_pref.cookie_crypt != NULL)   {      free(user_pref.cookie_crypt);      user_pref.cookie_crypt=NULL;   }   return(0);}//////////////////////////////////////////////////////////////////int add_pref_email(FILE* file, char* name, char* email){   long int file_ptr=-1;   char* buff=NULL;   size_t buff_size=0;   if(file == NULL || email == NULL)      return(-1);//create address string   if(name != NULL)      buff_size=strlen(name);   buff_size+=strlen(email) + sizeof("\t\"\" <>\n");   buff=(char*)malloc(buff_size);   if(buff == NULL)   {      syslog(LOG_MAIL | LOG_ERR,"out of memory (%s)",strerror(errno));      return(-1);   }   strcpy(buff,"\t\"");   if(name != NULL)      strcat(buff,name);   strcat(buff,"\" <");   strcat(buff,email);   strcat(buff,">\n");//setup to write line   if( find_addr_book_start(file) != 0)   {      if(feof(file) == 0)      {         syslog(LOG_MAIL | LOG_ERR,"could not find addr book start");         free(buff);         return(-1);      }      else         fprintf(file,"address_book(main)\n");   }   file_ptr=find_next_email_order(file,name,email);//write email into file   if(file_ptr != -1)      if( insert_line_in_file(file,buff,file_ptr,file_ptr) != 0)      {         syslog(LOG_MAIL | LOG_ERR,"could not add email to pref");         free(buff);         return(-1);      }   free(buff);   return(0);}//////////////////////////////////////////////////////////////////int delete_pref_email(FILE* file, char* name, char* email){   long int file_ptr_read=-1;   long int file_ptr_write=-1;   if(file == NULL || email == NULL)      return(-1);//setup to delete email   if( find_addr_book_start(file) != 0)   {      syslog(LOG_MAIL | LOG_ERR,"find address_book to delete email failed");      return(-1);   }   if(find_email_position(file,name,email,&file_ptr_write,&file_ptr_read) != 0)   {      syslog(LOG_MAIL | LOG_ERR,"find email position for delete failed.");      return(-1);   }   if( insert_line_in_file(file,NULL,file_ptr_read,file_ptr_write) != 0)   {      syslog(LOG_MAIL | LOG_ERR,"error deleting pref email");      return(-1);   }   return(0);}//////////////////////////////////////////////////////////////////int modify_pref_email(FILE* file, char* old_name, char* old_email, 			char* new_name, char* new_email){   long int file_ptr_read=-1;   long int file_ptr_write=-1;   char* buff=NULL;   size_t buff_size=0;   if(file == NULL || old_email == NULL || new_email == NULL)      return(-1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -