Chapter 7 Developing Phase: Functions to Change for Interix
This chapter describes the important functions not supported in Microsoft® Interix that need to be changed or removed before the code compiles under Interix. This chapter also describes the availability of these functions in the Interix environment and their suitable replacement mechanisms. The functions discussed in the chapter include:
Math routines.
Regular expressions.
System and C library and other platform-specific application programming interfaces (APIs).
The following APIs are not supported by Interix and should not be used:
Wide character-type APIs
Multibyte character-type APIs (ISO/ANSI C and UNIX 98)
Long-long character type (64-bit integer) APIs
Message-handling APIs
Using the information in this chapter, you will be able to identify which modifications are required in your application code to ensure compatibility in the Interix environment. You will also be able to use suitable replacement mechanisms in such areas of your application as command line and shell APIs, string-related functions, and system and C library APIs.
Note Extended UNIX Code (EUC) characters are not supported by Interix and should not be used.
On This Page
Math Routines
Regular Expressions
System/C Library and Miscellaneous APIs
Math Routines
There are two sets of mathematical routines that are not supported by Interix. The first is the IEEE floating-point environment control routines, listed as follows:
fpclass
fpgetmask
fpgetround
fpgetsticky
fpsetmask
fpsetround
fpsetsticky
The second set of mathematical routines is the conversion routines, listed as follows:
decimal_to_double
decimal_to_extended
decimal_to_floating
decimal_to_quadruple
decimal_to_single
double_to_decimal
econvert
extended_to_decimal
fconvert
file_to_decimal
floating_to_decimal
func_to_decimal
gconvert
qeconvert
qfconvert
qgconvert
seconvert
quadruple_to_decimal
sfconvert
sgconvert
single_to_decimal
string_to_decimal
GMP is a portable library written in C for arbitrary precision arithmetic on integers, rational numbers, and floating-point numbers. You can use this library as the replacement mechanism for the previously described math routines. It aims to provide the fastest possible arithmetic for all applications that need higher precision than is directly supported by the basic C types.
Note You can download the GMP Library at https://interopsystems.com/InteropToolworks.htm.
Regular Expressions
Interix does not support some of the regular expression function calls. However, Table 7.1 lists functions that can be used to replace them.
Table 7.1. Regular Expression Function Calls Not Supported by Interix
Function Name |
Description |
Suggested Interix Replacement |
---|---|---|
re_comp |
Compiles and executes a regular expression and returns a character pointer to NULL on success. |
int regcomp (regex_t *preg, const char *pattern, int cflags); int regexec (const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); |
re_exec |
Compiles and executes a regular expression and returns an integer of 0 or 1 on success. |
int regcomp (regex_t *preg, const char *pattern, int cflags); int regexec (const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); |
Regcmp |
Compiles a regular expression and returns a pointer to a compiled form. |
int regcomp (regex_t *preg, const char *pattern, int cflags); |
regex |
Executes a regular expression. |
int regexec (const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); |
System/C Library and Miscellaneous APIs
There are many specialized and platform-specific APIs under this category. They are as follows:
Command-line and shell APIs
String-manipulation functions
BSD string and bit functions
Time-handling APIs
Other system/C library functions
Kernel calls
The kernel calls are not supported by Interix and should not be used.
Command-Line and Shell APIs
Interix does not support calls to obtain information about legal user shells from the /etc/shells file, nor does it support the implementation of the popt command-line parser.
To replace the UNIX functions with the Interix functions
Add to the /etc/shells file any additional legal shells that have been ported, such as /bin/bash. The /etc/shells file contains the legal Interix shells /bin/csh, /bin/ksh, /bin/sh, /bin/tcsh.
Write functions named endusershell, getusershell, and setusershell, as listed in Table 7.2.
Table 7.2. Functions to Implement the Command-Line and Shell APIs in Interix
Function name
Description
Suggested Interix Replacement
endusershell
Closes the file of legal user shells (/etc/shells).
Create endusershell routine to wrap the standard close() file routine. The prototype of the routine is as follows:
int close (int d)
getusershell
Gets legal user shells from /etc/shells.
Create getusershell routine to wrap the standard read() file routine.
The prototype of the routine is as follows:
ssize_t read (int d, void *buf, size_t nbytes)
popt
Parses command-line options.
Use getopt function.
The prototype of the routine is as follows:
int getopt (int argc, char * const *argv, const char *optstring)
setusershell
Rewinds the file of legal user shells (/etc/shells).
Create setusershell routine to wrap the standard lseek() file routine to set /etc/shells file back to beginning. The prototype of the routine is as follows:
off_t lseek (int fd, off_t offset, int whence)
String-Manipulation Functions
Interix supports most of the standard string-handling functions. Interix does not support the atoq, memmem, stpcpy, stpncpy, strfmon, strfry, strnlen, and strtows functions. Use the replacements listed in Table 7.3 for these functions.
Table 7.3. String-Handling Functions Not Supported by Interix
Function name |
Description |
Suggested Interix Replacement |
---|---|---|
atoq |
Converts string to a long long. |
strtoq() |
memmem |
Finds the start of the first occurrence of a substring in the memory area. |
char * strstr (const char *big, const char *little) |
stpcpy |
Copies the source string, including the terminating \0 character, to the destination. |
char * strcpy (char *dst, const char *src) |
stpncpy |
Copies at most num characters from the source string, including the terminating \0 character, to the destination. |
char * strncpy (char *dst, const char *src, size_t len) |
strfmon |
Formats specified amount according to the format specification and places the result in a character array of size max. |
int sprintf (char *str, const char *format ...) |
strfry |
Randomizes the contents of the string by using rand() to randomly swap characters in the string. |
No equivalent in Interix. Customized function can be written using rand(). |
strnlen |
Returns the number of characters in the string, not including the terminating \0 character, but at most maxien. |
size_t strlen (const char *s) |
BSD String and Bit Functions
String interfaces specified by ANSI/ISO C and found only in the Single UNIX Specification are in string.h. The contents of the strings.h file are listed in Table 7.4.
Table 7.4. String Interfaces in the strings.h File
Function name |
Description |
---|---|
bcmp |
Compares two strings. |
bcopy |
Copies at most n characters from src string to dest. |
bzero |
Places len value of 0 bytes in the string. |
ffs |
Finds the first bit set (beginning with the least significant bit) and returns the index of that bit. |
All the functions mentioned in the preceding table are supported in the Interix environment.
The Interix SDK (software development kit) also supports the BSD 4.4 strsep() and strcasestr() routines.
Time-Handling APIs
The time functions that are not supported by Interix and that cannot be implemented by some other Interix API or set of API calls are adjtime, adjtimex, ntp_adjtime, and tzsetwall.
Note You can download the rdate tool at https://www.interopsystems.com/tools/warehouse.htm.
The rdate function sets the date of the system from a remote Network Time Protocol (NTP) server or host.
Other System/C Library Functions
Interix does not support some of the system/C library functions. Table 7.5 lists these functions and their suggested replacements.
Table 7.5. System/C Library Functions Not Supported by Interix
Function Name |
Description |
Suggested Interix Replacement |
---|---|---|
on_exit |
Registers a function to be called at usual program termination. |
int atexit(void (*function)(void)) |
quotactl |
Manipulates disk quotas. |
No support or equivalent in Interix. |
stime |
Sets system time and date. |
int settimeofday (struct timeval *tp, void *tzp) |
Download
Get the UNIX Custom Application Migration Guide
Update Notifications
Sign up to learn about updates and new releases
Feedback