/* * Return a malloc'd utf8-encoded char * of the provided environment * variable. The env_variable argument is assumed not to be UTF-8. Returns * NULL if no such environment variable. * * We'll pretty much swap out getenv's where convenient. Windows pretty * much doesn't want to do getenv once we do unicode */ char * our_getenv(char *env_variable) { #ifdef _WINDOWS TCHAR lptstr_env_variable[MAXPATH+1], *p; int i; for(i = 0; env_variable[i] && i < MAXPATH; i++) lptstr_env_variable[i] = env_variable[i]; lptstr_env_variable[i] = '\0'; if(p = _tgetenv(lptstr_env_variable)) return(lptstr_to_utf8(p)); else return(NULL); #else /* !_WINDOWS */ char *p, *utf8_p, *env_cpy; size_t len; if((p = getenv(env_variable)) != NULL){ /* all this when what we want is a cpystr */ utf8_p = fname_to_utf8(p); len = strlen(utf8_p); env_cpy = (char *)fs_get((len+1)*sizeof(char)); strncpy(env_cpy, utf8_p, len+1); env_cpy[len] = '\0'; return(env_cpy); } else return(NULL); #endif /* !_WINDOWS */ }
/* * Given a mime-type, return the file extension if there is one * * Returns: 1 on success, 0 on failure */ int mime_get_os_ext_from_mimetype(char *mime_type, char *file_ext, int file_ext_len) { #ifdef _WINDOWS int ret; LPTSTR x, mime_type_lpt, file_ext_lpt; mime_type_lpt = utf8_to_lptstr(mime_type); if(mime_type_lpt){ if(file_ext){ file_ext_lpt = (LPTSTR) fs_get(file_ext_len * sizeof(TCHAR)); file_ext_lpt[0] = '\0'; } else file_ext_lpt = NULL; } ret = mswin_reg_mime_ext(mime_type_lpt, file_ext_lpt, (size_t) file_ext_len); /* convert answer back to UTF-8 */ if(ret && file_ext_lpt && file_ext){ char *u; u = lptstr_to_utf8(file_ext_lpt); if(u){ strncpy(file_ext, u, file_ext_len); file_ext[file_ext_len-1] = '\0'; fs_give((void **) &u); } } if(mime_type_lpt) fs_give((void **) &mime_type_lpt); if(file_ext_lpt) fs_give((void **) &file_ext_lpt); return ret; #elif OSX_TARGET if(!mime_os_specific_access()) return(0); #ifdef AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER CFStringRef mime_ref = NULL, type_id_ref = NULL, ext_ref = NULL; if(!mime_type || !*mime_type) return 0; /* This for if we built on OS X >= 10.3 but run on < 10.3 */ if(&UTTypeCreatePreferredIdentifierForTag == NULL) return 0; if((mime_ref = CFStringCreateWithCString(NULL, mime_type, kCFStringEncodingASCII)) == NULL) return 0; if((type_id_ref = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mime_ref, NULL)) == NULL) return 0; if((ext_ref = UTTypeCopyPreferredTagWithClass(type_id_ref, kUTTagClassFilenameExtension)) == NULL) return 0; if((CFStringGetCString(ext_ref, file_ext, (CFIndex)file_ext_len - 1, kCFStringEncodingASCII)) == false) return 0; file_ext[file_ext_len - 1] = '\0'; return 1; #else return 0; #endif /* AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER */ #else return 0; #endif /* OSX_TARGET */ }
/* * Prompt for username and password */ int os_login_dialog (NETMBX *mb, char *user_utf8, int userlen, char *pwd_utf8, int pwdlen, int pwc, int fixuser, int *prespass) { DLGPROC dlgprc; HINSTANCE hInst; HWND hWnd; DLG_LOGINDATA dlgpw; LPTSTR user_lptstr, pwd_lptstr; char *tuser_utf8, *tpwd_utf8; mswin_killsplash(); hInst = (HINSTANCE) mswin_gethinstance (); hWnd = (HWND) mswin_gethwnd (); dlgpw.mb = mb; dlgpw.user = (LPTSTR)fs_get(userlen*sizeof(TCHAR)); user_lptstr = utf8_to_lptstr(user_utf8); _tcsncpy(dlgpw.user, user_lptstr, userlen - 1); dlgpw.user[userlen - 1] = '\0'; fs_give((void **) &user_lptstr); dlgpw.userlen = userlen; dlgpw.pwd = (LPTSTR)fs_get(pwdlen*sizeof(TCHAR)); pwd_lptstr = utf8_to_lptstr(pwd_utf8); _tcsncpy(dlgpw.pwd, pwd_lptstr, pwdlen - 1); dlgpw.pwd[pwdlen - 1] = '\0'; fs_give((void **) &pwd_lptstr); dlgpw.pwdlen = pwdlen; dlgpw.fixuser = fixuser; dlgpw.pwc = pwc; dlgpw.rv = 0; dlgprc = login_dialog_proc; DialogBoxParam (hInst, MAKEINTRESOURCE (ps_global->install_flag ? IDD_LOGINDLG2 : IDD_LOGINDLG), NULL, dlgprc, (LPARAM)&dlgpw); if(dlgpw.rv == 0){ tuser_utf8 = lptstr_to_utf8(dlgpw.user); if(tuser_utf8){ strncpy(user_utf8, tuser_utf8, userlen - 1); user_utf8[userlen - 1] = '\0'; fs_give((void **) &tuser_utf8); } tpwd_utf8 = lptstr_to_utf8(dlgpw.pwd); if(tpwd_utf8){ strncpy(pwd_utf8, tpwd_utf8, pwdlen - 1); pwd_utf8[pwdlen - 1] = '\0'; fs_give((void **) &tpwd_utf8); } if(prespass) (*prespass) = dlgpw.prespass; } return(dlgpw.rv); }
/* * Dialog proc to handle login * * Configures the dialog box on init and retrieves the settings on exit. */ BOOL CALLBACK __export config_dialog_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { DLG_CONFIGDATA *dlgcfg; BOOL ret = FALSE; int checked, def_rem_fldr = 1, def_diff_fldr = 0; switch (uMsg) { case WM_INITDIALOG: dlgcfg = (DLG_CONFIGDATA *)lParam; SetWindowLong (hDlg, WINDOW_USER_DATA, (LONG) dlgcfg); if(ps_global->install_flag) SetDlgItemText(hDlg, IDC_CONFTEXT, TEXT("Please specify where Alpine should create (or look for) your personal configuration file.")); SetDlgItemText(hDlg, IDC_CONFEFLDRNAME, TEXT("remote_pinerc")); if(*dlgcfg->confpath){ if(dlgcfg->confpath[0] == '{'){ LPTSTR tfldr, p, tfldr2, p2, user; tfldr = utf8_to_lptstr((LPSTR)(dlgcfg->confpath+1)); if(p = _tcschr(tfldr, '}')){ *p++ = '\0'; if(_tcscmp(TEXT("remote_pinerc"), p)){ SetDlgItemText(hDlg, IDC_CONFEFLDRNAME, p); def_diff_fldr = 1; } tfldr2 = _tcsdup(tfldr); for(p = tfldr, p2 = tfldr2; *p; p++) if(*p == '/' && !_tcsnicmp(p, TEXT("/user="******"remote_pinerc")); break; case IDC_CONFRRADIO: case IDC_CONFLRADIO: CheckRadioButton (hDlg, IDC_CONFRRADIO, IDC_CONFLRADIO, wParam); EnableWindow(GetDlgItem(hDlg, IDC_CONFFNTXT), wParam == IDC_CONFRRADIO ? 0 : 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFEFN), wParam == IDC_CONFRRADIO ? 0 : 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFBROWSE), wParam == IDC_CONFRRADIO ? 0 : 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFSRVRTXT), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFESERVER), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFUNTXT), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFEUSERNAME), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFDFLTFLDR), wParam == IDC_CONFRRADIO ? 1 : 0); if(wParam == IDC_CONFRRADIO && IsDlgButtonChecked(hDlg, IDC_CONFDFLTFLDR) == BST_UNCHECKED){ EnableWindow(GetDlgItem(hDlg, IDC_CONFFLDRTXT), 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFEFLDRNAME), 1); } else if(wParam == IDC_CONFLRADIO){ EnableWindow(GetDlgItem(hDlg, IDC_CONFFLDRTXT), 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFEFLDRNAME), 0); } break; case IDC_CONFBROWSE: if(1){ TCHAR fn[MAXPATH+1]; OPENFILENAME ofn; fn[0] = '\0'; /* Set up the BIG STRUCTURE. see mswin.c */ memset (&ofn, 0, sizeof(ofn)); ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = hDlg; ofn.lpstrFilter = NULL; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 0; ofn.lpstrFile = fn; ofn.nMaxFile = MAXPATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = TEXT("Select File"); ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = NULL; if (GetOpenFileName (&ofn)) { SetDlgItemText(hDlg, IDC_CONFEFN, fn); } } break; case IDOK: /* Retrieve the new username/passwd. */ if(IsDlgButtonChecked(hDlg, IDC_CONFDFLTSET) == BST_CHECKED) dlgcfg->setreg = 1; else dlgcfg->setreg = 0; if(IsDlgButtonChecked(hDlg, IDC_CONFRRADIO) == BST_CHECKED){ TCHAR lptstr_buf[MAXPATH+1]; char *utf8_srvr, *utf8_username, *utf8_fldrname; GetDlgItemText(hDlg, IDC_CONFESERVER, lptstr_buf, MAXPATH); lptstr_buf[MAXPATH] = '\0'; utf8_srvr = lptstr_to_utf8(lptstr_buf); removing_leading_and_trailing_white_space(utf8_srvr); if(!*utf8_srvr){ MessageBox(hDlg, TEXT("IMAP Server field empty"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_srvr) fs_give((void **) &utf8_srvr); return(TRUE); } GetDlgItemText(hDlg, IDC_CONFEUSERNAME, lptstr_buf, MAXPATH); lptstr_buf[MAXPATH] = '\0'; utf8_username = lptstr_to_utf8(lptstr_buf); removing_leading_and_trailing_white_space(utf8_username); if(IsDlgButtonChecked(hDlg, IDC_CONFDFLTFLDR) == BST_CHECKED){ utf8_fldrname = cpystr("remote_pinerc"); } else{ GetDlgItemText(hDlg, IDC_CONFEFLDRNAME, lptstr_buf, MAXPATH); lptstr_buf[MAXPATH] = '\0'; utf8_fldrname = lptstr_to_utf8(lptstr_buf); removing_leading_and_trailing_white_space(utf8_fldrname); if(!*utf8_fldrname){ MessageBox(hDlg, TEXT("Configuration Folder Name field empty"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_srvr) fs_give((void **) &utf8_srvr); if(utf8_username) fs_give((void **) &utf8_username); if(utf8_fldrname) fs_give((void **) &utf8_fldrname); return(TRUE); } } if((strlen(utf8_srvr) + strlen(utf8_username) + strlen(utf8_fldrname) + 11) > dlgcfg->confpathlen){ MessageBox(hDlg, TEXT("Config path too long"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_srvr) fs_give((void **) &utf8_srvr); if(utf8_username) fs_give((void **) &utf8_username); if(utf8_fldrname) fs_give((void **) &utf8_fldrname); return(TRUE); } snprintf(dlgcfg->confpath, dlgcfg->confpathlen, "{%s%s%s}%s", utf8_srvr, *utf8_username ? "/user="******"", utf8_username, utf8_fldrname); if(utf8_srvr) fs_give((void **) &utf8_srvr); if(utf8_username) fs_give((void **) &utf8_username); if(utf8_fldrname) fs_give((void **) &utf8_fldrname); } else{ TCHAR lptstr_fn[MAXPATH+1]; char *utf8_fn; GetDlgItemText(hDlg, IDC_CONFEFN, lptstr_fn, MAXPATH); lptstr_fn[MAXPATH] = '\0'; utf8_fn = lptstr_to_utf8(lptstr_fn); removing_leading_and_trailing_white_space(utf8_fn); if(!*utf8_fn){ MessageBox(hDlg, TEXT("Configuration File Name field empty"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_fn) fs_give((void **) &utf8_fn); return(TRUE); } if(strlen(utf8_fn) >= dlgcfg->confpathlen){ MessageBox(hDlg, TEXT("Config path too long"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_fn) fs_give((void **) &utf8_fn); return(TRUE); } strncpy(dlgcfg->confpath, utf8_fn, dlgcfg->confpathlen); dlgcfg->confpath[dlgcfg->confpathlen-1] = '\0'; if(utf8_fn) fs_give((void **) &utf8_fn); } EndDialog (hDlg, LOWORD(wParam)); dlgcfg->rv = 0; ret = TRUE; break; case IDCANCEL: dlgcfg->rv = 1; ret = TRUE; EndDialog (hDlg, LOWORD(wParam)); break; } break; } return (ret); }
/* * Dialog proc to handle login * * Configures the dialog box on init and retrieves the settings on exit. */ BOOL CALLBACK __export config_vars_dialog_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { DLG_CONFIGVARSDATA *dlgcv; BOOL ret = FALSE; int usepop = 0; char buf[2*MAXPATH+1], *p; int buflen = 2*MAXPATH; #define TCBUFLEN (2*MAXPATH) TCHAR tcbuf[TCBUFLEN+1]; LPTSTR tmp_lptstr; char *u; switch (uMsg) { case WM_INITDIALOG: dlgcv = (DLG_CONFIGVARSDATA *)lParam; SetWindowLong (hDlg, WINDOW_USER_DATA, (LONG) dlgcv); if(dlgcv->ivars->pname){ tmp_lptstr = utf8_to_lptstr(dlgcv->ivars->pname); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_PNAME, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(dlgcv->ivars->userid && dlgcv->ivars->domain){ snprintf(buf, sizeof(buf), "%.*s@%.*s", MAXPATH, dlgcv->ivars->userid, MAXPATH, dlgcv->ivars->domain); buf[buflen-1] = '\0'; tmp_lptstr = utf8_to_lptstr(buf); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_EMAILADR, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(dlgcv->ivars->inboxpath){ char *mbx; mbx = dlgcv->ivars->inboxpath; if(*mbx == '{' && (p = strindex(mbx, '}')) && ((*(p+1) == '\0') || !strucmp(p+1, "inbox"))){ char srvbuf[MAXPATH+1], tuser[MAXPATH+1]; int i, j, k; srvbuf[0] = '\0'; tuser[0] = '\0'; strncpy(buf, mbx+1, min(buflen, (int)(p - (mbx+1)))); buf[min(buflen-1, (int)(p - (mbx+1)))] = '\0'; for(i = 0, j = 0; buf[i] && j < MAXPATH; i++){ if(buf[i] == '/'){ if(!struncmp("/user="******"/pop3", buf+i, 5) && (!*(buf+5) || (*(buf+5) == '/'))){ usepop = 1; i += 4; } else srvbuf[j++] = buf[i]; } else srvbuf[j++] = buf[i]; } srvbuf[j] = '\0'; if(*srvbuf){ tmp_lptstr = utf8_to_lptstr(srvbuf); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_MSERVER, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(*tuser){ tmp_lptstr = utf8_to_lptstr(tuser); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_LOGIN, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } } else { tmp_lptstr = utf8_to_lptstr(mbx); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_MSERVER, tmp_lptstr); fs_give((void **) &tmp_lptstr); } if(*mbx != '{' && *mbx != '#') EnableWindow(GetDlgItem(hDlg, IDC_CFV_MSERVER), 0); } } CheckRadioButton (hDlg, IDC_CFV_IMAP, IDC_CFV_POP3, usepop ? IDC_CFV_POP3 : IDC_CFV_IMAP); if(dlgcv->ivars->smtpserver){ tmp_lptstr = utf8_to_lptstr(dlgcv->ivars->smtpserver); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_SMTPSERVER, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(dlgcv->ivars->defmailclient) CheckDlgButton(hDlg, IDC_CFV_DEFMAILER, BST_CHECKED); if(dlgcv->ivars->defnewsclient) CheckDlgButton(hDlg, IDC_CFV_DEFNEWSRDR, BST_CHECKED); return (1); break; case WM_COMMAND: dlgcv = (DLG_CONFIGVARSDATA *) GetWindowLong (hDlg, WINDOW_USER_DATA); switch (wParam) { case IDOK: /* personal name */ GetDlgItemText(hDlg, IDC_CFV_PNAME, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(dlgcv->ivars->pname) fs_give((void **)&dlgcv->ivars->pname); if(*u){ dlgcv->ivars->pname = u; u = NULL; } if(u) fs_give((void **) &u); } /* user-id and domain */ GetDlgItemText(hDlg, IDC_CFV_EMAILADR, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(p = strindex(u, '@')){ *(p++) = '\0'; if(dlgcv->ivars->userid) fs_give((void **)&dlgcv->ivars->userid); if(dlgcv->ivars->domain) fs_give((void **)&dlgcv->ivars->domain); if(*u){ dlgcv->ivars->userid = u; u = NULL; } if(*p) dlgcv->ivars->domain = cpystr(p); } else{ MessageBox(hDlg, TEXT("Invalid email address. Should be username@domain"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); return(TRUE); } if(u) fs_give((void **) &u); } /* inbox-path */ GetDlgItemText(hDlg, IDC_CFV_MSERVER, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(*u == '{' || *u == '#' || !IsWindowEnabled(GetDlgItem(hDlg, IDC_CFV_MSERVER))){ if(dlgcv->ivars->inboxpath) fs_give((void **)&dlgcv->ivars->inboxpath); dlgcv->ivars->inboxpath = u; u = NULL; } else if(*u){ char tsrvr[4*MAXPATH+1]; int tsrvrlen = 4*MAXPATH; if(dlgcv->ivars->inboxpath) fs_give((void **)&dlgcv->ivars->inboxpath); snprintf(tsrvr, sizeof(tsrvr), "{%s%s", u, IsDlgButtonChecked(hDlg, IDC_CFV_POP3) == BST_CHECKED ? "/pop3" : ""); if(u) fs_give((void **) &u); GetDlgItemText(hDlg, IDC_CFV_LOGIN, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(*u){ strncat(tsrvr, "/user="******"}inbox", sizeof(tsrvr)-strlen(tsrvr)-1); tsrvr[sizeof(tsrvr)-1] = '\0'; dlgcv->ivars->inboxpath = cpystr(tsrvr); } } if(u) fs_give((void **) &u); } /* smtp-server */ GetDlgItemText(hDlg, IDC_CFV_SMTPSERVER, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(dlgcv->ivars->smtpserver) fs_give((void **)&dlgcv->ivars->smtpserver); if(*u){ dlgcv->ivars->smtpserver = u; u = NULL; } if(u) fs_give((void **) &u); } dlgcv->ivars->defmailclient = (IsDlgButtonChecked(hDlg, IDC_CFV_DEFMAILER) == BST_CHECKED); dlgcv->ivars->defnewsclient = (IsDlgButtonChecked(hDlg, IDC_CFV_DEFNEWSRDR) == BST_CHECKED); EndDialog (hDlg, LOWORD(wParam)); dlgcv->rv = 0; ret = TRUE; break; case IDCANCEL: dlgcv->rv = 1; ret = TRUE; EndDialog (hDlg, LOWORD(wParam)); break; } break; } return (ret); }
/*---------------------------------------------------------------------- Fill in homedir, login, and fullname for the logged in user. These are all pointers to static storage so need to be copied in the caller. Args: ui -- struct pointer to pass back answers Result: fills in the fields ----*/ void get_user_info(struct user_info *ui) { #ifndef _WINDOWS struct passwd *unix_pwd; unix_pwd = getpwuid(getuid()); if(unix_pwd == NULL) { ui->homedir = (char *) malloc(sizeof(char)); ui->homedir[0] = '\0'; ui->login = (char *) malloc(sizeof(char)); ui->login[0] = '\0'; ui->fullname = (char *) malloc(sizeof(char)); ui->fullname[0] = '\0'; }else { char *s; size_t len; len = strlen(fname_to_utf8(unix_pwd->pw_dir)); ui->homedir = (char *) malloc((len+1) * sizeof(char)); snprintf(ui->homedir, len+1, "%s", fname_to_utf8(unix_pwd->pw_dir)); len = strlen(fname_to_utf8(unix_pwd->pw_name)); ui->login = (char *) malloc((len+1) * sizeof(char)); snprintf(ui->login, len+1, "%s", fname_to_utf8(unix_pwd->pw_name)); if((s = gcos_name(unix_pwd->pw_gecos, unix_pwd->pw_name)) != NULL){ len = strlen(fname_to_utf8(s)); ui->fullname = (char *) malloc((len+1) * sizeof(char)); snprintf(ui->fullname, len+1, "%s", fname_to_utf8(s)); } } #else /* _WINDOWS */ char buf[_MAX_PATH], *p, *q; TCHAR lptstr_buf[_MAX_PATH]; int len = _MAX_PATH; if(GetUserName(lptstr_buf, &len)) ui->login = lptstr_to_utf8(lptstr_buf); else ui->login = our_getenv("USERNAME"); if((p = our_getenv("HOMEDRIVE")) && (q = our_getenv("HOMEPATH"))) snprintf(buf, sizeof(buf), "%s%s", p, q); else snprintf(buf, sizeof(buf), "%c:\\", '@' + _getdrive()); if(p) free((void *)p); if(q) free((void *)q); ui->homedir = (char *) malloc((strlen(buf)+1) * sizeof(char)); if(ui->homedir){ strncpy(ui->homedir, buf, strlen(buf)); ui->homedir[strlen(buf)] = '\0'; } ui->fullname = (char *) malloc(sizeof(char)); if(ui->fullname) ui->fullname[0] = '\0'; #endif /* _WINDOWS */ }