//gcc create.c -o create -I/usr/local/include -L/usr/local/lib/ -lmysqlclient -lz
//v0.00000001
//usage: ./create root@syshunter.net password
//or   : ./create will list the table of userinfo to output to screen.
//auther: SysHu0teR
//Mail  : syshunter@hotmail.com
//
//date:   12.01.2005
   
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <time.h>
#include <mysql.h>
//#define DEBUG
#define MYSQL_USER "postfix"                     //mysql's username                
#define MYSQL_PASS "password"                    //........password
#define MYSQL_DATABASE "postfix"                 //........database
void usage(char *p);
int create_dir(char *pdir);
void get_name(char *name,char *addr);
void get_domain(char *domain,char *addr);
int mysql_insert(char *host,char *mysql_name,char *mysql_pass,char *database,char *name,char *domain,char *pass);
int mysql_domain(char *domain,char *pass,MYSQL *mysql);
int view_sql(char *username,char*pass,char *database);
typedef struct time{
 int yea;
 int mon;
 int day;
 int hou;
 int min;
 int sec;
} TIME;
TIME ptime;
uid_t pf_uid=125;
gid_t pf_gid=125;
int main(int argc,char *argv[])
{
// pf_uid=getuid();
// pf_gid=getgid();
 char name[80]={0};
 char domain[80]={0};
 char *sql;
 time_t pt;
 struct tm *ptm;
 
 
 if(argc!=3) {
  if(argc==1) {
   view_sql(MYSQL_USER,MYSQL_PASS,MYSQL_DATABASE);
   exit(1);
  }
  else {
   usage(argv[0]);
   exit(1);
  }
 }
 
 
 time(&pt);
 ptm=localtime(&pt);    //get current time.
 ptime.yea=1900+ptm->tm_year;
 ptime.mon=1+ptm->tm_mon;
 ptime.day=ptm->tm_mday;
 ptime.hou=ptm->tm_hour;
 ptime.min=ptm->tm_min;
 ptime.sec=ptm->tm_sec;
 
 
 get_name(name,argv[1]);
 get_domain(domain,argv[1]);
 create_dir(argv[1]);
 mysql_insert("localhost",MYSQL_USER,MYSQL_PASS,MYSQL_DATABASE,name,domain,argv[2]);
 return 1;
}
void usage(char *p)
{
 printf("usage:   %s   [mailaddress(such as: root@syshunter.net)] [user's password]\n\n",p);
 
 printf("                                                          ---------By SysHu0teR.\n");
}
int create_dir(char *pdir)
{
 pid_t pid;
 char domain[80]={0},name[20]={0};
 char path[200]={0};
 
 char maildir[255]={0};
 get_domain(domain,pdir);
 get_name(name,pdir);
 
 sprintf(path,"/var/mail/%s",domain);
 if(mkdir(path,0777)<0)
  perror("mkdir domain_dir");
  
 if(chmod(path,0777)<0) {
  perror("chmod directory");
  exit(1);
 }
 if(chown(path,pf_uid,pf_gid)<0) {
  perror("chown directory");
  exit(1);
 }
 
 strcat(path,"/");
 strcat(path,name);
 if(mkdir(path,0777)<0)
  perror("mkdir name_dir");
 if(chmod(path,0777)<0) {
  perror("chmod directory");
  exit(1);
 }
 if(chown(path,pf_uid,pf_gid)<0) {
  perror("chown directory");
  exit(1);
 }
 
// sprintf(maildir,"/usr/local/bin/maildirmake ");
 strncpy(maildir,path,strlen(path));
 strcat(maildir,"/");
 strcat(maildir,"Maildir");
 
#ifdef DEBUG
 puts(maildir);
#endif
 if(fork()==0) 
  execl("/usr/local/bin/maildirmake","maildirmake",maildir, (char *)0);
 wait((int *)0);
 
        if(chmod(maildir,0777)<0) {
                perror("chmod directory");
                exit(1);
        }
  
  if(fork()==0)
   execl("/usr/sbin/chown","chown","postfix:postfix",maildir,(char *)0);
/*        if(chown(maildir,pf_uid,pf_gid)<0) {
                perror("chown directory");
                exit(1);
        }
*/
 return 1;
}
void get_domain(char *domain, char *addr)
{
 char *ps;
 int i=0;
 int at='@';
 ps=strchr(addr,at);
 if(ps==NULL||*(ps+1)==0) {
  printf("I'v got a fuck wrong mail address.\n");
  exit(1);
 }
 ps++;
 while(ps[i]!=0) {
  domain[i]=ps[i];
  ++i;
 }
 domain[i]=0;
#ifdef DEBUG
 puts(domain);
#endif
 
}
void get_name(char *name,char *addr)
{
 int i=0;
 while(addr[i]!='@' && addr[i]!=0) {
  name[i]=addr[i];
  i++;
 }
#ifdef DEBUG
 puts(name);
#endif
}
int mysql_insert(char *host,char *mysql_name,char *mysql_pass,char *database,char *name,char *domain,char *pass)
{
 MYSQL mysql;
 MYSQL_RES *res;
 MYSQL_ROW row;
 int domainid;
 char mailaddr[256]={0};
 char sql[256]={0};
 char qy[256]={0};
 mysql_init(&mysql);
 
 if(!mysql_real_connect(&mysql,host,mysql_name,mysql_pass,database,0,NULL,0)) {
  printf("In mysql_insert():mysql_real_connect()'s error:%s\n",mysql_error(&mysql));
  exit(1);
 }
 //whether the user already within the table..
 sprintf(qy,"select * from userinfo where address='%s@%s';",name,domain);
 if(mysql_real_query(&mysql,qy,(unsigned int)strlen(qy))) {
  printf("In mysql_insert():147: mysql_real_query()'s error: %s\n",mysql_error(&mysql));
  exit(1);
 }
 res=mysql_store_result(&mysql);
 
 if(mysql_num_rows(res)>0) {
  printf("This user has already exists.\n");
  exit(1);
 }
 mysql_free_result(res);
 
 domainid=mysql_domain(domain,pass,&mysql);
 sprintf(sql,"INSERT INTO `userinfo` VALUES (NULL, '%s', %d, '%s@%s', NULL,encrypt('%s'), '%s', 209715200, 1, '/var/mail/%s/%s/', '/var/mail/%s/%s/Maildir/', '%d-%d-%d %d:%d:%d', '', '', 0, 0, 0, 0, '', 0, '', '', '');",name,domainid,name,domain,pass,name,domain,name,domain,name,ptime.yea,ptime.mon,ptime.day,ptime.hou,ptime.min,ptime.sec);
 if(mysql_real_query(&mysql,sql,(unsigned int)strlen(sql))) {
  printf("In mysql_insert():153: mysql_real_query()'s error: %s\n",mysql_error(&mysql));
  exit(1);
 }
 mysql_close(&mysql);
 return 1;
}
int mysql_domain(char *domain,char *pass,MYSQL *mysql)
{
 char sql[256]={0};
 char sql_order[]="select domain_id from domaininfo order by domain_id;";
 char sql_insert[256]={0};
 int maxid=0;
 int domain_id;
 
 MYSQL_ROW row,row2;
 MYSQL_RES *res;
 
 
 sprintf(sql,"select domain_id from domaininfo where domain='%s';",domain);
 
 if(mysql_real_query(mysql,sql,(unsigned int)strlen(sql))) {
  printf("error: %s\n",mysql_error(mysql));
  exit(1);
 }
 
 res=mysql_store_result(mysql);
 if(mysql_num_rows(res)>0) {
  row=mysql_fetch_row(res);
  mysql_free_result(res);
  return atoi(row[0]);
 }
 
 mysql_free_result(res);
 
 // part of Insert as folwing:
 if(mysql_real_query(mysql,sql_order,(unsigned int)strlen(sql_order))) {
  printf("error: %s\n",mysql_error(mysql));
  exit(2);
 }
 res=mysql_store_result(mysql);
 if(mysql_num_rows(res)>0) {
  row2=mysql_fetch_row(res);
  while(row2) {
   maxid=atoi(row2[0]);
   row2=mysql_fetch_row(res);
  }
 }
 
 mysql_free_result(res);
 
 maxid++;
#ifdef DEBUG
 printf("maxid: %d",maxid);
#endif
 sprintf(sql_insert,"INSERT INTO `domaininfo` VALUES (%d, '%s', NULL, encrypt('%s'), %d, 500, NULL, '0000-00-00', 1, '%d-%d-%d %d:%d:%d');",maxid,domain,pass,maxid,ptime.yea,ptime.mon,ptime.day,ptime.hou,ptime.min,ptime.sec);
 
 if(mysql_real_query(mysql,sql_insert,(unsigned int)strlen(sql_insert))) {
  printf("Inserting to domaininfo error: %s\n",mysql_error(mysql));
  exit(3);
 }
 
 return maxid;
}
/* view_sql by "Loaded",Hes my little brother,lol....*/
int view_sql(char *username,char *pass,char *database)
{
 MYSQL mysql;
 MYSQL_RES *res;
 MYSQL_ROW row;
 int i;
 char sql[]="select domain_id,address from userinfo order by domain_id;";
 mysql_init(&mysql);
 if (!mysql_real_connect(&mysql,"localhost",username,pass,database,0,NULL,0))
 {
       printf( "Error connecting to database: %s\n",mysql_error(&mysql));
    return -1;
 }
 i = mysql_real_query(&mysql,sql,(unsigned int) strlen(sql));
    if (i)
 {
  printf("Error making query: %s\n",mysql_error(&mysql));
  return -1;
 }
 res=mysql_store_result(&mysql);
 printf("domain_id\taddress\n\n");
 while(row = mysql_fetch_row(res))
 {
  printf("%s\t\t%s\n",row[0],row[1]); 
 }
 mysql_free_result(res);
 mysql_close(&mysql);
 return -1;
}
//end