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

📄 vactivedir.c

📁 相当优秀的 UNIX 进程管理工具
💻 C
📖 第 1 页 / 共 2 页
字号:
  }  ad_clean_packet(&adir);  close(sock);  if ( strncmp(adir.p1,"yes",3) != 0 ) return(-1);   return(0);}void vclose() { }#ifdef IP_ALIAS_DOMAINSint vget_ip_map( char *ip, char *domain, int domain_size){ FILE *fs; char tmpbuf[156]; char *tmpstr;	if ( ip == NULL || strlen(ip) <= 0 ) return(-1);	/* open the ip_alias_map file */	snprintf(tmpbuf, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);	if ( (fs = fopen(tmpbuf,"r")) == NULL ) return(-1);	while( fgets(tmpbuf, 156, fs) != NULL ) {		tmpstr = strtok(tmpbuf, IP_ALIAS_TOKENS);		if ( tmpstr == NULL ) continue;		if ( strcmp(ip, tmpstr) != 0 ) continue;		tmpstr = strtok(NULL, IP_ALIAS_TOKENS);		if ( tmpstr == NULL ) continue;		strncpy(domain, tmpstr, domain_size);		fclose(fs);		return(0);	}	fclose(fs);	return(-1);}/*  * Add an ip to domain mapping * It will remove any duplicate entry before adding it * */int vadd_ip_map( char *ip, char *domain){ FILE *fs; char tmpbuf[156];  if ( ip == NULL || strlen(ip) <= 0 ) return(-1);  if ( domain == NULL || strlen(domain) <= 0 ) return(-10);  vdel_ip_map( ip, domain );  snprintf(tmpbuf, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);  if ( (fs = fopen(tmpbuf,"a+")) == NULL ) return(-1);  fprintf( fs, "%s %s\n", ip, domain);  fclose(fs);  return(0);}int vdel_ip_map( char *ip, char *domain) { FILE *fs; FILE *fs1; char file1[156]; char file2[156]; char tmpbuf[156]; char tmpbuf1[156]; char *ip_f; char *domain_f;  if ( ip == NULL || strlen(ip) <= 0 ) return(-1);  if ( domain == NULL || strlen(domain) <= 0 ) return(-1);  snprintf(file1, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);  if ( (fs = fopen(file1,"r")) == NULL ) return(-1);  snprint(file2, 156, "%s/%s.%d", VPOPMAILDIR, IP_ALIAS_MAP_FILE, getpid());  if ( (fs1 = fopen(file2,"w")) == NULL ) {    fclose(fs);    return(-1);  }  while( fgets(tmpbuf, 156, fs) != NULL ) {    strncpy(tmpbuf1,tmpbuf, 156);    ip_f = strtok(tmpbuf, IP_ALIAS_TOKENS);    if ( ip_f == NULL ) continue;    domain_f = strtok(NULL, IP_ALIAS_TOKENS);    if ( domain_f == NULL ) continue;    if ( strcmp(ip, ip_f) == 0 && strcmp(domain,domain_f) == 0) continue;    fprintf(fs1, tmpbuf1);  }  fclose(fs);  fclose(fs1);  if ( rename( file2, file1) < 0 ) return(-1);  return(0);}int vshow_ip_map( int first, char *ip, char *domain){ static FILE *fs = NULL; char tmpbuf[156]; char *tmpstr;  if ( ip == NULL ) return(-1);  if ( domain == NULL ) return(-1);  if ( first == 1 ) {    if ( fs != NULL ) {      fclose(fs);      fs = NULL;    }    snprintf(tmpbuf, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);    if ( (fs = fopen(tmpbuf,"r")) == NULL ) return(-1);  }  if ( fs == NULL ) return(-1);  while (1) {    if (fgets(tmpbuf, 156, fs) == NULL ) {      fclose(fs);      fs = NULL;      return(0);    }    tmpstr = strtok(tmpbuf, IP_ALIAS_TOKENS);    if ( tmpstr == NULL ) continue;    strcpy( ip, tmpstr);    tmpstr = strtok(NULL, IP_ALIAS_TOKENS);    if ( tmpstr == NULL ) continue;    strcpy( domain, tmpstr);    return(1);  }  return(-1);}#endifint vread_dir_control(vdir_type *vdir, char *domain, uid_t uid, gid_t gid){  FILE *fs; char dir_control_file[MAX_DIR_NAME]; int i;  strncpy(dir_control_file,dc_filename(domain, uid, gid),MAX_DIR_NAME);  if ( (fs = fopen(dir_control_file, "r")) == NULL ) {    vdir->cur_users = 0;    for(i=0;i<MAX_DIR_LEVELS;++i){      vdir->level_start[i] = 0;      vdir->level_end[i] = MAX_DIR_LIST-1;      vdir->level_index[i] = 0;    }    vdir->level_mod[0] = 0;    vdir->level_mod[1] = 2;    vdir->level_mod[2] = 4;    vdir->level_cur = 0;    vdir->level_max = MAX_DIR_LEVELS;    vdir->the_dir[0] = 0;    return(-1);  }   fgets(dir_control_file, MAX_DIR_NAME, fs );   vdir->cur_users = atol(dir_control_file);  fgets(dir_control_file, MAX_DIR_NAME, fs );   vdir->level_cur = atoi(dir_control_file);  fgets(dir_control_file, MAX_DIR_NAME, fs );   vdir->level_max = atoi(dir_control_file);  fgets(dir_control_file, MAX_DIR_NAME, fs );   vdir->level_start[0] = atoi(dir_control_file);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_start[1] = atoi(&dir_control_file[i]);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_start[2] = atoi(&dir_control_file[i]);  fgets(dir_control_file, MAX_DIR_NAME, fs );   vdir->level_end[0] = atoi(dir_control_file);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_end[1] = atoi(&dir_control_file[i]);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_end[2] = atoi(&dir_control_file[i]);  fgets(dir_control_file, MAX_DIR_NAME, fs );   vdir->level_mod[0] = atoi(dir_control_file);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_mod[1] = atoi(&dir_control_file[i]);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_mod[2] = atoi(&dir_control_file[i]);  fgets(dir_control_file, MAX_DIR_NAME, fs );   vdir->level_index[0] = atoi(dir_control_file);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_index[1] = atoi(&dir_control_file[i]);  for(i=0;dir_control_file[i]!=' ';++i); ++i;  vdir->level_index[2] = atoi(&dir_control_file[i]);  fgets(dir_control_file, MAX_DIR_NAME, fs );   for(i=0;dir_control_file[i]!=0;++i) {    if (dir_control_file[i] == '\n') {      dir_control_file[i] = 0;    }  }  fgets(dir_control_file, MAX_DIR_NAME, fs );   for(i=0;dir_control_file[i]!=0;++i) {    if (dir_control_file[i] == '\n') {      dir_control_file[i] = 0;    }  }  strncpy(vdir->the_dir, dir_control_file, MAX_DIR_NAME);  fclose(fs);  return(0);}int vwrite_dir_control(vdir_type *vdir, char *domain, uid_t uid, gid_t gid){  FILE *fs; char dir_control_file[MAX_DIR_NAME]; char dir_control_tmp_file[MAX_DIR_NAME];  strncpy(dir_control_file,dc_filename(domain, uid, gid),MAX_DIR_NAME);  snprintf(dir_control_tmp_file, MAX_DIR_NAME,         "%s.%d", dir_control_file, getpid());  if ( (fs = fopen(dir_control_tmp_file, "w+")) == NULL ) return(-1);  fprintf(fs, "%lu\n", vdir->cur_users);  fprintf(fs, "%d\n", vdir->level_cur);  fprintf(fs, "%d\n", vdir->level_max);  fprintf(fs, "%d %d %d\n",     vdir->level_start[0],    vdir->level_start[1],    vdir->level_start[2]);  fprintf(fs, "%d %d %d\n",     vdir->level_end[0],    vdir->level_end[1],    vdir->level_end[2]);  fprintf(fs, "%d %d %d\n",     vdir->level_mod[0],    vdir->level_mod[1],    vdir->level_mod[2]);  fprintf(fs, "%d %d %d\n",     vdir->level_index[0],    vdir->level_index[1],    vdir->level_index[2]);  fprintf(fs, "%s\n", vdir->the_dir);   fclose(fs);  rename( dir_control_tmp_file, dir_control_file);   chown(dir_control_file,uid, gid);  return(0);}int vdel_dir_control(char *domain){ char dir_control_file[MAX_DIR_NAME];  vget_assign(domain, dir_control_file, 156, NULL,NULL);  strncat(dir_control_file,"/.dir-control", MAX_DIR_NAME);  return(unlink(dir_control_file));}#ifdef ENABLE_AUTH_LOGGINGint vset_lastauth(char *user, char *domain, char *remoteip ){ char *tmpbuf; FILE *fs; struct vqpasswd *vpw; uid_t uid; gid_t gid;  if( (vpw = vauth_getpw( user, domain )) == NULL) return(0);  tmpbuf = malloc(MAX_BUFF);  snprintf(tmpbuf, MAX_BUFF, "%s/lastauth", vpw->pw_dir);  if ( (fs = fopen(tmpbuf,"w+")) == NULL ) {    free(tmpbuf);    return(-1);  }  fprintf(fs, "%s", remoteip);  fclose(fs);  vget_assign(domain,NULL,0,&uid,&gid);  chown(tmpbuf,uid,gid);  free(tmpbuf);  return(0);}time_t vget_lastauth( struct vqpasswd *pw, char *domain){ char *tmpbuf; struct stat mystatbuf;  tmpbuf = malloc(MAX_BUFF);  snprintf(tmpbuf, MAX_BUFF, "%s/lastauth", pw->pw_dir);  if ( stat(tmpbuf,&mystatbuf) == -1 ) {    free(tmpbuf);    return(0);  }  free(tmpbuf);  return(mystatbuf.st_mtime);}char *vget_lastauthip( struct vqpasswd *pw, char *domain){ static char tmpbuf[MAX_BUFF]; FILE *fs;  snprintf(tmpbuf, MAX_BUFF, "%s/lastauth", pw->pw_dir);  if ( (fs=fopen(tmpbuf,"r"))==NULL) return(NULL);  fgets(tmpbuf,MAX_BUFF,fs);  fclose(fs);  return(tmpbuf);}#endif /* ENABLE_AUTH_LOGGING */char *dc_filename(char *domain, uid_t uid, gid_t gid){ static char dir_control_file[MAX_DIR_NAME]; struct passwd *pw;  /* if we are lucky the domain is in the assign file */  if ( vget_assign(domain,dir_control_file,MAX_DIR_NAME,NULL,NULL)!=NULL ) {     strncat(dir_control_file, "/.dir-control", MAX_DIR_NAME);  /* it isn't in the assign file so we have to get it from /etc/passwd */  } else {          /* save some time if this is the vpopmail user */    if ( uid == VPOPMAILUID ) {      strncpy(dir_control_file, VPOPMAILDIR, MAX_DIR_NAME);    /* for other users, look them up in /etc/passwd */    } else if ( (pw=getpwuid(uid))!=NULL ) {      strncpy(dir_control_file, pw->pw_dir, MAX_DIR_NAME);      /* all else fails return a blank string */    } else {      return("");    }    /* stick on the rest of the path */    strncat(dir_control_file, "/" DOMAINS_DIR "/.dir-control", MAX_DIR_NAME);   }  return(dir_control_file);}int vauth_crypt(char *user,char *domain,char *clear_pass,struct vqpasswd *vpw){ static struct actdirvp adir; int sock;  if ( (sock=ad_open_conn())==-1){    printf("could not connect\n");    return(-1);  }  memset(&adir,' ',sizeof(struct actdirvp));  memcpy( adir.cmd, "auth", 4);  memcpy( adir.pw_name, user, strlen(user));  memcpy( adir.pw_domain, domain, strlen(domain));  memcpy( adir.pw_clear_passwd, clear_pass, strlen(clear_pass));  if ( write(sock,&adir, sizeof(struct actdirvp))<0){    close(sock);    printf("write failed\n");    return(-1);  }  if ( read(sock,&adir, sizeof(struct actdirvp))<0) {    close(sock);    printf("read failed\n");    return(-1);  }  ad_clean_packet(&adir);  /*ad_print_packet(&adir);*/  close(sock);  if ( strncmp(adir.p1,"yes",3) == 0 ) return(0);   return(-1);}

⌨️ 快捷键说明

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