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

📄 userdb.c

📁 linux下的飞鸽传书 日本人设计 使用非常方便
💻 C
📖 第 1 页 / 共 2 页
字号:
  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)    return rc;  next_count=0;  rc=hostlist_userinfo_add_with_answer(internal_string,&next_count);  g_free(internal_string);  if ( (rc<0) && (rc != -EEXIST) )    return rc;  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)    return rc;  return 0;}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=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)       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);  _assert(new_entry);  _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;  userdb_t *del_user_p;  int rc;  if ( (!con) || (!msg) )    return -EINVAL;    memset(&del_user,0,sizeof(userdb_t));  rc=convert_string_internal(refer_user_name_from_msg(msg),(const gchar **)&(del_user.user));  if (rc)    return rc;  rc=convert_string_internal(refer_host_name_from_msg(msg),(const gchar **)&(del_user.host));  if (rc)    return rc;  rc=convert_string_internal(udp_get_peeraddr(con),(const gchar **)&(del_user.ipaddr));  if (rc)    goto free_user_out;  dbg_out("del user start\n");  g_static_mutex_lock(&userdb_mutex);  del_entry=g_list_find_custom(users,&del_user,userdb_find_element);  if (!del_entry) {    rc=-ESRCH;    dbg_out("No such entry:%s@%s\n",del_user.user,del_user.ipaddr);    g_static_mutex_unlock(&userdb_mutex);    goto free_out;  }   del_user_p=del_entry->data;  dbg_out("Free: %x\n",(unsigned int)del_user_p);  destroy_user_info(del_user_p);  users=g_list_remove_link(users,del_entry);  g_list_free(del_entry);  g_static_mutex_unlock(&userdb_mutex);  notify_userdb_changed();  rc=0; free_out:  dbg_out("del user end\n");  g_free(del_user.ipaddr); free_user_out:  g_free(del_user.user);    return rc;}intuserdb_get_hostlist_string(int start, int *length, const char **ret_string,unsigned long *flags) {  int index;  unsigned int last;  unsigned int total;  int rc;  GList *node;  size_t str_size=0;  size_t len=0;  userdb_t *data;  char tmp_buff[IPMSG_BUFSIZ];  unsigned long command;  char *string;  size_t remain_len;  int count;  int start_no;  rc=-EINVAL;  if ( (start<0) || (!length) || ((*length) < 0) || (!ret_string) || (!flags) )    return rc;  g_static_mutex_lock(&userdb_mutex);  last=start + (*length);  total=g_list_length(users);  rc=-ENOENT;  if (!total)    goto unlock_out;  --total;  if ( total < (last) )     last=total;    memset(tmp_buff,0,IPMSG_BUFSIZ);  snprintf(tmp_buff,IPMSG_BUFSIZ-1,"%5d%c%5d%c",start,HOSTLIST_SEPARATOR,total,HOSTLIST_SEPARATOR);  str_size=strlen(tmp_buff)+1;  /*   *start:length:ユーザ名:ホスト名:コマンド番号:IP アドレス:   *ポート番号(リトルエンディアン):ニックネーム:グループ名   */  /* length チェック  */  for(index=start,count=0;      ( (data=(userdb_t *)g_list_nth_data(users,index)) && (index<=last) );      ++index){    memset(tmp_buff,0,IPMSG_BUFSIZ);    snprintf(tmp_buff,IPMSG_BUFSIZ-1,"%s%c%s%c%d%c%s%c%d%c%s%c%s%c",	     (data->user)?(data->user):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     (data->host)?(data->host):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     IPMSG_ANSLIST,	     HOSTLIST_SEPARATOR,	     (data->ipaddr)?(data->ipaddr):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     hostinfo_refer_ipmsg_port(),	     HOSTLIST_SEPARATOR,	     (data->nickname)?(data->nickname):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     (data->group)?(data->group):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR);    len=strlen(tmp_buff);    if ( (len + str_size) > (_MSG_BUF_MIN_SIZE / 2) ) {      last=index;    }    str_size += len+1;    ++count;  }  rc=-ENOMEM;  string=malloc(str_size+1);  if (!string)    goto unlock_out;  /*   * 作成   */  memset(string,0,str_size+1);  if (count)    --count;  start_no=((start+count)==total)?(0):start+count; /* 0は終端を示す  */  snprintf(string,IPMSG_BUFSIZ-1,"%5d%c%5d%c",start_no,HOSTLIST_SEPARATOR,total,HOSTLIST_SEPARATOR);  dbg_out("Create from %d to %d\n",start,last);  for(index=start,remain_len=(str_size-strlen(string));      index<=last;      ++index){    data=(userdb_t *)g_list_nth_data(users,index);    memset(tmp_buff,0,IPMSG_BUFSIZ);    snprintf(tmp_buff,IPMSG_BUFSIZ-1,"%s%c%s%c%d%c%s%c%d%c%s%c%s%c",	     (data->user)?(data->user):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     (data->host)?(data->host):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     IPMSG_ANSLIST,	     HOSTLIST_SEPARATOR,	     (data->ipaddr)?(data->ipaddr):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     hostinfo_refer_ipmsg_port(),	     HOSTLIST_SEPARATOR,	     (data->nickname)?(data->nickname):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR,	     (data->group)?(data->group):(HOSTLIST_DUMMY),	     HOSTLIST_SEPARATOR);    len=strlen(tmp_buff);    g_assert(len<=(remain_len-1));    dbg_out("%d th :%s\n",index,tmp_buff);    strncat(string,tmp_buff,remain_len);    remain_len -= len;  }    len=strlen(string);  if (string[len-1]==HOSTLIST_SEPARATOR)    string[len-1]='\0';  dbg_out("String:%s\n",string);  rc=0;  *length=last-start;  *ret_string=string; unlock_out:  g_static_mutex_unlock(&userdb_mutex);    return rc;}int userdb_invalidate_userdb(void){  GList *node;  userdb_t *del_user;  GList *new_list=NULL;  dbg_out("Here\n");  g_static_mutex_lock(&userdb_mutex);  for(node=g_list_first(users);node;node=g_list_next (node)) {    g_assert(node->data);    del_user=(userdb_t *)node->data;    /*  Dial Up hostは残留組となる     *  (可達確認がブロードキャストでできないので)     */    if ( del_user->cap & IPMSG_DIALUPOPT)       new_list=g_list_append(new_list,del_user);     else      destroy_user_info(del_user);  }  g_list_free (users);  users=new_list;  g_static_mutex_unlock(&userdb_mutex);  return 0;}int userdb_send_broad_cast(const udp_con_t *con,const char *msg,size_t len) {  GList *node;  userdb_t *the_user;  dbg_out("Here\n");  g_static_mutex_lock(&userdb_mutex);  for(node=g_list_first(users);node;node=g_list_next (node)) {    g_assert(node->data);    the_user=(userdb_t *)node->data;    dbg_out("Check host:%s\n",the_user->ipaddr);    if (the_user->cap & IPMSG_DIALUPOPT) {      if (!the_user->ipaddr) {	dbg_out("dialup host does not have ipaddr, ignored\n");	print_one_user_entry((gpointer)the_user,NULL);      }else{	dbg_out("%s is dialup host\n",the_user->ipaddr);	udp_send_broadcast_with_addr(con,the_user->ipaddr,msg,len);      }    }  }  g_static_mutex_unlock(&userdb_mutex);  return 0;}intuserdb_add_waiter_window(GtkWidget *window){  if (!window)    return -EINVAL;  dbg_out("here %x\n",(unsigned int)window);  g_static_mutex_lock(&win_mutex);  waiter_windows=g_list_append(waiter_windows,(gpointer)window);  g_static_mutex_unlock(&win_mutex);  return 0;}intuserdb_remove_waiter_window(GtkWidget *window){  if (!window)    return -EINVAL;  dbg_out("here %x\n",(unsigned int)window);  g_static_mutex_lock(&win_mutex);  waiter_windows=g_list_remove(waiter_windows,(gpointer)window);  g_static_mutex_unlock(&win_mutex);  return 0;}intuserdb_init_userdb(void){  users=NULL;  return 0;}

⌨️ 快捷键说明

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