You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
577 lines
19 KiB
577 lines
19 KiB
/****************************************************************************
|
|
*
|
|
* Microsoft Confidential
|
|
* Copyright (c) Microsoft Corporation 1994
|
|
* All rights reserved
|
|
*
|
|
***************************************************************************/
|
|
|
|
#ifdef UNIX_FEATURE_ALIAS
|
|
|
|
#undef UNICODE
|
|
|
|
#include "inetcplp.h"
|
|
#include "shalias.h"
|
|
|
|
#include "mluisupp.h"
|
|
|
|
STDAPI RefreshGlobalAliasList();
|
|
|
|
#define GETALIASLIST(hDlg) ((LPALIASINFO )GetWindowLong(hDlg, DWL_USER))->aliasList
|
|
#define GETALIASDELLIST(hDlg) ((LPALIASINFO )GetWindowLong(hDlg, DWL_USER))->aliasDelList
|
|
|
|
BOOL CALLBACK AlEditDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
VOID WINAPI InitAliasListStyle(HWND hwndLV, DWORD dwView);
|
|
|
|
static TCHAR g_szAliasKey[] = TEXT("Software\\Microsoft\\Internet Explorer\\Unix\\Alias");
|
|
|
|
// InitListViewImageLists - creates image lists for a list view.
|
|
// Returns TRUE if successful, or FALSE otherwise.
|
|
// hwndLV - handle to the list view control.
|
|
BOOL WINAPI InitAliasListImageLists(HWND hwndLV)
|
|
{
|
|
HICON hiconItem; // icon for list view items
|
|
HIMAGELIST himlLarge; // image list for icon view
|
|
HIMAGELIST himlSmall; // image list for other views
|
|
|
|
// Create the full-sized and small icon image lists.
|
|
himlLarge = ImageList_Create(GetSystemMetrics(SM_CXICON),
|
|
GetSystemMetrics(SM_CYICON), TRUE, 1, 1);
|
|
himlSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
|
|
GetSystemMetrics(SM_CYSMICON), TRUE, 1, 1);
|
|
|
|
// Add an icon to each image list.
|
|
// note that IDI_WALLET has to live in inetcplc.rc because
|
|
// it's used by a localizable dialog, hence the MLGetHinst()
|
|
hiconItem = LoadIcon(MLGetHinst(), MAKEINTRESOURCE(IDI_WALLET));
|
|
ImageList_AddIcon(himlLarge, hiconItem);
|
|
ImageList_AddIcon(himlSmall, hiconItem);
|
|
DeleteObject(hiconItem);
|
|
|
|
// Assign the image lists to the list view control.
|
|
ListView_SetImageList(hwndLV, himlLarge, LVSIL_NORMAL);
|
|
ListView_SetImageList(hwndLV, himlSmall, LVSIL_SMALL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// InitListViewItems - adds items and subitems to a list view.
|
|
// Returns TRUE if successful, or FALSE otherwise.
|
|
// hwndLV - handle to the list view control.
|
|
// pfData - text file containing list view items with columns
|
|
// separated by semicolons.
|
|
BOOL WINAPI InitAliasListItems(HWND hwndLV, HDPA aliasList)
|
|
{
|
|
PSTR pszEnd;
|
|
int iItem;
|
|
int iSubItem;
|
|
LVITEM lvi;
|
|
|
|
// Initialize LVITEM members that are common to all items.
|
|
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
|
|
lvi.state = 0; lvi.stateMask = 0;
|
|
lvi.pszText = LPSTR_TEXTCALLBACK; // app. maintains text
|
|
lvi.iImage = 0; // image list index
|
|
|
|
int aliasCount = DPA_GetPtrCount( aliasList );
|
|
|
|
for (int i = 0; i< aliasCount; i++)
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasList, i );
|
|
|
|
// Initialize item-specific LVITEM members.
|
|
lvi.iItem = i;
|
|
lvi.iSubItem = 0;
|
|
lvi.lParam = (LPARAM) NULL; // item data
|
|
// Add the item.
|
|
ListView_InsertItem(hwndLV, &lvi);
|
|
|
|
// Initialize item-specific LVITEM members.
|
|
ListView_SetItemText(hwndLV, i, 0, (TCHAR*)GetAliasName(ptr));
|
|
ListView_SetItemText(hwndLV, i, 1, (TCHAR*)GetAliasUrl(ptr));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// InitListViewColumns - adds columns to a list view control.
|
|
// Returns TRUE if successful, or FALSE otherwise.
|
|
// hwndLV - handle to the list view control.
|
|
BOOL WINAPI InitAliasListColumns(HWND hwndLV)
|
|
{
|
|
TCHAR g_achTemp[256]; // temporary buffer
|
|
LVCOLUMN lvc;
|
|
int iCol;
|
|
|
|
// Initialize the LVCOLUMN structure.
|
|
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
lvc.fmt = LVCFMT_LEFT;
|
|
lvc.pszText = g_achTemp;
|
|
|
|
// Add the columns.
|
|
for (iCol = 0; iCol < ALIASLIST_COLUMNS; iCol++)
|
|
{
|
|
lvc.iSubItem = iCol;
|
|
lvc.cx = 100 + (iCol*150);
|
|
MLLoadString(IDS_FIRSTCOLUMN + iCol,
|
|
g_achTemp, sizeof(g_achTemp));
|
|
if (ListView_InsertColumn(hwndLV, iCol, &lvc) == -1)
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// SetView - sets a list view's window style to change the view.
|
|
// hwndLV - handle to the list view control.
|
|
// dwView - value specifying a view style.
|
|
VOID WINAPI InitAliasListStyle(HWND hwndLV, DWORD dwView)
|
|
{
|
|
// Get the current window style.
|
|
DWORD dwStyle = ListView_GetExtendedListViewStyle(hwndLV);
|
|
|
|
ListView_SetExtendedListViewStyle( hwndLV, (dwStyle|dwView) );
|
|
// SetWindowLong(hwndLV, GWL_EXSTYLE, (dwStyle | dwView));
|
|
}
|
|
|
|
// AliasDel - deletes alias from active list and moves it to the
|
|
// del list to be delete later.
|
|
// hDlg - handle of the propertysheet dialog.
|
|
BOOL WINAPI AliasDel( HWND hDlg )
|
|
{
|
|
int index = 0, iItem = 0;
|
|
HWND lb = GetDlgItem( hDlg, IDC_ALIAS_LIST );
|
|
HDPA aliasList = GETALIASLIST(hDlg);
|
|
HDPA aliasDelList = GETALIASDELLIST(hDlg);
|
|
BOOL fAsked = FALSE;
|
|
BOOL fChanged = FALSE;
|
|
int count = ListView_GetItemCount(lb);
|
|
|
|
// Get the selection from the Listview and remove it from the
|
|
// active alias list, add it to the aliaslist to be deleted.
|
|
while( (iItem = ListView_GetNextItem( lb, -1, LVNI_SELECTED ) ) != -1 )
|
|
{
|
|
TCHAR str[MAX_URL_STRING]; *str = TEXT('\0');
|
|
|
|
if( !fAsked )
|
|
{
|
|
TCHAR question[MAX_PATH];
|
|
|
|
wsprintf( question, "Are you Sure you want to delete the selected items?");
|
|
if( MessageBox( GetParent(hDlg), question, TEXT("Delete Alias"), MB_YESNO ) != IDYES )
|
|
return FALSE;
|
|
|
|
fAsked = TRUE;
|
|
}
|
|
|
|
// if( !ListView_GetCheckState(lb, iItem) ) continue;
|
|
|
|
ListView_GetItemText(lb, iItem, 0, str, MAX_URL_STRING );
|
|
if(*str)
|
|
{
|
|
if( (index = FindAliasIndex(aliasList, str) ) != -1 )
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasList, index );
|
|
if( ptr )
|
|
{
|
|
CAlias *pAlias = (CAlias *)DPA_DeletePtr( aliasList, index );
|
|
|
|
// Add to List of deleted entries
|
|
DPA_InsertPtr( aliasDelList, 0x7FFF, pAlias );
|
|
ListView_DeleteItem(lb, iItem);
|
|
fChanged = TRUE;
|
|
LocalFree( str );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( fChanged )
|
|
{
|
|
InitAliasDialog( hDlg, NULL, FALSE );
|
|
PropSheet_Changed(GetParent(hDlg),hDlg);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// AliasEdit - Called in response to the Edit button pressed.
|
|
// hDlg - Handle to the property sheet
|
|
BOOL WINAPI AliasEdit( HWND hDlg )
|
|
{
|
|
CAlias * ptr = GetCurrentAlias( hDlg );
|
|
HDPA aliasDelList = GETALIASDELLIST(hDlg);
|
|
|
|
if( ptr )
|
|
{
|
|
CAlias *ptrOld = (CAlias *)CreateAlias( (LPTSTR)GetAliasName(ptr) );
|
|
ALIASEDITINFO aliasEditInfo = { GETALIASLIST(hDlg), ptr, hDlg, EDIT_ALIAS };
|
|
if(MLDialogBoxParamWrap( MLGetHinst(), MAKEINTRESOURCE(IDD_ALIAS_EDIT), hDlg, AlEditDlgProc, (LPARAM)&aliasEditInfo ) == 2 )
|
|
{
|
|
// Add old alias to del list if alias name changes.
|
|
LPCTSTR aliasNew = GetAliasName(ptr);
|
|
LPCTSTR aliasOld = GetAliasName(ptrOld);
|
|
|
|
if( StrCmp( aliasNew, aliasOld) )
|
|
DPA_InsertPtr( aliasDelList, 0x7FFF, ptrOld );
|
|
else
|
|
DestroyAlias( ptrOld );
|
|
|
|
InitAliasDialog( hDlg, ptr, FALSE );
|
|
PropSheet_Changed(GetParent(hDlg),hDlg);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// AliasEdit - Called in response to the Add button pressed.
|
|
// hDlg - Handle to the property sheet
|
|
BOOL WINAPI AliasAdd( HWND hDlg)
|
|
{
|
|
CAlias * ptr = (CAlias *)CreateAlias( TEXT("") );
|
|
|
|
if ( ptr )
|
|
{
|
|
ALIASEDITINFO aliasEditInfo = { GETALIASLIST(hDlg), ptr, hDlg, ADD_ALIAS };
|
|
if(MLDialogBoxParamWrap( MLGetHinst(), MAKEINTRESOURCE(IDD_ALIAS_EDIT), hDlg, AlEditDlgProc, (LPARAM)&aliasEditInfo ) == 2)
|
|
{
|
|
InitAliasDialog( hDlg, ptr, FALSE );
|
|
PropSheet_Changed(GetParent(hDlg),hDlg);
|
|
}
|
|
DestroyAlias(ptr);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// GetCurrentAlias - returns currently selected alis from the listview
|
|
// Returns - Selected alias
|
|
// hDlg - handle to the property sheet.
|
|
CAlias * GetCurrentAlias( HWND hDlg )
|
|
{
|
|
int index = 0, iItem = 0;
|
|
HDPA aliasList = GETALIASLIST( hDlg );
|
|
HWND lb = GetDlgItem( hDlg, IDC_ALIAS_LIST );
|
|
|
|
if( ListView_GetSelectedCount(lb) == 1 &&
|
|
( (iItem = ListView_GetNextItem( lb, -1, LVNI_SELECTED ) ) != -1 ) )
|
|
{
|
|
TCHAR str[MAX_URL_STRING]; *str = TEXT('\0');
|
|
ListView_GetItemText(lb, iItem, 0, str, MAX_URL_STRING );
|
|
if(*str)
|
|
{
|
|
if( (index = FindAliasIndex(aliasList, str) ) != -1 )
|
|
{
|
|
CAlias * ptr = (CAlias *)DPA_FastGetPtr( aliasList, index );
|
|
return ptr;
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
// InitAliasDialog - Initalizes the aliases dialog
|
|
// Returns - TRUE if succeeded/FALSE if failed.
|
|
// hDlg - handle to the property sheet.
|
|
// fFullInit - Init listview columns/styles/etc
|
|
BOOL FAR PASCAL InitAliasDialog(HWND hDlg, CAlias * current, BOOL fFullInit)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
HKEY hKey;
|
|
HWND listBox = GetDlgItem( hDlg, IDC_ALIAS_LIST );
|
|
TCHAR * displayString;
|
|
|
|
// Allocate memory for a structure which will hold all the info
|
|
// gathered from this page
|
|
//
|
|
LPALIASINFO pgti = (LPALIASINFO)GetWindowLong(hDlg, DWL_USER);
|
|
pgti->fInternalChange = FALSE;
|
|
|
|
SendMessage( listBox, LVM_DELETEALLITEMS, 0, 0L );
|
|
|
|
// Initailize ListView
|
|
if( fFullInit )
|
|
{
|
|
SendDlgItemMessage( hDlg, IDC_ALIAS_EDIT, EM_LIMITTEXT, 255, 0 );
|
|
SendDlgItemMessage( hDlg, IDC_URL_EDIT, EM_LIMITTEXT, MAX_URL_STRING-1, 0 );
|
|
// InitAliasListStyle(listBox, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT );
|
|
InitAliasListStyle(listBox, LVS_EX_FULLROWSELECT );
|
|
InitAliasListImageLists(listBox);
|
|
InitAliasListColumns(listBox);
|
|
}
|
|
|
|
InitAliasListItems(listBox, GETALIASLIST(hDlg));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// AliasApply - This function is called in response to pressing the apply/ok
|
|
// button on the property sheet dialog.
|
|
void AliasApply(HWND hDlg)
|
|
{
|
|
HDPA aliasDelList = GETALIASDELLIST(hDlg);
|
|
HDPA aliasList = GETALIASLIST(hDlg);
|
|
|
|
ASSERT(aliasList);
|
|
|
|
if( aliasDelList )
|
|
{
|
|
int count = DPA_GetPtrCount( aliasDelList );
|
|
|
|
for(int i=count-1; i>=0; i--)
|
|
{
|
|
CAlias * pAlias = (CAlias *)DPA_DeletePtr( aliasDelList, i );
|
|
if(pAlias)
|
|
{
|
|
pAlias->Delete();
|
|
DestroyAlias(pAlias);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Save the currently changed aliases
|
|
SaveAliases( aliasList );
|
|
|
|
// Refresh Global Alias List.
|
|
RefreshGlobalAliasList();
|
|
}
|
|
|
|
// AliasDlgProc - Alias PropertySheet dialog Proc
|
|
// Returns BOOL
|
|
// hDlg - Handle to the property sheet window
|
|
// wParam, lParam - Word/Long param
|
|
BOOL CALLBACK AliasDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// get our tab info structure
|
|
LPALIASINFO pgti;
|
|
|
|
if (uMsg == WM_INITDIALOG)
|
|
{
|
|
// Allocate memory for a structure which will hold all the info
|
|
// gathered from this page
|
|
//
|
|
LPALIASINFO pgti = (LPALIASINFO)LocalAlloc(LPTR, sizeof(tagALIASINFO));
|
|
if (!pgti)
|
|
{
|
|
EndDialog(hDlg, 0);
|
|
return FALSE;
|
|
}
|
|
|
|
pgti->hDlg = hDlg;
|
|
|
|
pgti->fInternalChange = FALSE;
|
|
SetWindowLong(hDlg, DWL_USER, (LPARAM)pgti);
|
|
|
|
if((pgti->aliasList = DPA_Create(4)) != (HDPA)NULL )
|
|
{
|
|
pgti->aliasDelList = DPA_Create(4);
|
|
LoadAliases( pgti->aliasList );
|
|
|
|
// Initailize dialog
|
|
if( InitAliasDialog(hDlg, NULL, TRUE) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
TCHAR szTitle[MAX_PATH];
|
|
MLLoadString(IDS_ERROR_REGISTRY_TITLE, szTitle, sizeof(szTitle));
|
|
MessageBox( GetParent(hDlg), TEXT("Cannot read aliases from registry."), szTitle, MB_OK );
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
return FALSE;
|
|
}
|
|
else
|
|
pgti = (LPALIASINFO)GetWindowLong(hDlg, DWL_USER);
|
|
|
|
if (!pgti)
|
|
return FALSE;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_NOTIFY:
|
|
{
|
|
NMHDR *lpnm = (NMHDR *) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case NM_DBLCLK:
|
|
if(lpnm->idFrom == IDC_ALIAS_LIST)
|
|
AliasEdit( pgti->hDlg );
|
|
break;
|
|
case PSN_QUERYCANCEL:
|
|
case PSN_KILLACTIVE:
|
|
case PSN_RESET:
|
|
SetWindowLong( hDlg, DWL_MSGRESULT, FALSE );
|
|
return TRUE;
|
|
|
|
case PSN_APPLY:
|
|
AliasApply(hDlg);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_ALIAS_ADD:
|
|
AliasAdd( pgti->hDlg ); break;
|
|
case IDC_ALIAS_EDIT:
|
|
AliasEdit( pgti->hDlg ); break;
|
|
case IDC_ALIAS_DEL:
|
|
AliasDel( pgti->hDlg ); break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
// Delete registry information
|
|
if( pgti->aliasList )
|
|
{
|
|
FreeAliases(pgti->aliasList);
|
|
DPA_Destroy(pgti->aliasList);
|
|
}
|
|
|
|
if( pgti->aliasDelList )
|
|
{
|
|
FreeAliases(pgti->aliasDelList);
|
|
DPA_Destroy(pgti->aliasDelList);
|
|
}
|
|
|
|
if (pgti)
|
|
LocalFree(pgti);
|
|
|
|
SetWindowLong(hDlg, DWL_USER, (LONG)NULL); // make sure we don't re-enter
|
|
break;
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL CALLBACK AlEditDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CAlias * pAlias;
|
|
LPALIASEDITINFO pAliasInfo;
|
|
|
|
if (uMsg == WM_INITDIALOG)
|
|
{
|
|
TCHAR achTemp[256];
|
|
pAliasInfo = (LPALIASEDITINFO)lParam;
|
|
pAlias = pAliasInfo->alias;
|
|
|
|
if( !lParam )
|
|
{
|
|
EndDialog(hDlg, 0);
|
|
return FALSE;
|
|
}
|
|
|
|
SendDlgItemMessage( hDlg, IDC_ALIAS_EDIT, WM_SETTEXT, 0, (LPARAM)GetAliasName(pAlias));
|
|
SendDlgItemMessage( hDlg, IDC_URL_EDIT, WM_SETTEXT, 0, (LPARAM)GetAliasUrl(pAlias));
|
|
|
|
if( pAliasInfo->dwFlags & EDIT_ALIAS )
|
|
{
|
|
// EnableWindow( GetDlgItem(hDlg, IDC_ALIAS_EDIT ), FALSE );
|
|
MLLoadString(IDS_TITLE_ALIASEDIT,
|
|
achTemp, sizeof(achTemp));
|
|
SendMessage( hDlg, WM_SETTEXT, 0, (LPARAM)achTemp);
|
|
}
|
|
else
|
|
{
|
|
MLLoadString(IDS_TITLE_ALIASADD,
|
|
achTemp, sizeof(achTemp));
|
|
SendMessage( hDlg, WM_SETTEXT, 0, (LPARAM)achTemp);
|
|
}
|
|
|
|
SetWindowLong(hDlg, DWL_USER, (LPARAM)pAliasInfo);
|
|
EnableWindow( GetDlgItem(hDlg, IDOK), FALSE );
|
|
}
|
|
else
|
|
pAliasInfo = (LPALIASEDITINFO)GetWindowLong(hDlg, DWL_USER);
|
|
|
|
if (!pAlias)
|
|
return FALSE;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_COMMAND:
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam))
|
|
{
|
|
case IDC_ALIAS_EDIT:
|
|
case IDC_URL_EDIT:
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE)
|
|
{
|
|
EnableWindow( GetDlgItem(hDlg, IDOK), TRUE );
|
|
}
|
|
break;
|
|
case IDOK:
|
|
{
|
|
if( pAliasInfo )
|
|
{
|
|
TCHAR alias[MAX_URL_STRING];
|
|
TCHAR szurl[MAX_URL_STRING];
|
|
SendDlgItemMessage( hDlg, IDC_ALIAS_EDIT, WM_GETTEXT, MAX_URL_STRING, (LPARAM)alias );
|
|
SendDlgItemMessage( hDlg, IDC_URL_EDIT, WM_GETTEXT, MAX_URL_STRING, (LPARAM)szurl );
|
|
|
|
EatSpaces( alias );
|
|
|
|
if( !*alias )
|
|
{
|
|
EndDialog( hDlg, 1 );
|
|
break;
|
|
}
|
|
|
|
if( pAliasInfo->dwFlags & ADD_ALIAS && *alias)
|
|
{
|
|
if(AddAliasToList( pAliasInfo->aliasList, alias, szurl, hDlg ))
|
|
EndDialog( hDlg, 2);
|
|
}
|
|
else if( pAliasInfo->dwFlags & EDIT_ALIAS )
|
|
{
|
|
CAlias * ptr = pAliasInfo->alias;
|
|
if( StrCmp(GetAliasName(ptr), alias) )
|
|
if(FindAliasIndex( pAliasInfo->aliasList, alias ) != -1)
|
|
{
|
|
MessageBox( hDlg,
|
|
TEXT("Alias with same name already exists"),
|
|
TEXT("Edit Alias"),
|
|
MB_OK|MB_ICONSTOP );
|
|
break;
|
|
}
|
|
SetAliasInfo(ptr, alias, szurl);
|
|
EndDialog( hDlg, 2);
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
EndDialog( hDlg, 1 );
|
|
break;
|
|
}
|
|
case IDCANCEL:
|
|
{
|
|
EndDialog( hDlg, 1 );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
SetWindowLong(hDlg, DWL_USER, (LONG)NULL);
|
|
break;
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
#endif /* UNIX_FEATURE_ALIAS */
|