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

📄 userdb.c

📁 Linux下的飞鸽传书
💻 C
📖 第 1 页 / 共 3 页
字号:
  entry->host=host;  entry->group=group;  entry->nickname=nickname;  entry->ipaddr=ipaddr;  entry->cap=IPMSG_DIALUPOPT; /*  ダイアルアップとみなす  */  dbg_out("OK entry:\nuser : %s\nhost :%s\ngroup : %s\nnickname : %s\nipaddr : %s\n",  	  entry->user=user,	  entry->host=host,	  entry->group=group,	  entry->nickname=nickname,	  entry->ipaddr=ipaddr);  rc=add_with_userdb_entry(entry);  *entry_string_p += (ep - buffer);  dbg_out("Return: %s (%d)\n",*entry_string_p,rc);  if (buffer)    g_free(buffer);  return rc; free_group_out:  if (group)    g_free(group); free_nickname_out:  if (nickname)    g_free(nickname); free_ipaddr_out:  if (ipaddr)    g_free(ipaddr); free_host_out:  if (host)    g_free(host); free_user_out:  if (user)    g_free(user); free_buffer_out:  if (buffer)    g_free(buffer);  return rc;}static inthostlist_userinfo_add_with_answer(const char *message,int *next_count){  int rc;  int start,end;  char *string;  char *sp,*ep;  long remains;  int intval;  size_t len;  userdb_t *entry=NULL;  size_t this_count;  size_t remain_count;  int is_last=0;  if ( (!message) || (!next_count) )     return -EINVAL;  string=g_strdup(message);  if (!string)    return -ENOMEM;    rc=-ENOENT;  len=strlen(message);  remains=len;  this_count=0;  *next_count=0;  /*   * start   */  sp=string;  ep=memchr(sp, HOSTLIST_SEPARATOR, remains);  if (!ep)     goto free_string_out;    remains =len - ((unsigned long)ep-(unsigned long)sp);  *ep='\0';  start=strtol(sp, (char **)NULL, 10);  if (start<0)    goto free_string_out;  ++ep;  dbg_out("Start:%d\n",start);  /*   * total   */  sp=ep;  ep=memchr(sp, HOSTLIST_SEPARATOR, remains);  if (!ep)    goto free_string_out;  remains =len - ((unsigned long)ep-(unsigned long)sp);  *ep='\0';  end=strtol(sp, (char **)NULL, 10);  if (end<0)    goto free_string_out;  ++ep;  dbg_out("End:%d\n",end);  if (end<start)     goto free_string_out;  sp=ep;  remains =len - ((unsigned long)ep-(unsigned long)sp);  is_last=0;  while ( (sp) && (!is_last) && (remains>0) ){    dbg_out("Add %d th entry:%s\n",this_count+1,sp);    rc=alloc_user_info(&entry);    if (rc)      goto free_string_out;    rc=userdb_add_hostlist_entry(entry,(const char **)&sp,&is_last);    if ( (rc) && (rc != -EEXIST) )      goto free_string_out;  /*  エントリ不正時は追加処理側で開放する  */    ++this_count;    remains =len - ((unsigned long)ep-(unsigned long)sp);  } free_string_out:  g_free(string);  if ( (this_count == 0) || (end < (this_count + start)) )    *next_count=0;  else    *next_count=(start + this_count);  dbg_out("Next count:%d (this,start,total)=(%d,%d,%d)\n",	  *next_count,	  this_count,	  start,	  end);  return rc;}static int internal_refer_user_by_addr(const char *ipaddr,const userdb_t **entry_ref){  int rc=-ESRCH;  userdb_t srch_user;  GList *found;  if ( (!ipaddr) || (!entry_ref) )    return -EINVAL;  memset(&srch_user,0,sizeof(userdb_t));  srch_user.ipaddr=(char *)ipaddr;  found=g_list_find_custom (users,&srch_user,userdb_find_by_ipaddr);  if (found) {    g_assert(found->data);    rc=0;    *entry_ref=found->data;  }  return rc;}intdestroy_user_info(userdb_t *entry){  int rc;  if (!entry)    return -EINVAL;  rc=destroy_user_info_contents(entry);  if (rc)    return rc;  memset(entry,0,sizeof(userdb_t));  dbg_out("Free: %x\n",(unsigned int)entry);  g_slice_free(userdb_t,entry);  return 0;}intuserdb_hostlist_answer_add(const udp_con_t *con,const msg_data_t *msg){  int next_count=0;  int rc;  gchar *internal_string=NULL;  if ( (!con) || (!msg) )    return -EINVAL;  if (!(msg->message))    return -EINVAL;  dbg_out("Here\n");  rc=convert_string_internal(msg->message,(const gchar **)&internal_string);  if (rc < 0) {    ipmsg_err_dialog(_("Can not convert message from %s into ineternal representation"), udp_get_peeraddr(con));    return rc;  }  next_count=0;  rc=hostlist_userinfo_add_with_answer(internal_string,&next_count);  if ( (rc<0) && (rc != -EEXIST) )     goto  free_string_out;  if (next_count) {    dbg_out("Send next:%d\n",next_count);    rc=ipmsg_send_get_list(udp_con,udp_get_peeraddr(con),next_count);  }  if (rc<0)    goto  free_string_out; free_string_out:  if (internal_string)    g_free(internal_string); error_out:  return rc;}static gint userdb_sort_with_view_config(gconstpointer data_a,			     gconstpointer data_b,			     gpointer user_data){  userdb_t *user_a=(userdb_t *)data_a;  userdb_t *user_b=(userdb_t *)data_b;    gint rc;  g_assert(user_a);  g_assert(user_b);   if (user_b->prio != user_a->prio)    return (user_b->prio - user_a->prio);  if ( (hostinfo_refer_ipmsg_is_sort_with_group()) &&       ( (user_a->group) && (user_b->group) ) ) {    rc=strcmp(user_a->group,user_b->group);    if (rc) {      if (hostinfo_refer_ipmsg_group_sort_order())	return rc;      else	return -rc;    }  }  rc=0;  switch(hostinfo_refer_ipmsg_sub_sort_id()) {  default:    case SORT_TYPE_USER:      if ((user_a->user) && (user_b->user))	rc=strcmp(user_a->user,user_b->user);      break;    case SORT_TYPE_IPADDR:      if ((user_a->ipaddr) && (user_b->ipaddr))	rc=strcmp(user_a->ipaddr,user_b->ipaddr);      break;    case SORT_TYPE_MACHINE:      if ((user_a->host) && (user_b->host))	rc=strcmp(user_a->host,user_b->host);      break;  }  if (!hostinfo_refer_ipmsg_sub_sort_order())    return -rc;  return rc;}intupdate_users_on_message_window(GtkWidget *window,gboolean is_force){  GtkWidget *view;  GList *current_users;  g_assert(window);  view=lookup_widget(window,"messageUserTree");  g_assert(view);  dbg_out("Notify userdb change :%x\n",(unsigned int)window);  g_static_mutex_lock(&userdb_mutex);  current_users=g_list_copy(refer_user_list());  if (current_users) {    current_users=g_list_sort(current_users,(GCompareFunc)userdb_sort_with_view_config);    update_user_entry(current_users,view,is_force);    g_list_free(current_users);      }else{    current_users=refer_user_list();    update_user_entry(current_users,view,is_force);  }  g_static_mutex_unlock(&userdb_mutex);  }intuserdb_search_user(const char *user,const char *ipaddr,const userdb_t **entry_ref){  int rc=-ESRCH;  userdb_t srch_user;  GList *found;  if ( (!user) || (!ipaddr) || (!entry_ref) )    return -EINVAL;  memset(&srch_user,0,sizeof(userdb_t));  srch_user.user=(char *)user;  srch_user.ipaddr=(char *)ipaddr;  g_static_mutex_lock(&userdb_mutex);    found=g_list_find_custom (users,&srch_user,userdb_find_element);  if (found) {    userdb_t *new_user;    _assert(found->data);    rc=-ENOMEM;    if (alloc_user_info(&new_user))       goto unlock_out;    rc=copy_user_info(new_user,found->data);        if (rc<0) {      destroy_user_info(new_user);      goto  unlock_out;    }    *entry_ref=new_user;  } unlock_out:  g_static_mutex_unlock(&userdb_mutex);  return rc;}intuserdb_search_user_by_addr(const char *ipaddr,const userdb_t **entry_ref){  int rc=-ESRCH;  userdb_t srch_user;  userdb_t *user_p=NULL;    userdb_t *new_user;  if ( (!ipaddr) || (!entry_ref) )    return -EINVAL;  memset(&srch_user,0,sizeof(userdb_t));  srch_user.ipaddr=(char *)ipaddr;  g_static_mutex_lock(&userdb_mutex);    rc=alloc_user_info(&new_user);  if (rc<0)     goto unlock_out;  rc=internal_refer_user_by_addr(ipaddr,(const userdb_t **)&user_p);  if (rc<0){    destroy_user_info(new_user);    goto unlock_out;  }  rc=copy_user_info(new_user,user_p);  if (rc<0) {    destroy_user_info(new_user);    goto unlock_out;  }  rc=0;  *entry_ref=new_user; unlock_out:  g_static_mutex_unlock(&userdb_mutex);  return rc;}voiduserdb_print_user_list(void){  g_list_foreach(users,		 print_one_user_entry,		 NULL);  }static gint userdb_find_group(gconstpointer a,gconstpointer b) {  int rc=-EINVAL;  if ( (!a) || (!b) )     return -EINVAL;  dbg_out("Pointer:0x%x 0x%x\n",a,b);  return strcmp((char *)a,(char *)b);}GList *get_group_list(void){  GList *ret=NULL;  GList *found;  GList *node;  userdb_t *ref;  gchar *string;  g_static_mutex_lock(&userdb_mutex);  for(node=g_list_first(users);node;node=g_list_next(node)) {    ref=node->data;        found=g_list_find_custom (ret,ref->group,userdb_find_group);    if (found)      continue;    string=g_strdup(ref->group);    if (string)      ret=g_list_append(ret,string);  }  g_static_mutex_unlock(&userdb_mutex);    return ret;}voiduserdb_update_group_list(GtkComboBox *widget){  if (!widget)    return;  g_list_foreach(users,                 (GFunc)update_one_group_entry,                 widget);}GList *refer_user_list(void) {  return users;}int userdb_add_user(const udp_con_t *con,const msg_data_t *msg){  int rc=0;  userdb_t *new_user;  if ( (!con) || (!msg) )    return -EINVAL;  if (alloc_user_info(&new_user))     return -ENOMEM;  rc=fill_user_info_with_message(udp_get_peeraddr(con),msg,new_user);  if (rc<0) {    destroy_user_info(new_user);    return rc;  }  rc=add_with_userdb_entry(new_user);  return rc;}int userdb_update_user(const udp_con_t *con,const msg_data_t *msg){  userdb_t new_user;  userdb_t *old_user;  userdb_t backup_user;  GList *update_entry;  GList *new_entry;  int rc;  if ( (!con) || (!msg) )    return -EINVAL;  memset(&new_user,0,sizeof(userdb_t));  rc=fill_user_info_with_message(udp_get_peeraddr(con),msg,&new_user);  if (rc<0) {    return rc;  }  g_static_mutex_lock(&userdb_mutex);  update_entry=g_list_find_custom(users,&new_user,userdb_find_element);  if (!update_entry) {    g_static_mutex_unlock(&userdb_mutex);    destroy_user_info_contents(&new_user);    return -ENOMEM;  } else {    /*     * 旧来の情報を削除して新しい情報で更新     */    old_user=update_entry->data;        memset(&backup_user,0,sizeof(userdb_t));    rc=copy_user_info(&backup_user,old_user);    if (rc<0) {      destroy_user_info_contents(old_user);      goto fill_error_out;    }    destroy_user_info_contents(old_user);        rc=fill_user_info_with_message(udp_get_peeraddr(con),msg,old_user);    if (rc<0)      goto fill_error_out;    old_user->prio=backup_user.prio;    destroy_user_info_contents(&backup_user);    goto ok_out;  fill_error_out:    destroy_user_info_contents(&backup_user);    destroy_user_info(old_user);    users=g_list_remove_link(users,update_entry);    g_list_free(update_entry);    g_static_mutex_unlock(&userdb_mutex);    return rc;  } ok_out:  /*   * 健全性チェック   */  new_entry=g_list_find_custom(users,&new_user,userdb_find_element);  g_assert(new_entry);  g_assert(new_entry->data == old_user);  destroy_user_info_contents(&new_user);  g_static_mutex_unlock(&userdb_mutex);  notify_userdb_changed();  return 0;}int userdb_replace_prio_by_addr(const char *ipaddr,int prio,gboolean need_notify){  int rc=-ESRCH;  userdb_t srch_user;  userdb_t *user_p=NULL;  if  (!ipaddr)    return -EINVAL;  dbg_out("Here: ipaddr:%s prio:%d\n",ipaddr,prio);  memset(&srch_user,0,sizeof(userdb_t));  srch_user.ipaddr=(char *)ipaddr;  g_static_mutex_lock(&userdb_mutex);    rc=internal_refer_user_by_addr(ipaddr,(const userdb_t **)&user_p);  if (rc<0)    goto unlock_out;  user_p->prio=prio;  rc=hostinfo_update_ipmsg_ipaddr_prio(ipaddr,prio); unlock_out:  g_static_mutex_unlock(&userdb_mutex);  if (need_notify)    notify_userdb_changed();  return rc;}voidupdate_all_user_list_view(void){  notify_userdb_changed();}int userdb_del_user(const udp_con_t *con,const msg_data_t *msg){  GList *del_entry;  userdb_t del_user;

⌨️ 快捷键说明

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