From: Bill S. <sh...@us...> - 2007-10-29 05:12:49
|
Update of /cvsroot/vpopmail/vpopmail In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv9884 Modified Files: ChangeLog vpalias.c Log Message: get valias_remove() working for cdb module Index: vpalias.c =================================================================== RCS file: /cvsroot/vpopmail/vpopmail/vpalias.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- vpalias.c 22 May 2007 03:59:01 -0000 1.15 +++ vpalias.c 29 Oct 2007 05:12:48 -0000 1.16 @@ -162,8 +162,73 @@ int valias_remove( char *alias, char *domain, char *alias_line) { - fprintf (stderr, "Error: valias_remove() not implemented for non-SQL backends.\n"); - return -1; + int i; + char *tmpstr; + char Dir[156]; + char *p; + char LineBuf[512]; + char *DirNew; + uid_t uid; + gid_t gid; + FILE *fr, *fw; + + if ( alias == NULL ) return(VA_NULL_POINTER); + if ( domain == NULL ) return(VA_NULL_POINTER); + if ( alias_line == NULL ) return(VA_NULL_POINTER); + if ( strlen(alias) > MAX_PW_NAME ) return(VA_USER_NAME_TOO_LONG); + if ( strlen(domain) > MAX_PW_DOMAIN ) return(VA_DOMAIN_NAME_TOO_LONG); + if ( strlen(alias_line) >= MAX_ALIAS_LINE ) return(VA_ALIAS_LINE_TOO_LONG); + + if ((tmpstr = vget_assign(domain, Dir, sizeof(Dir), &uid, &gid )) == NULL) { + printf("invalid domain, not in qmail assign file\n"); + return(-1); + } + + // create dotqmail filename, converting '.' to ':' as we go + strncat(Dir, "/.qmail-", sizeof(Dir)-strlen(Dir)-1); + i = strlen(Dir); + for (p = alias; (i < (int)sizeof(Dir) - 1) && (*p != '\0'); p++) + Dir[i++] = (*p == '.' ? ':' : *p); + Dir[i] = '\0'; + + DirNew = strcat(strcpy(malloc(8 + sizeof(Dir) + 4), Dir), ".new"); + + fprintf(stderr, "Dir: %s\n", Dir); + fprintf(stderr, "DirNew: %s\n", DirNew); + + if ( (fr = fopen(Dir, "r")) == NULL ) { + free(DirNew); + return(-1); + } + if ( (fw = fopen(DirNew, "w+")) == NULL ) { + free(DirNew); + return(-1); + } + fprintf(stderr, "DirNew: %s\n", DirNew); + chmod(Dir,0600); + chown(Dir,uid,gid); + + i = strlen(alias_line); + while (fgets(LineBuf, sizeof(LineBuf), fr)) { + if (strncmp(LineBuf, alias_line, i)) { + fputs(LineBuf, fw); + } + } + + fclose(fr); + fclose(fw); + rename(DirNew, Dir); + free(DirNew); + +#ifdef ONCHANGE_SCRIPT + if( allow_onchange ) { + /* tell other programs that data has changed */ + snprintf ( onchange_buf, MAX_BUFF, "%s@%s - %s", alias, domain, alias_line ); + call_onchange ( "valias_remove" ); + } +#endif + + return(0); } int valias_delete( char *alias, char *domain) Index: ChangeLog =================================================================== RCS file: /cvsroot/vpopmail/vpopmail/ChangeLog,v retrieving revision 1.183 retrieving revision 1.184 diff -u -d -r1.183 -r1.184 --- ChangeLog 28 Oct 2007 08:59:40 -0000 1.183 +++ ChangeLog 29 Oct 2007 05:12:48 -0000 1.184 @@ -7,6 +7,7 @@ found. Instead, return "." only. Also indicate in help that per_page is optional. find_domain page numbers consistently start at 1. - update README.vpopmaild to reflect the above. + - Get valias_remove() working for cdb module. Rick Widmer - Arrange vpopmail.h based on libvpopmail categories (Start of v6 project) |